Objective c 在performsgue:withIdentifier:WithPopover样式后不调用PrepareForsgue

Objective c 在performsgue:withIdentifier:WithPopover样式后不调用PrepareForsgue,objective-c,ipad,xcode4,storyboard,uipopovercontroller,Objective C,Ipad,Xcode4,Storyboard,Uipopovercontroller,我有一个通用的应用程序,在那里我为IPad和IPhone情节提要共享同一个控制器。 我在UITableView上放置了一个UILongPressGestureRecognitor,当iPhone上按下一个单元格时,它会调用一个执行序列的动作: -(IBAction)showDetail:(id)sender { UILongPressGestureRecognizer *gesture = (UILongPressGestureRecognizer*)sender; if (ge

我有一个通用的应用程序,在那里我为IPad和IPhone情节提要共享同一个控制器。 我在UITableView上放置了一个UILongPressGestureRecognitor,当iPhone上按下一个单元格时,它会调用一个执行序列的动作:

-(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];
        }
    }
}
segue是作为“推送”执行的详细视图。您应该注意的第一件事是,发送方是nsindepath,这是我找到的传递所选单元格的唯一方法。也许有更好的解决办法。 从某种意义上说,在调用prepareForSegue之前,一切都很好

然而,在iPad上,我将segue标识符改为Popover。 现在部分工作正常,执行segue,但未调用prepareforsgue,因此目标视图控制器未按应有的方式设置


我做错了什么?

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

  • prepareForSegue(在源控制器上)
  • viewDidLoad(在目标控制器上)
在popover segue中,调用顺序为:

  • viewDidLoad(在目标控制器上)
  • prepareForSegue(在源控制器上)
就因为我将所有逻辑都放在viewDidLoad中,控制器没有正确初始化,所以发生了崩溃。所以这并不是说prepareForSegue没有被调用,事实是我得到了一个异常,我错误地误认为prepareForSegue没有被调用

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

我是如何解决这个问题的?我在目标控制器中创建了另一个方法

-(void)prepareViewController {
  // initialization logic...
}
以及更改源控制器本身中的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];

}

我不知道这是否是popover的预期行为,反正现在一切都正常了。

我注意到Xcode的主细节模板(iPhone)的锅炉板代码使用以下模式来配置细节VC的视图:

  • 为了调用configureView方法(configureView将更新视图中的所有控件,例如标签等),将覆盖细节VC的设置器(用于属性)
  • detail VC的viewDidLoad方法还调用configureView方法
  • 前几天,当我试图在我的电影应用程序中重复使用一个细节VC时,我没有遵循这种模式,这给我带来了麻烦


    我没有太多的爆米花经验;但是,如果上面的模式与显示在popover中的细节VC一起使用,那么在prepareForSegue方法中设置细节VC的属性时,细节VC的视图不会被配置吗?

    我遇到了同样的问题。调用viewdidload但不执行Segue您的修复也对我有效,所以谢谢,但这是一个奇怪的问题,因为它只是突然出现在我身上,即使我有其他几个弹出窗口工作正常,并且依赖prepareForSegue转发对象。这里也一样,有时在viewdidload之前调用prepareForSegue,有时在。。。感谢您的修复。我认为从情节提要调用segue时,在viewDidLoad之后会调用prepareForSegue,如果您使用-performSegueWithIdentifier:手动触发它,则是另一种方式。