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 оставляет много бумажной работы.
Что вы действительно должны сделать, это что-то вроде этого:
Добавьте rootViewController в navigationController. Затем добавьте навигационный контроллер в окно.
В методе viewDidLoad rootViewController установите делегат loginViewController равным rootViewController и отобразите экземпляр LoginViewController как модальный.
Когда вы закончите с принятием условий, сделайте [делегировать loginViewControllerFinished];.
Теперь в 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];
}
Надеюсь это поможет.