iphone - не могу выдвинуть модальные представления после добавления подпредставления к окну?

В моем приложении у меня есть следующий код, первый бит запускается при запуске моего приложения, и он представляет экран входа в систему в модальном виде. С моим 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 все работает нормально, когда я иду к экрану выбора людей.

Есть ли что-то фундаментальное, что я нарушаю здесь, или кто-нибудь может заметить, что я могу делать неправильно?

2 ответа

Решение

Правильно ли вы распускаете первый контроллер модального вида черезdismissModalViewControllerAnimated: метод? Если вы просто удаляете вид контроллера модального представления из его суперпредставления, то, вероятно, UIKit оставляет много бумажной работы.

Что вы действительно должны сделать, это что-то вроде этого:

  1. Добавьте rootViewController в navigationController. Затем добавьте навигационный контроллер в окно.

  2. В методе viewDidLoad rootViewController установите делегат 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];
}

Надеюсь это поможет.

Другие вопросы по тегам