在performSegue:withIdentifier:with popover style之后不调用prepareForSegue

Leo*_*rdo 10 objective-c storyboard ipad uipopovercontroller xcode4

我有一个通用的应用程序,我正在为IPad和IPhone故事板共享相同的控制器.我在UITableView上放了一个UILongPressGestureRecognizer,当在iPhone上按下一个单元格时,它会调用一个执行segue的动作:

-(IBAction)showDetail:(id)sender {
    UILongPressGestureRecognizer *gesture = (UILongPressGestureRecognizer*)sender;
    if (gesture.state == UIGestureRecognizerStateBegan) {
        CGPoint p = [gesture locationInView:self.theTableView];

        NSIndexPath *indexPath = [self.theTableView indexPathForRowAtPoint:p];
        if (indexPath != nil) {
            [self performSegueWithIdentifier:SEGUE_DETAIL sender:indexPath];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

segue是作为"推送"执行的详细视图.您应该注意的第一件事是发件人是NSIndexPath,是我找到的传递所选单元格的唯一方法.也许有更好的解决方案.一切都运行良好,从某种意义上说,执行segue,并在prepareForSegue被调用之前.

然而,在iPad上,我已经将segue标识符更改为Popover.现在事情正在部分工作,执行了segue,但是没有调用prepareForSegue,因此目标视图控制器没有按原样设置.

我究竟做错了什么 ?

Leo*_*rdo 20

到目前为止我发现的是,对于任何不是popover的segue标识符,这些是iOS发出的调用:

  • prepareForSegue(在源代码控制器上)
  • viewDidLoad(在目标控制器上)

而在popover segue中,调用顺序是:

  • viewDidLoad(在目标控制器上)
  • prepareForSegue(在源代码控制器上)

只是因为我将所有逻辑都放在viewDidLoad中,控制器没有正确初始化,并且发生了崩溃.所以这并不完全正确,因为没有调用prepareForSegue,事实是我得到了一个例外,而我错误地认为,因为prepareForSegue没有被调用.

我无法将所有内容放在viewWillAppear中,因为必须进行对CoreData的调用,并且我不想在每次显示视图时检查实体是否正常.

我是怎么解决的?我在目标控制器中创建了另一种方法

-(void)prepareViewController {
  // initialization logic...
}
Run Code Online (Sandbox Code Playgroud)

并在源代码管理器本身中更改prepareForSegue方法:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  MyViewController *mvc = (MyViewController*)[segue destinationViewController];
  // passing variable 
  // with segue style other than popover this called first than viewDidLoad
  mvc.myProp1=@"prop1"; 
  mvc.myProp2=@"prop2";

  // viewWillAppear is not yet called
  // so by sending message to controller
  // the view is initialized
  [mvc prepareViewController];

}
Run Code Online (Sandbox Code Playgroud)

不知道这是否是popover的预期行为,无论如何现在事情正在发挥作用.