是否可以在didFinishWithResult中提供Modal视图控制器?
我有一个iPad应用程序,包含3个浏览主页,开始和登录。可以使用主视图中的启动和登录按钮启动启动和登录模式视图。
如果单击登录按钮,在登录视图中成功登录操作(didFinishWithResult)后,我可以关闭登录视图,但我无法启动开始视图。但是控制仍然留在主视图上。
对于上述情况,我没有收到任何错误。
Appdeligate.m:
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
HomeViewController * homeview=[[HomeViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:homeview];
self.rootViewController = navigationController;
[navigationController setNavigationBarHidden:YES];
self.rootViewController.view.frame = [[UIScreen mainScreen] applicationFrame];
[self.window addSubview:self.rootViewController.view];
[window makeKeyAndVisible];
以下是主视图中显示登录模式视图的方法
呈现登录模式视图
LoginViewController * vc1 = [LoginViewController loginViewControllerWithNavBar:YES];
vc1.boxLoginDelegate = self;
[self presentModalViewController:vc1 animated:YES];
注意:LoginVeiwController是呈现的模态视图控制器 通过HomeViewController。是推出/呈现另一种模式的正确方法 通过解除LoginVeiwController来查看控制器(启动控制器) 如下。因为只要LoginVeiwController解除控件,就会停留在HomeVeiwContrller而不是启动/呈现StartViewController:
主页视图:
以下是主视图中的方法,该方法将在成功登录时解除登录视图并尝试启动开始视图。
- (void)loginViewController:(LoginViewController *)loginViewController didFinishWithResult:(LoginResult)result {
[self dismissModalViewControllerAnimated:YES];
startview = [[[startViewController alloc] init] autorelease];
[self.navigationController setNavigationBarHidden:YES];
[self presentModalViewController:startview animated:YES];
}
如果我单击按钮直接显示StartView,它会很好地启动,但不会在didFinishWithResult
上启动答案 0 :(得分:0)
我想这是关于动画的。虽然前一个控制器正在解雇,
[self presentModalViewController:startview animated:YES];
被召唤。
您可以通过将动画设置为NO来验证我的猜测。或直接使用我的建议,看它是否有效。
如果我是正确的,您可以将它们设置回YES。 此外,而不是直接调用
[self presentModalViewController:startview animated:YES];
您可以尝试:
[NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(showController) userInfo:nil repeats:No];
- (void)showController {
[self presentModalViewController:startview animated:YES];
}
编辑:
我终于找到了解决这个类似问题的方法:
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[UIView animateWithDuration:0.5
animations:^{
[self dismissModalViewControllerAnimated:YES];
}
completion:^(BOOL finished) {
NSURL *path = [info objectForKey:@"UIImagePickerControllerMediaURL"];
VideoConfirmViewController *videoConfirmCon = [[VideoConfirmViewController alloc]initWithFileURL:path];
[self presentModalViewController:videoConfirmCon animated:YES];
}
];
}
答案 1 :(得分:0)
试试这样。我认为这会对你有所帮助。
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
HomeViewController * homeview=[[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:homeview];
[self.window addSubview:navigationController.view];
[window makeKeyAndVisible];
return YES:
答案 2 :(得分:0)
你需要在你的代码[self dismissModalViewControllerAnimated:YES];
中重构这一行,原因是当调用dismiss时,你失去了控制器的self
上下文,因此行[self presentModalViewController:startview animated:YES];
没有显示任何控制器进一步。
快速测试只是评论解雇线并亲自看看。
答案 3 :(得分:0)
当您当前的View Controller DisMiss尝试下面的代码时使用此行...
[self performSelector:@selector(PresentView) withObject:nil afterDelay:0.2];
-(void)PresentView
{
[self.navigationController presentModalViewController:startview animated:YES];
}
希望,这有助于你....
:)
答案 4 :(得分:0)
如果您不需要与非常旧的iOS版本兼容,最好使用
-(void)presentViewControllerAnimated:completion:
-(void)dismissViewControllerAnimated:completion:
而不是
-(void)presentModalViewController:animated:
-(void)dismissModalViewController:animated:
在这种情况下
- (void)loginViewController:(LoginViewController *)loginViewController didFinishWithResult:(LoginResult)result
{
[self dismissViewControllerAnimated:YES completion: ^{
startview = [[[startViewController alloc] init] autorelease];
[self.navigationController setNavigationBarHidden:YES];
[self.presentingViewController presentViewControllerAnimated:YES completion:NULL];
}];
}