Swift:使用两个不同的segue准备prepareForSegue

10

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

我知道有不同的方法来segue,但我想为每个使用prepareForSegue版本(对我来说似乎更清晰,在storyboard上画出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)

5个回答

23

删除您的IBActions(确保通过界面生成器中的右侧边栏以及在代码中删除它们)。对于转场,只需使用界面生成器,确保两个转场标识符正确,然后尝试使用此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处理操作! - Ragnar

4
您可以切换它,以便在不同的设备上获得最佳的显示效果。
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
        }
    }
}

1
我得到了:二元运算符~=不能应用于类型为String和String?的操作数 - Ragnar
@Ragnar 啊,识别符号是可选的,我会更新。已编辑。 - Fogmeister

1
你应该将segue.identifier与字符串进行比较,而不是与segue进行比较: segue.identifier == "historySegue" 这不会解决你的问题,但它可以帮助你以后。
我相信你已经添加了一个断点,你的应用程序停在了那里。删除断点,它就能正常工作了。

是的,我忘记了,谢谢提醒。但是在onClick时,我仍然遇到了这个错误:终止应用程序,原因是未捕获的异常'NSGenericException',原因是“找不到导航控制器以进行segue 'historySegue'。只有当源控制器由UINavigationController的实例管理时,才能使用Push segues。” - Ragnar
这意味着您选择了Push segue,但是这种segue可以与UINavigationController一起使用。将segue更改为modal或将视图控制器嵌入导航控制器中。 - Greg

0

使用两个不同的 Segues 进行 prepareForSegue 当您点击按钮时,UIAlertController 将显示并提供三个选项: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)
    }
}

0

要在Objective C中导航不同的转场,您需要遵循以下操作。

  1. 在Storyboard上 点击实际的segue
  2. 进入“属性检查器”,重命名segue的标识符
  3. 按以下方式自定义代码,这是一个示例:

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"segueNumberOne"]){
        YourViewController *功能控制器 = [segue destinationViewController];
        functionalityViewController.someProperty = someValue;
        NSLog(@"跳转到segue number 1");
    }else if ([segue.identifier isEqualToString:@"segueNumberTwo"]){
        NSLog(@"跳转到segue number 2");
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接