无法使用 segue 将值从 FirstVC 传递到 SecondVC

Can't pass value from FirstVC to SecondVC using segue

我有两个 ViewControllers 通过 Show segue 连接。我需要将 NSSlider 的值从 ViewController 传递到 SecondViewCotroller

因此,在 ViewController 中移动滑块会在 SecondViewController 中更新变量。

如何更新 imagesQty 变量的值?

// FIRST VIEW CONTROLLER

import Cocoa

class ViewController: NSViewController {

    @IBOutlet weak var slider: NSSlider!
    @IBOutlet weak var photosLabel: NSTextField!

    @IBAction func segueData(_ sender: NSSlider) {
        photosLabel.stringValue = String(slider.intValue) + " photos"
        self.performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "SegueIdentifierForSecondVC"), sender: slider)
    }

    func prepare(for segue: NSStoryboardSegue, sender: NSSlider?) {
        if segue.identifier!.rawValue == "SegueIdentifierForSecondVC" {
            if let secondViewController =
            segue.destinationController as? SecondViewController {
                secondViewController.imagesQty = slider.integerValue
            }
        }
    }
}

// SECOND VIEW CONTROLLER

import Cocoa

class SecondViewController: NSViewController {

    var imagesQty = 30  

    override func viewWillAppear() {

    super.viewWillAppear()
    self.view.wantsLayer = true

    print("viewWillAppear – Qty:\(imagesQty)")

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

    let url = URL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("Desktop/ArrayOfElements")
    do {
        let fileURLs = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil, options: [.skipsHiddenFiles]).reversed()
        let photos = fileURLs.filter { [=11=].pathExtension == "jpg" }

        for view in arrayOfViews {
            //"imagesQty" is here
            let i = Int(arc4random_uniform(UInt32(imagesQty-1)))
            let image = NSImage(data: try Data(contentsOf: photos[i]))
            view.image = image
            view.imageScaling = .scaleNone
        }
    } catch {
        print(error)
    }
}

您无法更改该值,因为 var 是在函数中定义的,而不是在 class 中定义的。

将您的变量设置为 class 属性 它应该可以工作。

class SecondViewController: UIViewController {

var imagesQty: Int = 30

...

}

首先,NSStoryboardSegue.Identifier 的目的和好处是创建一个能够避免文字的扩展。

extension NSStoryboardSegue.Identifier {
    static let secondVC = NSStoryboardSegue.Identifier("SegueIdentifierForSecondVC")
}

那你可以写

self.performSegue(withIdentifier: .secondVC, sender: slider)

if segue.identifier! == .secondVC { ...

发生此错误是因为 imagesQty 是在 viewWillAppear 中声明的,而不是在 class 的顶层声明的。

改为

class SecondViewController: NSViewController {

    var imagesQty = 30 // Int is inferred

    // override func viewWillAppear() {
    //     super.viewWillAppear()
    // }
}

还有一个错误:prepare(for segue的签名是错误的。必须是

func prepare(for segue: NSStoryboardSegue, sender: Any?) {