Отображение контроллера вида входа в систему перед контроллером панели вкладок - PullRequest
22 голосов
/ 27 апреля 2010

Я создаю приложение для iPad с контроллером панели вкладок, которое требует входа в систему. Итак, при запуске я хочу показать LoginViewController, а если вход успешный, то показать контроллер панели вкладок. Вот как я реализовал начальную тестовую версию (оставив некоторые типичные заголовки и т. Д.) ...

AppDelegate.h:

@interface AppDelegate_Pad : NSObject 
        <UIApplicationDelegate, LoginViewControllerDelegate> {
    UIWindow *window;
    UITabBarController *tabBarController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@end

AppDelegate.m:

@implementation AppDelegate_Pad
@synthesize window;
@synthesize tabBarController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    LoginViewController_Pad *lvc = [[LoginViewController_Pad alloc] initWithNibName:@"LoginViewController_Pad" bundle:nil];
    lvc.delegate = self;
    [window addSubview:lvc.view];
    //[lvc release];
    [window makeKeyAndVisible];
    return YES;
}
- (void)loginViewControllerDidFinish:(LoginViewController_Pad *)loginViewController {
    [window addSubview:tabBarController.view];
}
- (void)dealloc {...}
@end

LoginViewController_Pad.h:

@protocol LoginViewControllerDelegate;
@interface LoginViewController_Pad : UIViewController {
    id<LoginViewControllerDelegate> delegate;
}
@property (nonatomic, assign) id <LoginViewControllerDelegate> delegate;
- (IBAction)buttonPressed;
@end
@protocol LoginViewControllerDelegate
-(void)loginViewControllerDidFinish:(LoginViewController_Pad *)loginViewController;
@end

LoginViewController_Pad.m:

@implementation LoginViewController_Pad
@synthesize delegate;
    ...
- (IBAction)buttonPressed
{
    [self.view removeFromSuperview];
    [self.delegate loginViewControllerDidFinish:self];
}
    ...
@end

Таким образом, делегат приложения добавляет представление контроллера представления входа в систему при запуске и ожидает входа в систему, чтобы вызвать «завершил» использование делегата. Контроллер вида входа в систему вызывает removeFromSuperView перед вызовом didFinish. Затем делегат приложения вызывает addSubView в представлении контроллера панели вкладок.

Если вы дошли до этого момента, спасибо, и у меня есть три вопроса:

  1. ОСНОВНОЙ ВОПРОС: Является ли это правильным способом отображения контроллера представления перед отображением контроллера панели вкладок основного приложения? Даже если кажется, что это работает, это правильный способ сделать это?

  2. Если я закомментирую «релиз lvc» в делегате приложения, то приложение аварийно завершает работу с EXC_BAD_ACCESS, когда нажата кнопка на контроллере представления входа в систему. Зачем?

  3. С закомментированным «выпуском lvc» все, кажется, работает, но на консоли отладчика оно пишет это сообщение, когда делегат приложения вызывает addSubView для контроллера панели вкладок: Использование двухэтапной анимации вращения. Чтобы использовать более плавную одноэтапную анимацию, это приложение должно удалить двухэтапные реализации методов. Что это значит, и мне нужно беспокоиться об этом?

UPDATE: Как предложил lucius, изменил его, чтобы он модально отображал контроллер представления входа в систему из делегата приложения. Это кажется более чистым решением. Код изменился следующим образом ...

AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];

    LoginViewController_Pad *lvc = [[LoginViewController_Pad alloc] initWithNibName:@"LoginViewController_Pad" bundle:nil];
    lvc.delegate = self;
    [self.tabBarController presentModalViewController:lvc animated:NO];
    [lvc release];

    return YES;
}
-(void)loginViewControllerDidFinish:(LoginViewController_Pad *)loginViewController {
    [self.mainTabBarController dismissModalViewControllerAnimated:NO];
}

LoginViewController_Pad.m:

- (IBAction)buttonPressed
{
    //do NOT removeFromSuperview, delegate will dismiss
    //[self.view removeFromSuperview];
    [self.delegate loginViewControllerDidFinish:self];
}

1 Ответ

3 голосов
/ 27 апреля 2010

Я бы использовал метод для представления контроллера вида модально, вместо добавления его в окно. Это заставит его правильно удерживать контроллер. Сообщение отладчика имеет отношение к определенным методам авторотации, реализуемым в вашем классе. Вы можете игнорировать это сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...