如何在展开函数中执行segue

时间:2016-05-13 10:17:37

标签: ios segue uistoryboard uistoryboardsegue

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

A是主要的MVC,按钮“Menu”通过popover segue连接到B.

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

B是一个弹出窗口MVC,按钮“Detail”连接到A并带有展开segue。

C是带有详细信息的详细MVC。

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

预期的行为是

  • 点击B
  • 中的“详情”按钮
  • B消失,A出现
  • C出现

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

  • 点击B
  • 中的“详情”按钮
  • B消失,A出现
  • C出现
  • C消失,A出现

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

其他一些信息

  • 更多按钮需要Popover B。
  • A嵌入在UINavigationController中。连接A - >; C而不是B - > C,对于C顶部的后退按钮。

2 个答案:

答案 0 :(得分:6)

似乎unwind函数不是调用performSegueWithIdentifier的正确位置。

在调用展开功能后,UIKit会弹出视图控制器

因此,在unwind功能中推送新视图控制器将快速弹出。

解决方案是延迟performSegueWithIdentifier。

解决方案1:不工作

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

如果B控制器是一个弹出窗口,

不会工作。 B弹出消失后,不会为A控制器调用viewDidAppear。

解决方案2:工作

将performSegueWithIdentifier推入主队列。

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

答案 1 :(得分:0)

您可以通过使用以下代码为其分配故事板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];

或者您仍然希望使用segue,因此必须通过在下面实施其委托方法来控制它们,以便它们相应地执行。

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

快乐编码.. :)