Я создаю приложение для 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 для контроллера панели вкладок: Используя двухэтапную анимацию вращения. Для использования более гладкой одноступенчатой анимации это приложение должно удалить двухэтапные реализации метода. Что это означает, и я должен волноваться об этом?
ОБНОВЛЕНИЕ: Как предложено 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];
}
Я бы использовал этот метод для модального представления контроллера представления вместо того, чтобы добавлять его в окно. Это заставит его правильно удерживать контроллер. Сообщение отладчика связано с определенными методами авторотации, реализованными в вашем классе. Вы можете пока игнорировать это.