Показ входа в систему просматривает контроллер перед основным контроллером панели вкладок

Я создаю приложение для 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 для контроллера панели вкладок: Используя двухэтапную анимацию вращения. Для использования более гладкой одноступенчатой анимации это приложение должно удалить двухэтапные реализации метода. Что это означает, и я должен волноваться об этом?

ОБНОВЛЕНИЕ: Как предложено 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];
}
22
задан 27 April 2010 в 17:44
поделиться

1 ответ

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

3
ответ дан 29 November 2019 в 06:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: