我试图解雇一个视图控制器,并且有几种方法可以调用所有类似的方法。 #1工作但其他人没有。我什么时候应该使用其中一种而不是另一种?
1. [self dismissViewControllerAnimated:YES completion:nil]; (this one worked).
2. [self.parentViewController.navigationController popViewControllerAnimated:YES];
3. [self.navigationController popViewControllerAnimated:YES];
4. [self performSegueWithIdentifier:@"showPreviousController" sender:self];
5. [self.navigationController popToRootViewControllerAnimated:YES];
答案 0 :(得分:1)
[self dismissViewControllerAnimated:YES completion:nil];
如果您没有导航控制器并且想要跳回到上一个视图控制器,则此方法可以正常工作。
下一个按钮跳转到视图控制器B,当按下解除按钮时,它调用dismissViewControllerAnimated:
方法并跳回第一个视图控制器。
[self.parentViewController.navigationController popViewControllerAnimated:YES];
引用Apple关于parentViewController
的文档:
如果收件人是容器视图控制器的子级,则此属性包含其所包含的视图控制器。如果收件人没有父级,则此属性中的值为nil。
[self.navigationController popViewControllerAnimated:YES];
这会跳回到前一个视图控制器。您需要设置导航控制器才能使用此方法。否则没有任何反应。
如果按视图控制器B中的“关闭”按钮并且该按钮调用popViewControllerAnimated:
方法,它将跳回到视图控制器A.
[self performSegueWithIdentifier:@"showPreviousController" sender:self];
这样可以执行带有标识符的seque。在故事板中,您可以设置seques的标识符。
如果选择了seque,则可以在“属性”检查器中设置标识符:
[self.navigationController popToRootViewControllerAnimated:YES];
这会跳回到第一个视图控制器。称为根控制器。因此,如果您有5个视图控制器(A - > B - > C - > D和E)并且您在E处调用popToRootViewControllerAnimated:
,它将跳回到A控制器。
答案 1 :(得分:0)
这些方法都做不同的事情,我建议你阅读View Controller Programming Guide,因为你混淆了几个概念。
然而,这是他们所做的总结:
[self dismissViewControllerAnimated:YES completion:nil]; (this one worked).
关闭此控制器提供的视图控制器(self
)。
[self.parentViewController.navigationController popViewControllerAnimated:YES];
在父级导航控制器中弹出顶视图控制器。这很奇怪,可能是错的。 parentViewController
是当前嵌入的视图控制器。您正在访问其导航控制器并使其在堆栈顶部弹出视图控制器。在以下情况下它会默默地失败:
parentViewController
是nil
navigationController
是nil
[self.navigationController popViewControllerAnimated:YES];
在当前导航堆栈顶部弹出视图控制器。如果当前控制器已被导航控制器按下(并且未以模态方式呈现),则有意义。
[self performSegueWithIdentifier:@"showPreviousController" sender:self];
嗯,这是执行showPrviousController
segue,无论它做什么......
[self.navigationController popToRootViewControllerAnimated:YES];
这使当前导航控制器弹出所有视图控制器,除了根控制器,它将保持在最顶层。