无法使用 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?) {
我有两个 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?) {