Не можете представить ModalView на viewWillAppear в UIViewController? - PullRequest
1 голос
/ 05 мая 2011

Я на самом деле работаю над приложением для iPad, которое содержит защищенную личную зону. Само приложение использует TabBarNavigation с UIViewController для каждой вкладки.

Чтобы отобразить форму LoginForm на вкладке «Member-Area», когда пользователь не вошел в систему, я создал LoginScreen в отдельном контроллере UIViewController и попытался представить его как ModalView в методе ViewWillAppear-Method.

Маловероятно, что ViewWillAppear / ViewDidLoad не может обработать модальное представление. Каждый найденный мной учебник или пример использует Button-Action для отображения ModalView.

Разве нельзя показать это без нажатия чего-либо?

Код, который я использовал в "MemberViewController" ViewWillAppear, выглядит следующим образом:

        -(void)viewWillAppear:(BOOL)animated{
    LoginViewController *loginInstance = [[[LoginViewController alloc] init] autorelease];

    [self presentModalViewController:loginInstance animated:YES];    
    [loginInstance release];
}

Было бы здорово, если бы кто-то мог помочь!

Ответы [ 5 ]

4 голосов
/ 05 мая 2011

Вы не можете представить модал до того, как ваш вид появился, поэтому вам придется сделать это в viewDidAppear.Могу поспорить, что вы не хотите показывать, что стоит за модалкой.Лучше всего просто скрыть все на главном экране, пока пользователь не пройдет аутентификацию в вашем модале.Вы можете поместить код, чтобы раскрыть все, чтобы он был там, когда модальная анимация исчезла, в том же методе, который вызывает dismissModalViewController.

Быстрый совет: если у вас есть куча вещей, которые вам нужно скрыть / показать иВы не хотите скрывать все вручную, просто бросьте их все в контейнерное представление и скройте / раскройте это одно представление.

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

Создайте пустой UIViewController с чем-то вроде этого:

#import "LoginViewController.h"
#import "MemberViewController.h"

- (void)viewDidLoad {
[super viewDidLoad];

[self performSelector:@selector(checkForLogin)];
}

- (void)checkForLogin {
NSString * checkString = [[NSUserDefaults standardUserDefaults] objectForKey:@"LoginCheck"];

if ([checkString isEqualToString:@"YES"]) {

MemberViewController * memberInstance = [[MemberViewController alloc] init];
[self presentModalViewController:memberInstance animated:YES];
[memberInstance release];

} else {

LoginViewController * loginInstance = [[LoginViewController alloc] init];
[self presentModalViewController:loginInstance animated:YES];
[loginInstance release];

}

}

В LoginViewController.h добавьте это к функции, которая вызывается, когда логин действителен:

[[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"LoginCheck"];
[[NSUserDefaults standardUserDefaults] synchronize];

Я думаю, что это должно сработать; -)

Могут быть некоторые ошибки, я набрал это прямо у меня на сайте

Редактировать: присоединить новый пустой контроллер представления к элементу UITabBarController, где требуется вход в систему; -)

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

Это работает, черт возьми, да!; D

Единственное, что я добавил к примеру Рика, это увольнение текущего Модала для перезагрузки просмотра.

Вот полное решение:

Я создалпустой UIViewController с Nib для переключения между LoginView и MemberView:

    #import "LoginViewController.h"
#import "MemberViewController.h"

- (void)viewDidLoad {
[super viewDidLoad];

[self performSelector:@selector(checkForLogin)];
}

- (void)checkForLogin {
NSString * checkString = [[NSUserDefaults standardUserDefaults] objectForKey:@"LoginCheck"];

if ([checkString isEqualToString:@"YES"]) {

MemberViewController * memberInstance = [[MemberViewController alloc] init];
[self presentModalViewController:memberInstance animated:YES];
[memberInstance release];

} else {

LoginViewController * loginInstance = [[LoginViewController alloc] init];
[self presentModalViewController:loginInstance animated:YES];
[loginInstance release];

}

}

Затем я добавил этот код в метод успешного выполнения UserLogin:

[[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"LoginCheck"];

[[NSUserDefaults standardUserDefaults] синхронизировать];

и, по крайней мере, я использую это в конце этого метода для обновления контроллера, который переключает модалы:

[self dismissModalViewControllerAnimated:YES];

Спасибо за отличную поддержку, особенно благодаря вам, Рик.

0 голосов
/ 05 мая 2011

Я думаю, что вы столкнулись с забавной ситуацией, когда анимация контроллера модального представления в том же цикле выполнения, что и отображаемое представление, заставляет все работать неправильно.Похоже, вы пытаетесь, чтобы LoginViewController показывал, когда пользователь впервые входит в личный кабинет.Попробуйте отобразить модальное не анимированное

[self presentModalViewController: loginInstance animated: NO];

Если вы хотите позабавиться с этим, попробуйте это

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self performSelector:@selector(_showModal) withObject:nil afterDelay:0.0f];
}

-(void)_showModal 
{
    LoginViewController *loginInstance = [[[LoginViewController alloc] init] autorelease];

    [self presentModalViewController:loginInstance animated:YES];    
}

Редактировать: На второй взгляд, вы также забыли вызвать super в своем методе viewWillAppear - это необходимо и может быть причиной вашей проблемы.

0 голосов
/ 05 мая 2011

Я не уверен, что это решает вашу проблему напрямую, но попробуйте представить модальное значение в -(void)viewDidAppear:(BOOL)animated вместо viewWillAppear. viewWillAppear запускается до анимированного изменения представления, и я уверен, что вы хотите, чтобы имя входа всплыло после того, как MemberViewController будет виден.

...