【问题标题】:How to update NSImageView using NSSlider?如何使用 NSSlider 更新 NSImageView?
【发布时间】:2018-09-06 12:59:26
【问题描述】:

我在FirstViewController 中有一个NSSlider。我在SecondViewController 中有 12 个NSImageViews。我想在第一个窗口中移动一个滑块,并在第二个窗口中的这 12 个视图中随机播放图像。

每次移动滑块时如何更新这些NSImageViews

SecondViewController

var imagesQty = 100  

override func viewWillAppear() {

    super.viewWillAppear()

    //let arrayOfViews: [NSImageView] = [view01,...view12]

    for view in arrayOfViews {
        let i = Int(arc4random_uniform(UInt32(imagesQty-1)))
        let image = NSImage(data: try Data(contentsOf: photos[i]))
        view.image = image
    }
}

视图控制器

@IBOutlet weak var slider: NSSlider!

@IBAction func segueData(_ sender: NSSlider) {
    self.performSegue(withIdentifier: .secondVC, sender: slider)
}
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
    if segue.identifier! == .secondVC {
        if let secondViewController =
            segue.destinationController as? SecondViewController {
            secondViewController?.imagesQty = slider.integerValue 
        }
    }
}

【问题讨论】:

    标签: macos swift4 nsview nsslider


    【解决方案1】:

    首先要知道,滑块的任何移动都会执行新的转场。为了避免声明一个布尔属性,该属性在第一次执行 segue 时设置,并且可以在第二个视图控制器被关闭后重置。

    要更新第二个视图控制器中的值,请保留引用并调用方法

    实际上使用此代码您不需要滑块IBOutlet

    class ViewController: NSViewController {
    
    
        var secondControllerIsPresented = false
        var secondController : SecondViewController?
    
    ...
    
    
        @IBAction func segueData(_ sender: NSSlider) {
    
            if !secondControllerIsPresented {
                self.performSegue(withIdentifier: .secondVC, sender: sender)
                secondControllerIsPresented = true
            } else {
                secondController?.updateArray(value: sender.integerValue)
            }
        }
    
        override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
            if let identifier = segue.identifier, identifier == .secondVC {
                let secondViewController = segue.destinationController as! SecondViewController
                secondController = secondViewController
                let slider = sender as! NSSlider
                secondViewController.imagesQty = slider.integerValue
            }
        }
    
    ...
    

    class SecondViewController: NSViewController {
    
    ...
    
    
       func updateArray(value : Int) {
           print(value)
       }
    

    老实说,我会使用一个按钮来执行 segue 并将滑块移动到第二个视图控制器中。要随机播放数组,请使用 Array 扩展名并作为视图使用 NSCollectionView 而不是一堆图像视图

    【讨论】:

    • 你能告诉我你花了多少年才达到这样的编程水平?
    • 大约半年时间了解面向对象编程的基础知识。我读了一本书和 Objective-C 语言指南。我从来不想在不知道发生了什么的情况下将代码复制和粘贴在一起。这就像一门真正的语言:如果你说一口流利的语言,你会更有乐趣。然后大约一年时间了解最常用的框架(FoundationAppKit、后来的UIKit)。然后切换到 Swift 只是一小步。但我再次阅读整个语言指南。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2012-03-07
    相关资源
    最近更新 更多