无法在 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 中显示模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

包无法在 R 中卸载:无法安装包

“无法在此文件中预览 - 无法启动 [应用程序名称]”

在play框架中,无法编译文件XX.java。引发的错误是:无法在 Eclipse 中解析导入 XXX

无法在 SQL Server 视图中使用工作查询:“IS”无法识别“>”无法识别

无法在 VirtualBox 中启动自定义内核:“无法从启动介质中读取”

图像无法在带有 DOM 的 IE 中加载:控制台中出现 7009 错误(无法解码)