无法在didFinishWithResult中显示模态视图控制器

时间:2012-06-18 10:37:48

标签: iphone objective-c ios ipad

是否可以在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

上启动

5 个答案:

答案 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];

    }];
}