Подтвердить что ты не робот

Отображение контроллера входа в систему перед основным контроллером панели вкладок

Я создаю приложение 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 в представлении контроллера панели вкладок.

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

  • ГЛАВНЫЙ ВОПРОС: . Правильно ли вы показываете контроллер представления до того, как отобразится контроллер панели основной панели приложения? Хотя, похоже, это работает, правильно ли это сделать?

  • Если я прокомментирую "выпуск lvc" в делете приложения, приложение отключится с EXC_BAD_ACCESS, когда нажата кнопка на контроллере входа в систему. Зачем?

  • С выпуском "lvc release" все заработало, но на консоли отладчика оно записывает это сообщение, когда делегат приложения вызывает 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];
}
4b9b3361

Ответ 1

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