Swift:prepareForSegue 有两个不同的 segue

Posted

技术标签:

【中文标题】Swift:prepareForSegue 有两个不同的 segue【英文标题】:Swift: prepareForSegue with two different segues 【发布时间】:2015-07-16 14:37:11 【问题描述】:

我有 2 个UIButtons 在视图中。 它们中的每一个都链接到 2 个不同的视图。 他们必须根据您刚刚点击的按钮传递不同的数据。

我知道segue 有不同的方式,但我想为每个使用prepareForSegue 版本(对我来说,在情节提要上绘制segue 和一些代码来解释发生的事情似乎更清楚)。

我试过这个...

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if (segue != "historySegue") 
        let controller = segue.destinationViewController as! ResultViewController
        controller.match = self.match
     else 
        let controller = segue.destinationViewController as! HistoryViewController
        controller.history = self.history
    



@IBAction func showHistory(sender: UIButton) 
    performSegueWithIdentifier("historySegue", sender: self)


@IBAction func match(sender: UIButton) 
    performSegueWithIdentifier("matchSegue", sender: self)

但是当我点击按钮时出现错误

(lldb)

【问题讨论】:

【参考方案1】:

取出您的 IBAction(确保通过 Interface Builder 的右侧栏以及您的代码在 Connections Inspector 中删除它们)。对于 segue,只需使用 Interface Builder,确保两个 segue 的标识符都正确,然后尝试以下 prepareForSegue 方法:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "matchSegue" 
        let controller = segue.destinationViewController as! ResultViewController
        controller.match = self.match
     else if segue.identifier == "historySegue" 
        let controller = segue.destinationViewController as! HistoryViewController
        controller.history = self.history
    

【讨论】:

谢谢它现在有效!我不需要使用 prepareForSegue 并采取行动。故事板通过 segue 处理动作!【参考方案2】:

你可以切换它...

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if let identifier = segue.identifier 
        switch identifier 
        case "matchSegue":
            let controller = segue.destinationViewController as! ResultViewController
            controller.match = self.match
        case "historySegue":
            let controller = segue.destinationViewController as! HistoryViewController
            controller.history = self.history
        
    

【讨论】:

我得到了:Binary operator ~= cannot be applied to operand of type String and String? @Ragnar 啊,标识符是可选的将更新。已编辑【参考方案3】:

您应该将segue.identifier 与字符串 not segue 进行比较:

segue.identifier == "historySegue"

它不会解决您的问题,但以后会有所帮助。

我相信你已经添加了一个断点,你的应用程序就停在它上面。删除断点,它将起作用。

【讨论】:

是的,我忘记了,谢谢。但是onClick我仍然有这个错误Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'historySegue'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.' 表示你选择了Push segue,但是这种segue可以和UINavigationControlle一起使用。将 segue 更改为模态或将视图控制器嵌入到导航控制器中。【参考方案4】:

prepareForSegue 有两个不同的 segues 当您点击按钮时,uialert 控制器将显示它会给您三个选项:1. 物理、2. 在线和 3. 取消。

@objc func twoSegues(sender : UIButton) 
let alert = UIAlertController(title: "Update Request", message: "Are you sure to update the record!", preferredStyle: .alert)
        let yes = UIAlertAction(title: "Yes", style: .default, handler:  [weak self] (UIAlertAction) in

            if(serviceType == "physical") 
                DispatchQueue.main.async 
                    self?.performSegue(withIdentifier: "physical", sender: self?.myArray[id!].serviceID)


                 
            
             if(serviceType == "online") 
                DispatchQueue.main.async 
                    self?.performSegue(withIdentifier: "online", sender: self?.myArray[id!].serviceID)
                 
            
        )
        let no = UIAlertAction(title: "No", style: .default, handler: nil)
        alert.addAction(yes)
        alert.addAction(no)

        self.present(alert, animated: true, completion: nil)
    

【讨论】:

【参考方案5】:

为了在objective C中导航不同的segue,您需要遵循这些操作。

    点击故事板上的实际转场 转到属性检查器并重命名segue的标识符

    自定义代码如下,这里是一个例子:

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    if([segue.identifier isEqualToString:@"segueNumberOne"])
        YourViewController *functionalityViewController = [segue destinationViewController];
        functionalityViewController.someProperty = someValue;
        NSLog(@"move to segue number 1");
    else if ([segue.identifier isEqualToString:@"segueNumberTwo"])
        NSLog(@"move to segue number 2");
    
    

【讨论】:

以上是关于Swift:prepareForSegue 有两个不同的 segue的主要内容,如果未能解决你的问题,请参考以下文章

prepareForSegue 不适用于自定义 segue (swift)

Swift:PrepareForSegue 正在运行但未加载 ViewController

Swift PrepareForSegue EXC_BREAKPOINT

如何在 uitableviewcell swift 中使用多个 prepareforsegue 传递数据

通过 prepareForSegue 传递 NSString - Swift

在 Swift 2 中通过“prepareForSegue”传递数据