我正在使用Xcode 4.5和iOS 6。
我正在构建一个使用故事板的通用应用程序。我有一个视图控制器,在导航栏中有一个按钮。当点击按钮时,我使用segue将另一个视图控制器呈现为模态。模态视图控制器的导航栏中有“取消”和“保存”按钮。在故事板中,模态按钮项链接到新退出操作上的操作,该操作应该展开到父视图控制器,关闭模式,并调用操作处理程序。
这在iPhone上运行良好,但我在iPad上看到了问题。在iPad上,当模式以全屏显示时,一切正常。当我将模式更改为Page Sheet或Form Sheet(在我的情况下是所需的行为)时,将调用操作处理程序,但模态视图控制器不会自动被解除。
还有其他人看过这种行为吗?你有什么办法来解决它吗?
谢谢。
答案 0 :(得分:6)
感谢您提出这个问题,因为我刚遇到同样的问题。我认为这是一个错误,但我尚未向Apple提交。与此同时,简单的解决方法是在dismissViewController:animated:
实现中调用unwind:
(即,通过Exit图标连接到unwind segue的操作方法),从而自行消除模态视图。 / p>
我对这个解决方案的唯一担心是,如果 是一个错误并且Apple最终修复了它,那么他们的修复是否会破坏使用此解决方法的任何代码?只有时间会告诉...
稍后编辑:我发现了一个更好的解决方法。将要展开的类的父(容器)类子类化,然后在那里实现展开。例如,在我的应用中,情况如下:
UISplitViewController
UINavigationController
MasterViewController
UINavigationController
DetailViewController ----> modal segue ----> ThirdViewController
从ThirdViewController返回到DetailViewController的退出/展开语言演示了该错误 - 调用了unwind:
实现,但表单视图未被删除。但是,如果我将UISplitViewController子类化并在那里实现unwind:
,它可以正常工作。 (unwind:
实现可以为空;重点是表单视图自动被解除。)显然这是一个与容器视图控制器有关的问题,你可以通过让容器处理它来解决它。
答案 1 :(得分:4)
如果模态视图控制器被自动关闭,则很酷,但在Apple的示例here中,他们使用segue的模态转换,但后来显式调用dismissViewControllerAnimated:completion:在unwind(Exit)动作中将其关闭。
答案 2 :(得分:2)
我有同样的问题,所以我做的是:
- (IBAction)closeSalesJournal:(UIStoryboardSegue *)segue
{
// Unwind Segue
NSLog(@"Closed Sales journal VC");
// For iPad, need to dismiss the view controller manually
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
[self dismissViewControllerAnimated:YES completion:nil];
}
}
这样,我肯定会为iPhone留下标准的方式并强行解雇iPad。
答案 3 :(得分:0)
我遇到了类似的问题。我的模态segue不会放松。浪费了太多时间后,我想出了问题所在。这是我的错。
我在目标控制器中写了一个写得不好的- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
。我没想到我刚刚写过的新segue,所以它正在返回NO
。从本质上讲,我的新segue被告知不要被其他代码放松。