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 传递数据