3

在我的应用程序中,我有以下代码,当我的应用程序启动时,第一位运行,并在模式视图中显示登录屏幕。在此之前将我的 rootController 添加到窗口中。

模态视图将允许用户登录、查看条款和条件,然后如果他们接受,则调用 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 函数中,当我去显示人员选择器时一切正常。

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

4

2 回答 2

2

您是否通过该dismissModalViewControllerAnimated:方法正确关闭了第一个模态视图控制器?如果您只是从其父视图中删除模态视图控制器的视图,那么 UIKit 可能会取消很多文​​书工作。

于 2011-05-12T18:01:19.733 回答
1

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

  1. 将 rootViewController 添加到导航控制器。然后将 navigationController 添加到窗口。

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

  3. 完成条款接受后,执行 [delegate 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];
}

在登录视图控制器中:

// 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];
}

希望这可以帮助。

于 2011-05-12T18:24:14.670 回答