如何在展开function中执行segue

我有3个MVC,在这里将它们命名为A,B,C。

A是一个带有popup菜单B连接到B的button“Menu”的主MVC。

A也连接到C与手动显示segue。

B是一个popup窗口MVC,连接到一个button“细节”与退休segue。

C是详细信息的详细MVC。

在A的展开函数中,我调用了performSegueWithIdentifier来展示C.


预期的行为是

  • 点击B中的“Detail”button
  • B消失,A出现
  • C出现

但运行我得到的应用程序。

  • 点击B中的“Detail”button
  • B消失,A出现
  • C出现
  • C消失,A出现

C突然出现并消失,这不是我想要的。


一些额外的信息

  • popup窗口B需要更多的button。
  • Aembedded在UINavigationController中。 连接A – > C而不是B – > C,用于C上的后退button。

似乎展开function不是调用performSegueWithIdentifier的正确位置。

UIKit会调用展开函数popup视图控制器。

这样推新视图控制器内部的展开function就会很快popup。

解决办法是延迟执行SegueWithIdentifier。

解决scheme1: 不工作精细

添加一个bool实例,并在viewDidAppear中使用这个实例来确定我们是否执行segue。

如果B控制器是popup窗口,将无法工作。 B popover消失后,viewDidAppear不会被A控制器调用。

解决scheme2: 工作

将执行完毕的标识符推入主队列。

@IBAction func unwind(segue : UIStoryboardSegue) { dispatch_async(dispatch_get_main_queue()) { self.performSegueWithIdentifier("SomeSegue", sender: self) } } 

你可以通过使用下面的代码分配故事板ID给他们之间轻松切换viewControllers ..

 // you need to create UIStoryboard object by giving name of your storyboard UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; // here you need to create storyboard ID of perticular view where you need to navigate your app UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"viewContIdentifire"]; // if use presentViewController this will not enables you to go back to previous view [self presentViewController:vc animated:NO completion:nil]; **// OR** // using pushViewController lets you to go back to the previous view [self.navigationController pushViewController:vc animated:YES]; 

或者仍然想要继续使用,所以必须通过执行下面的委托方法来获得对它们的控制权,以便相应地执行。

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"segueName"]) { // perform segue [self performSegueWithIdentifier:@"SegueIdentifier" sender:self]; } } 

快乐编码.. 🙂