使用 Sender 为 Swift 中的 Segue 做准备

Posted

技术标签:

【中文标题】使用 Sender 为 Swift 中的 Segue 做准备【英文标题】:Prepare for Segue in Swift with Sender 【发布时间】:2016-05-24 17:56:06 【问题描述】:

我正在尝试通过“显示”segue 将UIColor 传递给另一个视图控制器,以便背景颜色可以与所选颜色按钮的颜色相匹配。我有这段代码可以打印按钮发送者标签,但它没有执行那个 segue。

我做错了什么?我以前从未使用过发件人标签,所以这可能很愚蠢,但我不确定。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

        if segue.identifier == "toQuiz" 
            if sender?.tag == 1 

                let viewController:ViewController = segue.destinationViewController as! ViewController
                let color = UIColor.blueColor()
                viewController.passedColor = color

             else if sender!.tag == 2 

                let viewController:ViewController = segue.destinationViewController as! ViewController
                let color = UIColor.greenColor()
                viewController.passedColor = color

             else if sender!.tag == 3 

                let viewController:ViewController = segue.destinationViewController as! ViewController
                let color = UIColor.yellowColor()
                viewController.passedColor = color

            
        
    

    @IBAction func athButtonTapped(sender: AnyObject) 

        let athleteQuiz = sender as! UIButton
        print("Button \(athleteQuiz.tag) was pressed!")
    

    @IBAction func actorButtonTapped(sender: AnyObject) 

        let actorQuiz = sender as! UIButton
        print("Button \(actorQuiz.tag) was pressed!")
    

    @IBAction func musicButtonTapped(sender: AnyObject) 

        let musicQuiz = sender as! UIButton
        print("Button \(musicQuiz.tag) was pressed!")
    

这是故事板布局 - 它们都已正确连接,并且 segue 的标识符与故事板中的匹配。

【问题讨论】:

你的 segue 是否在故事板中正确连接?还要检查标识符 嗨,Shubhank,我刚刚添加了一些图片以进一步帮助任何愿意帮助我的人! 是否调用了 prepareForSegue?如果没有,请检查您的故事板并确保左视图控制器分配了正确的类。如果您从 Interface Builder 中的按钮直接转接,转换仍然会发生,但您的类方法不会被调用,因为您的类没有被实例化。 按钮是否附加了segue?还是其他观点? 您应该在 viewDidLoad() 中更改颜色。在 prepareForSegue() 中,视图还没有准备好。 【参考方案1】:

需要检查的一些事项:

左视图控制器是否在 IB 中分配了您的类? 真的有什么东西触发了segue吗?您的两个按钮操作都不包含对performSegueWithIdentifier(_:sender:) 的调用

另外,这是一段非常危险的代码;你不应该像那样强制解包发件人。相反,考虑做这样的事情:

guard let id = segue.identifier else  return  // Bail if there isn't a segue ID.
if id == "toQuiz" 
    guard let tag = (sender as? UIView)?.tag else  return  // Bail if we can't get a tag.

    // Continue examining the tag.

【讨论】:

以上是关于使用 Sender 为 Swift 中的 Segue 做准备的主要内容,如果未能解决你的问题,请参考以下文章

Swift - PrepareForSegue 无法传递 sender.tag(其他 ViewController 标签中的值为零)

Swift 中的可选闭包属性

iOS 7 - PopOver 中的 UITableViewController 可以找到带有错误的 segue Receiver(UITableViewController) has no segu

如何在swift 4中从数组中添加标题

swift UIImage蓝色方块

Facebook 使用 Swift 和 Parse 登录到主 ViewController