WLINewPostViewController *newPostViewController = [[WLINewPostViewController alloc] initWithNibName:@"WLINewPostViewController" bundle:nil];
UINavigationController *newPostNavigationController = [[UINavigationController alloc] initWithRootViewController:newPostViewController];
newPostNavigationController.navigationBar.translucent = NO;
[tabBarController presentViewController:newPostNavigationController animated:YES completion:nil];
所以我只是简单地推送一个新的UIViewController。 然后在它发布后,服务器回调使用WLINewPostViewController.m中的代码调用一个方法:
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"Completed");
}];
[[self navigationController] popViewControllerAnimated:YES];
if (self == self.navigationController.visibleViewController){
NSLog(@"self = visibile");
}
if (self == self.presentingViewController.presentingViewController){
NSLog(@"self = presenting");
}
}
我尝试了很多不同的东西而且都没有用。 我对Xcode比较新,但在尝试之后
[self dismissViewControllerAnimated:YES completion]
[self.navigationController popViewControllerAnimated:YES]
[self.navigationController.visibleViewController.presentedViewController dismissViewControllerAnimated:YES completion:nil];
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
以及其他所有可能性,我正式难倒。 WLINewPostViewController仍然不会被忽略。
它注销“self = visible”
答案 0 :(得分:0)
让我举例说明你要做的事情
你有一个带控制器A的导航控制器。 在这里,您尝试从控制器A呈现另一个控制器B. 现在,当您从服务器获得回调时,应该从Controller B调用dismissViewControllerAnimated来解除它自己。
因此,在dismissViewControllerAnimated:completion:方法调用之后,控制器B将被解除,控制器A将自动显示。现在您不需要再次在完成块中调用popViewControllerAnimated:因为导航控制器中没有其他Controller可以加载。
如果您有不同的用例,请告诉我,我可以提供解决方案。
答案 1 :(得分:0)
您正在通过导航栏呈现视图,而不是通过导航栏将其推送。
当你推动弹出。当你提出解雇。因此,您需要使用dismissViewControllerAnimated:completion
而不是popViewControllerAnimated答案 2 :(得分:0)
根据接收者的不同,表现不同。来自文档:
呈现视图控制器负责解除它所呈现的视图控制器。如果在呈现的视图控制器本身上调用此方法,它会自动将消息转发给呈现视图控制器。
如果您连续呈现多个视图控制器,从而构建一堆呈现的视图控制器,则在堆栈中较低的视图控制器上调用此方法会解除其直接子视图控制器以及堆栈上该子视图上方的所有视图控制器。发生这种情况时,只有最顶层的视图以动画方式被删除;任何中间视图控制器都可以从堆栈中删除。最顶层的视图使用其模态过渡样式被忽略,这可能与堆栈中较低的其他视图控制器使用的样式不同。
简而言之,如果顶部的vc自己调用它,它会自行解散。堆栈中的任何其他位置都会忽略该点,仅为最顶层的vc设置动画。
对于你和许多其他人来说,令人困惑的是导航vc也有一个堆栈,并且通过在标签栏vc上面显示导航vc,你的问题更加复杂。
那该怎么办?问题是不清楚发布的代码中哪个vc是接收者(该片段中的self
是谁?)。该文本暗示self是所呈现的导航vc的堆栈上的vc,如...
TabBarVC --- presents ---> NavVC
| |
| --- viewControllers stack = rootVC, vc1
|
---> viewControllers for each tab
...它是想要解散的root或vc1。如果我是对的,那么,鉴于文档,解决方案很明确:
[self.navigationController dismissViewControllerAnimated:YES completion:^{}];
当我们完成目前的任何标签时,会将我们放回到tabbar vc上。