Macos 如何使用NSSlider更新NSImageView?

Macos 如何使用NSSlider更新NSImageView?,macos,swift4,nsview,nsslider,Macos,Swift4,Nsview,Nsslider,我在FirstViewController中有一个NSSlider。我在SecondViewController中有12个nsimageview。我想在第一个窗口中移动一个滑块,在第二个窗口中移动这12个视图中的图像 如何在每次移动滑块时更新这些nsimageview SecondViewController var imagesQty = 100 override func viewWillAppear() { super.viewWillAppear() //let

我在
FirstViewController
中有一个
NSSlider
。我在
SecondViewController
中有12个
nsimageview
。我想在第一个窗口中移动一个滑块,在第二个窗口中移动这12个视图中的图像

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

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 
        }
    }
}
视图控制器

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 
        }
    }
}

首先要注意,滑块的任何移动都会执行一个新的序列。为了避免这种情况,请声明一个布尔属性,该属性在第一次执行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
        }
    }

...


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

您能告诉我您花了多少年的时间来获得这样的编程水平吗?大约半年的时间来了解面向对象编程的基础知识。我读了一本书和Objective-C语言指南。我从来不想在不知道发生了什么的情况下复制和粘贴代码。这就像一门真正的语言:如果你能流利地说这门语言,你会有更多的乐趣。然后花了大约一年的时间了解最常用的框架(
Foundation
AppKit
,后来的
UIKit
)。然后转用Swift是一小步。但我还是读了整个语言指南。