Я создаю приложение 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];
}