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

Я создаю приложение iPad с controllerом панели вкладок, который требует входа в систему. Поэтому при запуске я хочу показать LoginViewController, и если логин будет успешным, тогда отобразите controller панели вкладок. Вот как я применил начальную тестовую версию (не учтено типичное содержимое заголовка и т. Д.) …

AppDelegate.h:

@interface AppDelegate_Pad : NSObject  { 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 delegate; } @property (nonatomic, assign) id  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 

Таким образом, делегат приложения добавляет представление controllerа входа в систему при запуске и ждет, когда логин вызовет «закончил» с помощью делегата. Контроллер режима входа в систему вызывает removeFromSuperView перед вызовом didFinish. Затем делегат приложения вызывает addSubView в представлении controllerа панели вкладок.

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

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

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

  3. При комментировании «lvc release» все работает, но на консоли отладчика оно записывает это сообщение, когда делегат приложения вызывает addSubView для controllerа панели вкладок: использование двухступенчатой ​​анимации вращения. Чтобы использовать более плавную одноэтапную анимацию, это приложение должно удалить двухэтапные реализации. Что это значит и мне нужно беспокоиться об этом?

ОБНОВЛЕНИЕ: Как было предложено lucius, он изменил его, чтобы модально показать controller входа в систему из делегата приложения. Это, по-видимому, более чистое решение. Код изменился следующим образом …

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]; } 

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

  • iPhone: как передавать данные между несколькими Viewcontrollers в приложении Tabbar
  • Самый простой способ поддержки нескольких ориентаций? Как загрузить пользовательский NIB, когда приложение находится в Landscape?
  • Как я могу совместно использовать объект между UIViewControllers на iPhone?
  • Программный переход на другой controller / сцену просмотра
  • UIView против UIViewController
  • Как добавить subview с собственным UIViewController в Objective-C?
  • Пользовательская анимация для нажатия UIViewController
  • Как заблокировать ориентацию одного controllerа вида в портретном режиме только в Swift
  • Interesting Posts

    Ограниченные проблемы с подключением в сети, нужна помощь в устранении основной причины

    Как восстановить информацию с мертвого жесткого диска?

    Сделайте ASP.NET конвертер WCF в JSON, опустив tags «Key» и «Value»

    Как отключить jusched.exe в Windows 7 64-bit?

    Виртуальная машина (VirtualBox) – Как получить доступ к файлам с хостинга?

    C # => оператор?

    Является ли malloc streamобезопасным?

    Как я могу настроить параметры подключаемого модуля Autocomplete?

    Изображение теряет исходный результат при передаче его другому действию

    Как сжать файлы VHD Windows 7 XP Mode?

    Как перенести каждый файл в дерево в корень дерева?

    Является ли #pragma когда-то частью стандарта C ++ 11?

    Можно ли удалить Android-приложение для удаления?

    Binding ElementName. Использует ли это Визуальное дерево или Логическое дерево

    Являются ли глобальные переменные streamами безопасными в колбе? Как я могу обмениваться данными между запросами?

    Давайте будем гением компьютера.