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

Posted

技术标签:

【中文标题】无法使用 segue 将值从 FirstVC 传递到 SecondVC【英文标题】:Can't pass value from FirstVC to SecondVC using segue 【发布时间】:2018-03-27 16:28:46 【问题描述】:

我有两个通过Show segue 连接的ViewControllers。我需要将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  $0.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)
    

【问题讨论】:

【参考方案1】:

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

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

那你就可以写了

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

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

出现此错误是因为imagesQty 是在viewWillAppear 中声明的,而不是在类的顶层。

改成

class SecondViewController: NSViewController 

    var imagesQty = 30 // Int is inferred

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

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

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

【讨论】:

我修复了代码。我正在移动滑块并且值没有改变。也许还有别的? 动作连接了吗?是否执行了segue?第二个视图控制器的类是否设置为SecondViewController 动作已连接(从滑块到控制器,看图)。类是 SecondViewController。如何检查是否执行了segue? 设置断点,插入print行。请查看更新后的答案。 override func prepare(for segue: NSStoryboardSegue, sender: Any?) 已设置【参考方案2】:

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

让你的 var 成为一个类属性,它应该可以工作。

class SecondViewController: UIViewController 

var imagesQty: Int = 30

...


【讨论】:

以上是关于无法使用 segue 将值从 FirstVC 传递到 SecondVC的主要内容,如果未能解决你的问题,请参考以下文章

无法将值从一个意图传递到另一个意图

无法正确地将值从父母传递给孩子和孩子传递给父母

无法将值从组件传递到模板

无法通过命令将值从视图传递到viewmodel

Apache Shiro,无法将值从登录表单传递到支持 bean

如何使用会话将值从一个php页面传递到另一个页面