隐藏所有模态视图控制器

时间:2011-12-29 18:45:57

标签: iphone ios objective-c cocoa-touch modalviewcontroller

我有一个以ModelViewController呈现的登录视图,我有一个注册视图,在其上面显示为NavigationControlloer:

登录(ModelViewController) ---->寄存器(NavigationController)

我在Loginview上展示了Register视图(CreateAccount),如下所示:

createAccount= [[CreateAccount alloc] initWithNibName:@"CreateAccount" bundle:nil];

navController = [[UINavigationController alloc] initWithRootViewController:createAccount];

UIBarButtonItem *cancelButtun=[[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(HideMe)];

UIBarButtonItem *registerButtun=[[UIBarButtonItem alloc]initWithTitle:@"Register" style:UIBarButtonItemStyleBordered target:self action:@selector(Register)];

createAccount.navigationItem.leftBarButtonItem = cancelButtun;
createAccount.navigationItem.rightBarButtonItem=registerButtun;
createAccount.title=@"Create Account";

[self presentModalViewController:navController animated:YES];

登录控制器具有NSURLConnectionDelegate用于booth登录和注册。 注册完成后,我只需拨打

[self dismissModalViewControllerAnimated:YES];

将仅解除注册视图。

我想解雇登录视图,这样我就可以回到我的主应用程序。

7 个答案:

答案 0 :(得分:23)

如果当前视图控制器没有显示任何模态控制器,则调用dismissModalViewController将调用其父节点上的方法。在视图控制器上调用该方法将解除所有呈现的模态视图控制器到该控制器。举例说明:

如果您有三个视图控制器:vc1,vc2和vc3,vc1是主/当前使用的视图控制器。

  1. 在vc1中,您提供了模态vc2。在vc2中你然后调用dismiss,因为没有从vc2提供的模态vcs,dismiss消息被传递给父(vc1),它解散vc2,你回到了vc1。

  2. 在vc1中,你呈现模态vc2,然后从vc2呈现模态vc3。在vc3中调用dismiss会将消息发送给它的父节点(vc2),这将取消vc3。要同时关闭vc2和vc3,您需要在vc1中调用dismiss,这将关闭所有(两​​个)模态视图控制器。如果解雇动画,则只会对第一个进行动画处理。

  3. 解决此问题的最佳方法之一是使用导航控制器。即,最初不是使用modalViews来呈现登录视图,而是在其中使用navigationViewcontroller。如果您需要出示注册页面。推动该视图。如果您需要转到初始视图(即除了loginView或registrationView之外),请在popToRootViewControllerAnimated中使用navigationViewcontroller方法。

答案 1 :(得分:20)

在此处查看我对类似问题的回答:Dismissing ModalViewController of ModalViewController

我在我的应用程序中使用与您完全相同的东西,这个解决方案对我有用。请务必阅读评论,因为其中一个参考文献已经改为iOS5。

修改 为了消除在另一个模态视图上呈现的模态视图,您必须在父项的父项上调用dismissModalViewControllerAnimated:。

iOS< 5.0

[[[self parentViewController] parentViewController] dismissModalViewControllerAnimated:YES];

iOS 5.0+(必须将对parentViewController的所有引用更改为presentViewController)

[[[self presentingViewController] presentingViewController] dismissModalViewControllerAnimated:YES];

答案 2 :(得分:1)

手头的主要问题是登录视图控制器完全不知道注册视图何时被解除,我们可以通过委派处理它。

首先在注册视图控制器上声明协议和委托属性。

@protocol CreateAccountDelegate;

@interface CreateAccount : UIViewController

@property (nonatomic, assign) id <CreateAccountDelegate> delegate;

@end

@protocol CreateAccountDelegate <NSObject>

- (void)createAccountViewControllerDidFinish:(CreateAccount *)controller;

@end

接下来,使登录视图控制器成为注册控制器的委托。

createAccount = [[CreateAccount alloc] initWithNibName:@"CreateAccount" bundle:nil];
createAccount.delegate = self;

并实施-createAccountViewControllerDidFinish:

- (void)createAccountViewControllerDidFinish:(CreateAccount *)controller
{
    [self dismissModalViewControllerAnimated:YES];
}

最后,当您从注册管理员中解雇时,请告知代表,如果即将被解雇,请告知代理人。

[self.delegate createAccountViewControllerDidFinish:self];
[self dismissModalViewControllerAnimated:YES];

现在,已经说了全部。我可以建议改变你的设计吗?我将登录视图控制器作为导航控制器的一部分从get go中呈现。然后,如果用户选择注册,只需将注册视图推送到控制器。这样,无论你在哪里解雇,它都只需要关闭主导航控制器。

答案 3 :(得分:0)

dismissModalViewControllerAnimated:驳回发件人之上呈现的所有模态视图控制器。要关闭回显示登录控制器的视图控制器,请保留对它的引用并解除如下:

[loginController dismissModalViewController:animated]

这是蛮力的做法。在我的应用程序中,我做了类似的事情,我发布了与会话(例如登录)状态相对应的各种通知,我的登录控制器会观察这些通知并适当地解散自己。

答案 4 :(得分:0)

将此方法放在您的app委托中,它将删除所有具有presentViewController的视图控制器,这意味着它们以模态方式呈现

-(void)dismissModalViews
{
    if (self.window.rootViewController.presentedViewController) {
        [self.window.rootViewController.presentedViewController dismissViewControllerAnimated:NO completion:nil];
        [self performSelector:@selector(dismissModalViews) withObject:nil afterDelay:0.5];
    }
}

答案 5 :(得分:0)

[[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissViewControllerAnimated:true completion:nil];

关闭除RootViewController之外的所有控制器..

答案 6 :(得分:-2)

while(self.presentedViewController)
        [self.presentedViewController dismissViewControllerAnimated:NO completion:nil];

努力解雇iOS 7中的所有内容