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

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

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

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

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

1 голос
/ 12 мая 2011

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

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

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

...