在PresentDismiss&中遇到麻烦NavigateViewController push / pop

时间:2015-10-25 09:32:19

标签: ios objective-c uinavigationcontroller presentmodalviewcontroller presentviewcontroller

我将整个应用程序嵌入到UINavigationController中。现在主屏幕有几个模块供用户选择。现在,当用户点击模块时它是NAVIGATED并且如果用户希望从任何其他可用模块中选择另一个模块,导航栏中有一个按钮,它在当前模块的顶部以模态方式呈现HomeViewController然后用户可以从那里选择任何不会出现的模块,而不是他们将导航。

现在我所做的是在HomeViewController上创建一个名为navigate的委托,并且将被每个模块的viewcontrollers覆盖,并且它将使用新的ViewController引用它。然后,当调用此方法时,我首先解除ViewController的HomeViewController,然后导航到我有参考的新ViewController。

现在,真正的问题是,有些人在从一个模块导航到另一个模块时有一个混蛋,有时它工作正常。这就是为什么我也无法调试。这个混蛋是当从HomeViewController单击一个模块时,主屏幕消失并再次出现,然后实际导航。

从HomeViewController导航到模块的代码是

RadiusSearchViewController *rad = [self.storyboard instantiateViewControllerWithIdentifier:@"RadiusSearchViewController"];
[self.delegate navigate:rad];

所有模块中的导航覆盖方法是

-(void)navigate:(UIViewController*)uiViewController{
NSLog(@"inside navigate method");
[self.presentedViewController dismissViewControllerAnimated:YES completion:nil];
[self.navigationController pushViewController:uiViewController animated:YES];
}

我向你保证,这种方法正在实施。

现在,以模态方式呈现HomeViewController的代码是

ViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeVC"];
vc.view.backgroundColor = [[UIColor whiteColor]colorWithAlphaComponent:0];
vc.delegate = self;
vc.providesPresentationContextTransitionStyle = YES;
vc.definesPresentationContext = YES;
vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
vc.fromOutside = true;
NSLog(@"Presneting...");
[self presentViewController:vc animated:NO completion:nil];

PRESENTING和NOT NAVIGATING HomeViewController的原因是它以透明的形式出现在当前模块的顶部,这是必要的。

记住:有时并非总是发生这种情况。就像你可以说一半的时间一样。

1 个答案:

答案 0 :(得分:1)

[self.presentedViewController dismissViewControllerAnimated:YES completion:nil]; 
[self.navigationController pushViewController:uiViewController animated:YES]; 

这应该改为......

[self.presentedViewController dismissViewControllerAnimated:YES 
    completion:^{
    [self.navigationController pushViewController:uiViewController animated:YES];
    }];

这将确保在解除完成后调用导航视图控制器。检查并查看它是否解决了您的问题。