无法使用 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的主要内容,如果未能解决你的问题,请参考以下文章