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发出的调用:
而在popover segue中,调用顺序是:
只是因为我将所有逻辑都放在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的预期行为,无论如何现在事情正在发挥作用.