无法在 didFinishWithResult 中显示模态视图控制器
Posted
技术标签:
【中文标题】无法在 didFinishWithResult 中显示模态视图控制器【英文标题】:Unable to present modal view controller in didFinishWithResult 【发布时间】:2012-06-18 10:37:47 【问题描述】:是否可以在 didFinishWithResult 中呈现 Modal 视图控制器?
我有一个 iPad 应用程序,它有 3 个视图 Home、Start 和 Login。可以使用主页视图中的开始和登录按钮启动开始和登录模式视图。
如果单击登录按钮,在登录视图中成功登录操作 (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];
下面是home view中展示登录模式视图的方法
呈现登录模式视图
LoginViewController * vc1 = [LoginViewController loginViewControllerWithNavBar:YES];
vc1.boxLoginDelegate = self;
[self presentModalViewController:vc1 animated:YES];
注意:LoginVeiwController 是 Modal 视图控制器 通过 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 上
【问题讨论】:
- (void)loginViewController:(LoginViewController *)loginViewController didFinishWithResult:(LoginResult)result
似乎是一个委托方法。你是它的代表吗?
这并没有回答我的第二个问题。你是这个方法调用者的代表吗?
是的,它是调用者方法的委托
【参考方案1】:
试试这样。我想这对你会有帮助。
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:
【讨论】:
我的代码和您的代码在 Appdelegate.m 中似乎相同,请您指出我需要更改的地方【参考方案2】:你需要在你的代码[self dismissModalViewControllerAnimated:YES];
中重构这一行,原因是当调用dismiss 时,你失去了控制器的self
上下文,因此[self presentModalViewController:startview animated:YES];
行没有进一步显示任何控制器。
要快速测试,只需评论驳回线并亲自查看。
【讨论】:
这使得登录模式视图只停留在屏幕上,即使在后面也不会发生任何变化【参考方案3】:当您的 currentViewController DissMiss 时使用此行,然后尝试下面的代码...
[self performSelector:@selector(PresentView) withObject:nil afterDelay:0.2];
-(void)PresentView
[self.navigationController presentModalViewController:startview animated:YES];
希望对你有帮助.... :)
【讨论】:
【参考方案4】:我猜是关于动画的。在前一个控制器解散时,
[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];
];
【讨论】:
也许你可以用更长的时间间隔再试一次。 0.5 可能不足以解雇。 即使我将时间间隔增加到 6.0f,登录模式视图也会消失并保留在主视图上。没有导航到 StartView。请重新检查我的问题,我已对其进行了编辑。 不知道你的问题有没有解决。但我更新了我的答案,确切地说我是如何解决这个类似问题的【参考方案5】:如果您不需要与非常旧的 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];
];
【讨论】:
以上是关于无法在 didFinishWithResult 中显示模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
在play框架中,无法编译文件XX.java。引发的错误是:无法在 Eclipse 中解析导入 XXX
无法在 SQL Server 视图中使用工作查询:“IS”无法识别“>”无法识别