Swift Segue不';我不能在macOS工作

Swift Segue不';我不能在macOS工作,swift,macos,segue,swift4,viewcontroller,Swift,Macos,Segue,Swift4,Viewcontroller,我在ViewController中有NSSlider,它必须通过类型为Show的序列将整数值传递给SecondViewController,并在每次移动视图时更新视图。所以,移动滑块我在SecondViewController的窗口中交互地洗牌图像 我花了一个星期的时间试图实现这样一个NSSlider行为,但失败了。也许我在Interface Builder中建立了错误的连接。我不知道。如果您知道任何其他方法使NSSlider用于洗牌图像,请告诉我 有关详细信息,请参阅更新的答案 非常感谢您的帮

我在
ViewController
中有
NSSlider
,它必须通过类型为
Show
的序列将整数值传递给
SecondViewController
,并在每次移动视图时更新视图。所以,移动滑块我在
SecondViewController
的窗口中交互地洗牌图像

我花了一个星期的时间试图实现这样一个
NSSlider
行为,但失败了。也许我在Interface Builder中建立了错误的连接。我不知道。如果您知道任何其他方法使
NSSlider
用于洗牌图像,请告诉我

有关详细信息,请参阅更新的答案

非常感谢您的帮助

视图控制器

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 
                }
            }
        }
    }
}
import Cocoa

class SecondViewController: NSViewController {

    var imagesQuantity: Int = 1

    override func viewWillAppear() {
        super.viewWillAppear()

        print(imagesQuantity)
    }
}
SecondViewController

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 
                }
            }
        }
    }
}
import Cocoa

class SecondViewController: NSViewController {

    var imagesQuantity: Int = 1

    override func viewWillAppear() {
        super.viewWillAppear()

        print(imagesQuantity)
    }
}
但它不起作用。我的代码出了什么问题

谢谢你的帮助

更新的答案

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 { $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
            }
        } catch {
            print(error)
        }
    }
}
视图控制器

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 { $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
            }
        } catch {
            print(error)
        }
    }
}
第二视图控制器

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 { $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
            }
        } 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 
        }
    }
}
因为你有一个方法在另一个里面,而它们应该是一个接一个的

现在,您需要修改
passData(\u sender:)
。您需要在内部调用
performsgue(带有标识符:sender)

If将在某个点触发
准备(发件人:)
。我之所以说“某个时刻”,是因为在调用
prepare(for:sender:)
之前至少有一个
shouldPerformSegue(带标识符:sender:)
调用

那么现在就做:

@IBAction func passData(_ sender: NSSlider) {        
    self.performSegue(withIdentifier: "SegueIdentifierForSecondVC"  sender:nil)
}
应该是

@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(\u sender:)
。您需要在内部调用
performsgue(带有标识符:sender)

If将在某个点触发
准备(发件人:)
。我之所以说“某个时刻”,是因为在调用
prepare(for:sender:)
之前至少有一个
shouldPerformSegue(带标识符:sender:)
调用

那么现在就做:

@IBAction func passData(_ sender: NSSlider) {        
    self.performSegue(withIdentifier: "SegueIdentifierForSecondVC"  sender:nil)
}

代码中没有错误

您必须将segue连接到
视图控制器
,而不是
窗口控制器

将滑块动作连接到
iAction
(不连接到segue)和
ViewController
SecondViewController
(不从滑块)的segue

如果第二个视图控制器的类别为
SecondViewController
,则应在窗口控制器中指示。
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])

代码中没有错误

您必须将segue连接到
视图控制器
,而不是
窗口控制器

将滑块动作连接到
iAction
(不连接到segue)和
ViewController
SecondViewController
(不从滑块)的segue

如果第二个视图控制器的类别为
SecondViewController
,则应在窗口控制器中指示。
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])

为什么
func prepare(用于segue:NSStoryboardSegue,sender:NSSlider?
iAction
方法中?把它放在外面,改为在里面写
self.perform(segue:SegueIdentifierForSecondVC sender:slider)
你似乎有一些编码方面的知识。你没看到你在另一个里面有一个方法吗
@IBAction func passData({sender:NSSlider){}
func prepare(对于segue:NSStoryboardSegue,sender:NSSlider?{}
@IBAction func passData({sender:NSSlider){unc prepare(对于segue:NSStoryboardSegue,sender:NSSlider?{}
,而不是一个接一个?因此,在
passData()
中调用
performsgue()
,它应该触发
prepareforsgue()
(如果它根据文档中的声明具有正确的声明)。为什么
func prepare(对于segue:NSStoryboardSegue,发送方:NSSlider?
iAction
方法中?把它放在外面,改为在里面写
self.perform(segue:SegueIdentifierForSecondVC sender:slider)
你似乎有一些编码方面的知识。你没看到你在另一个里面有一个方法吗
@IBAction func passData({sender:NSSlider){}
func prepare(对于segue:NSStoryboardSegue,sender:NSSlider?{}
@IBAction func passData({sender:NSSlider){unc prepare(对于segue:NSStoryboardSegue,sender:NSSlider?{}
,而不是一个接一个?因此,在
passData()
中调用
performsgue()
,它应该触发
prepareforsgue()
(如果它根据文档中的声明具有正确的声明)。是否调用了
prepare(对于segue:sender:)
?对于标识符,这似乎是正确的,只是我更习惯于iOS而不是macOS。什么窗户开着?第二个VC?新的?当您想要更新值时,secondVC是否一直在屏幕上?滑块打开secondVC窗口,并且不更新值(((再次:Is
prepare(for segue:sender:)
called?是否可以在其中添加一个
print()
?如果调用它,它是在
print(imagesQuantity)之前还是之后打印的)
?我想知道
功能准备(fo