Я создаю приложение для 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» все, кажется, работает, но на консоли отладчика оно пишет это сообщение, когда делегат приложения вызывает 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];
}