2011-12-29 58 views
9

我已经呈现为ModelViewController登录视图和我有呈现为NavigationControlloer在它上面的寄存器视图:隐藏所有模态的视图控制器

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

我在一个LoginView呈现注册视图(的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; 
[email protected]"Create Account"; 

[self presentModalViewController:navController animated:YES]; 

登录控制器具有NSURLConnectionDelegate展位登录和注册。 当登记共完成我只需调用

[self dismissModalViewControllerAnimated:YES]; 

这将仅解雇登记视图。

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

+0

请说明你是如何呈现的注册视图。这是另一种模态观点吗? – 2011-12-29 18:49:51

+0

我编辑了这篇文章:) – Kassem 2011-12-29 18:53:59

回答

19

看看我的回答类似的问题在这里:Dismissing ModalViewController of ModalViewController

我使用几乎同样的事情,你在我的应用程序,而这个解决方案为我工作。请务必阅读注释,因为其中一个参考随iOS5更改。

编辑: 为了关闭那些呈现在另一个模式视图模式的看法,你必须调用dismissModalViewControllerAnimated:父的父。

的iOS 5.0 <

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

iOS 5.0及(必须改变,以parentViewController到presentingViewController所有引用)

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

+1这对我来说非常合适。如果解决方案也包含在这里,那将会很好。 – 2012-04-07 16:41:36

+1

@JasonGeorge编辑包含答案......谢谢:) – superjessi 2012-04-11 17:37:01

+2

小心:_dismissModalViewControllerAnimated_ **弃用**(在iOS 6.0中),请使用_dismissViewControllerAnimated:completion:_来代替。 – CFIFok 2015-11-12 14:31:36

23

调用dismissModalViewController将会,如果当前视图控制器不提供任何模式控制器,而是调用其父代的方法。在视图控制器上调用该方法会将所有呈现的模式视图控制器关闭到该控制器。举例说明:

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

  1. 在vc1中,您介绍了modal vc2。在vc2中,你称之为解雇,因为vc2中没有模态vcs,解散消息被传递给父节点(vc1),解除vc2,然后你回到vc1。

  2. 在vc1中你介绍modal vc2,然后从vc2介绍modal vc3。在vc3中调用解除消息会将消息发送到它的父节点(vc2),该节点将关闭vc3。要同时关闭vc2和vc3,您需要在vc1中调用dismiss,这会取消所有(两个)模式视图控制器。如果解散动画,只有第一个动画。

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

+3

+1了解vc流程非常有用。 – 2012-04-07 16:42:49

0

dismissModalViewControllerAnimated:取消发送者顶部显示的所有模态视图控制器。要关闭回所呈现登录控制器视图控制器,保持对它的引用和罢免如下:

[loginController dismissModalViewController:animated] 

这是做它的蛮力方式。在我的应用程序中,我做了类似的事情,我发布了对应于会话(例如,登录)状态的各种通知,并且我的登录控制器观察这些通知并适当地解除其自身。

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 login controller作为导航控制器的一部分。然后,如果用户选择注册,只需将注册视图推入控制器。这样,不管你从哪里开除,它只需要关闭主导航控制器。

0

将这种方法在你的应用程序委托,它会删除拥有所有的视图控制器一个呈现控制器,这意味着它们以模态呈现

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

停止为我在iOS 7 – obiwahn 2013-10-14 09:08:25

+0

工作,那么你有另一个问题,只是在Xcode测试与开发目标设置为7.0,它仍然工作。确保您在实现UIApplicationDelegate协议的NSObject中调用此方法,并且已设置self.window.rootViewController。我没有使用故事板按项目 – zurbergram 2013-10-14 12:36:07

+0

我改变了延迟到0.75然后它的工作。 我为iOS 7编译了iOS 6应用程序。也许他们改变了计时,因为在此之前它使用0.5计时。 – obiwahn 2013-10-14 17:28:31

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

致力于关闭所有iOS中7

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

辞退除RootViewController的所有控制器..