Segue 在 macOS 中不起作用
Segue doesn't work in macOS
我在 ViewController
中有 NSSlider
,它必须通过 Show
类型的 segue 将整数值传递给 SecondViewController
,并在我每次移动它时更新视图。因此,我移动滑块以交互方式随机播放 SecondViewController
的 window 中的图像。
我花了一周的时间尝试实现 NSSlider
的这种行为,但我失败了。也许我在 Interface Builder 中建立了错误的连接。我不知道。如果您知道使 NSSlider
用于随机播放图像的任何其他方法,请告诉我。
有关详细信息,请参阅更新的答案。
非常感谢任何帮助!!!
ViewController
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var slider: NSSlider!
@IBAction func passData(_ sender: NSSlider) {
func prepare(for segue: NSStoryboardSegue, sender: NSSlider?) {
if segue.identifier!.rawValue == "SegueIdentifierForSecondVC" {
if let secondViewController = segue.destinationController as? SecondViewController {
secondViewController.imagesQuantity = slider.intValue
}
}
}
}
}
第二ViewController
import Cocoa
class SecondViewController: NSViewController {
var imagesQuantity: Int = 1
override func viewWillAppear() {
super.viewWillAppear()
print(imagesQuantity)
}
}
但是没用。我的代码有什么问题?
感谢任何帮助。
UPDATED ANSWER
查看控制器
import Cocoa
extension NSStoryboardSegue.Identifier {
static let secondVC = NSStoryboardSegue.Identifier("SegueIdentifierForSecondVC")
}
class ViewController: NSViewController {
@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
}
}
}
}
第二个视图控制器
import Cocoa
class SecondViewController: NSViewController {
var imagesQty = 30
override func viewWillAppear() {
super.viewWillAppear()
//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 { [=13=].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
}
} catch {
print(error)
}
}
}
@IBAction func passData(_ sender: NSSlider) {
func prepare(for segue: NSStoryboardSegue, sender: NSSlider?) {
if segue.identifier!.rawValue == "SegueIdentifierForSecondVC" {
if let secondViewController = segue.destinationController as? SecondViewController {
secondViewController.imagesQuantity = slider.intValue
}
}
}
}
应该是
@IBAction func passData(_ sender: NSSlider) {
}
func prepare(for segue: NSStoryboardSegue, sender: NSSlider?) {
if segue.identifier!.rawValue == "SegueIdentifierForSecondVC" {
if let secondViewController = segue.destinationController as? SecondViewController {
secondViewController.imagesQuantity = slider.intValue
}
}
}
因为你有一个方法在另一个里面,而它们应该是一个接一个的。
现在,您需要修改passData(_sender:)
。你需要在里面调用performSegue(withIdentifier:sender)
里面的
如果会在某个时间触发 prepare(for:sender:)
。我说 "some point" 是因为在调用 prepare(for:sender:)
之前至少有一个 shouldPerformSegue(withIdentifier:sender:)
调用。
所以现在做:
@IBAction func passData(_ sender: NSSlider) {
self.performSegue(withIdentifier: "SegueIdentifierForSecondVC" sender:nil)
}
错误不在代码中。
您必须将 segue 连接到 ViewController
,而不是 WindowController
.
将滑块操作连接到 IBAction
(不是连接到 segue)和从 ViewController
到 SecondViewController
的连接(不是来自滑块)。
如果第二个视图控制器的class是SecondViewController
,它应该在window控制器中指明。 SecondVC
从哪里来?
再次建议创建 NSStoryboardSegue.Identifier
的扩展
extension NSStoryboardSegue.Identifier {
static let secondVC = NSStoryboardSegue.Identifier("SegueIdentifierForSecondVC")
}
并在这两种方法中使用它。并强制施放segue.destinationController
。如果一切都正确连接,它一定不会崩溃。
@IBAction func segueData(_ sender: NSSlider) {
self.performSegue(withIdentifier: .secondVC, sender: nil)
}
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if let identifier = segue.identifier, identifier == .secondVC {
let secondViewController = segue.destinationController as! SecondViewController
secondViewController.imagesQty = slider.integerValue
}
}
最后 NSImage
得到了它自己的初始化器 URL
let image = NSImage(contentsOf: photos[i])
我在 ViewController
中有 NSSlider
,它必须通过 Show
类型的 segue 将整数值传递给 SecondViewController
,并在我每次移动它时更新视图。因此,我移动滑块以交互方式随机播放 SecondViewController
的 window 中的图像。
我花了一周的时间尝试实现 NSSlider
的这种行为,但我失败了。也许我在 Interface Builder 中建立了错误的连接。我不知道。如果您知道使 NSSlider
用于随机播放图像的任何其他方法,请告诉我。
有关详细信息,请参阅更新的答案。
非常感谢任何帮助!!!
ViewController
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var slider: NSSlider!
@IBAction func passData(_ sender: NSSlider) {
func prepare(for segue: NSStoryboardSegue, sender: NSSlider?) {
if segue.identifier!.rawValue == "SegueIdentifierForSecondVC" {
if let secondViewController = segue.destinationController as? SecondViewController {
secondViewController.imagesQuantity = slider.intValue
}
}
}
}
}
第二ViewController
import Cocoa
class SecondViewController: NSViewController {
var imagesQuantity: Int = 1
override func viewWillAppear() {
super.viewWillAppear()
print(imagesQuantity)
}
}
但是没用。我的代码有什么问题?
感谢任何帮助。
UPDATED ANSWER
查看控制器
import Cocoa
extension NSStoryboardSegue.Identifier {
static let secondVC = NSStoryboardSegue.Identifier("SegueIdentifierForSecondVC")
}
class ViewController: NSViewController {
@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
}
}
}
}
第二个视图控制器
import Cocoa
class SecondViewController: NSViewController {
var imagesQty = 30
override func viewWillAppear() {
super.viewWillAppear()
//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 { [=13=].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
}
} catch {
print(error)
}
}
}
@IBAction func passData(_ sender: NSSlider) {
func prepare(for segue: NSStoryboardSegue, sender: NSSlider?) {
if segue.identifier!.rawValue == "SegueIdentifierForSecondVC" {
if let secondViewController = segue.destinationController as? SecondViewController {
secondViewController.imagesQuantity = slider.intValue
}
}
}
}
应该是
@IBAction func passData(_ sender: NSSlider) {
}
func prepare(for segue: NSStoryboardSegue, sender: NSSlider?) {
if segue.identifier!.rawValue == "SegueIdentifierForSecondVC" {
if let secondViewController = segue.destinationController as? SecondViewController {
secondViewController.imagesQuantity = slider.intValue
}
}
}
因为你有一个方法在另一个里面,而它们应该是一个接一个的。
现在,您需要修改passData(_sender:)
。你需要在里面调用performSegue(withIdentifier:sender)
里面的
如果会在某个时间触发 prepare(for:sender:)
。我说 "some point" 是因为在调用 prepare(for:sender:)
之前至少有一个 shouldPerformSegue(withIdentifier:sender:)
调用。
所以现在做:
@IBAction func passData(_ sender: NSSlider) {
self.performSegue(withIdentifier: "SegueIdentifierForSecondVC" sender:nil)
}
错误不在代码中。
您必须将 segue 连接到 ViewController
,而不是 WindowController
.
将滑块操作连接到 IBAction
(不是连接到 segue)和从 ViewController
到 SecondViewController
的连接(不是来自滑块)。
如果第二个视图控制器的class是SecondViewController
,它应该在window控制器中指明。 SecondVC
从哪里来?
再次建议创建 NSStoryboardSegue.Identifier
extension NSStoryboardSegue.Identifier {
static let secondVC = NSStoryboardSegue.Identifier("SegueIdentifierForSecondVC")
}
并在这两种方法中使用它。并强制施放segue.destinationController
。如果一切都正确连接,它一定不会崩溃。
@IBAction func segueData(_ sender: NSSlider) {
self.performSegue(withIdentifier: .secondVC, sender: nil)
}
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if let identifier = segue.identifier, identifier == .secondVC {
let secondViewController = segue.destinationController as! SecondViewController
secondViewController.imagesQty = slider.integerValue
}
}
最后 NSImage
得到了它自己的初始化器 URL
let image = NSImage(contentsOf: photos[i])