3

Im我的应用程序我有以下代码,第一位在我的应用程序启动时运行,它在模态视图中显示登录屏幕。随着我的rootController添加到窗口之前。iphone - 无法推子窗口添加子视图后的模态意见?

模态视图将允许用户登录,查看条款和条件,然后如果他们接受调用loadMainApp函数。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    rootController.delegate = self; 
    [window addSubview:rootController.view]; 

    LoginViewController *_loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:[NSBundle mainBundle]]; 
    self.loginViewController = _loginViewController; 
    [_loginViewController release]; 


    UINavigationController *navi = [[[UINavigationController alloc]initWithRootViewController:loginViewController]autorelease]; 

    navi.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
    [loginViewController release]; 
    [rootController presentModalViewController:navi animated:YES]; 

    [self.window makeKeyAndVisible]; 
    return YES; 
} 

这下一位被称为当用户接受条款和条件:

-(void)loadMainApp:(UIView *)fromView{ 

    [fromView removeFromSuperview]; 
    [window addSubview:rootController.view]; 
    rootController.selectedIndex = 2; 
    rootController.delegate = self; 

} 

在这里,我希望能够使用人员选取这是一个模式的看法和我这个尝试它代码:

ABPeoplePickerNavigationController *picker = 
     [[ABPeoplePickerNavigationController alloc]init]; 
     picker.peoplePickerDelegate = self; 

     [rootController presentModalViewController:picker animated:YES]; 
     [picker release]; 

但是什么都没有发生,当我尝试从我的rootController呈现模态视图时什么也没有显示。

这似乎这段代码中的applicationDidFinishLaunching运行后出现:

LoginViewController *_loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:[NSBundle mainBundle]]; 
     self.loginViewController = _loginViewController; 
     [_loginViewController release]; 


     UINavigationController *navi = [[[UINavigationController alloc]initWithRootViewController:loginViewController]autorelease]; 

     navi.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
     [loginViewController release]; 
     [rootController presentModalViewController:navi animated:YES]; 

     [self.window makeKeyAndVisible]; 
     return YES; 

如果我不显示在所有的登录屏幕,而不是只加我rootController

rootController.delegate = self; 
     [window addSubview:rootController.view]; 

中的applicationDidFinishLaunching函数,那么当我去显示人员选择器时,一切正常。

有一些基本的东西,我在这里打破或任何人能发现什么,我可能会做错了什么?

回答

2

您是否通过dismissModalViewControllerAnimated:方法正确解锁了第一个模态视图控制器?如果您只是从其超级视图中删除模式视图控制器的视图,那么很可能很多文书工作都不会被UIKit取消。

1

你真正应该做的是这样的:

  1. 添加到RootViewController的navigationController。然后将navigationController添加到窗口。

  2. 在rootViewController的viewDidLoad方法中,将loginViewController的委托设置为rootViewController,并将LoginViewController的实例显示为模式。

  3. 当你与验收方面做,做[代表loginViewControllerFinished] ;.

  4. 现在RootViewController的,处理方法loginViewControllerFinished。这应该包含对[self dismissModalViewControllerAnimated:YES]的调用;关闭登录模式视图。那么你应该发动的ABPeoplePickerNavigationController 为模态的视图


在AppDelegate中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Make sure rootViewController is initiated by this point. 

    UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:rootViewController] autorelease]; 

    [window addSubview:rootController.view]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

在RootViewController的:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    LoginViewController *loginViewController = [[[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil] autorelease]; 
    loginViewController.delegate = self; 

    loginViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
    [self presentModalViewController:loginViewController animated:YES]; 
} 

- (void)loginViewControllerFinished { 
    [self dismissModalViewControllerAnimated:YES]; 

    // Here we are closing one modal. And showing another after that. 
    ABPeoplePickerNavigationController *peoplePicker = [[[ABPeoplePickerNavigationController alloc] init] autorelease]; 
    peoplePicker.peoplePickerDelegate = self; 
    [self presentModalViewController:peoplePicker animated:YES]; 
} 

在LoginViewController:

// Make sure LoginViewController has delegate property in header. 
// @property (nonatomic, assign) id delegate; 
// And put this in implementation (.m) file. @synthesize delegate. 
// Don't put release for delegate, since it's not retained. It's only 'assigned'. 

- (void)done { 
    // Call this when you want to close loginViewController. 
    [delegate loginViewControllerFinished]; 
} 

希望这有助于。