Представление определенного контроллера представления от AppDelegate - PullRequest
7 голосов
/ 03 марта 2012

Я пытаюсь представить контроллер представления (представление типа запроса пароля) каждый раз, когда мое приложение становится активным. Как только правильный пароль введен, он должен выскочить из стека. Представление пароля, которое я пытаюсь выдвинуть, не является исходным контроллером представления, поэтому у меня возникают проблемы с доступом к нему из applicationDidBecomeActive из AppDelegate.

Я также попытался выдвинуть представление пароля из ViewWillAppear моего MainViewController, но оно не вызывается, когда приложение становится активным; только при обновлении экрана.

Последние пару дней я исследовал подобные проблемы в SO, но до сих пор не понимаю правильный метод. Я слышал, что я не смогу продвинуть представление таким образом, потому что applicationDidBecomeActive может быть вызван до того, как Storyboard или NavigationController будут подключены / инициализированы / и т. Д.

Если бы кто-нибудь мог предоставить мне правильный способ выдвинуть / представить представление, или если бы было где-то еще, что было бы лучше сделать этот тип вещи, я был бы признателен.

Решено : Я просто удалил представление из раскадровки и вместо него использовал перо. Я использовал:

PasscodeUnlockVC *passcodeUnlock = [[PasscodeUnlockVC alloc] initWithNibName:@"PasscodeUnlockVC" bundle:[NSBundle mainBundle]];
[(UINavigationController *)self.window.rootViewController pushViewController:passcodeUnlock animated:NO];

Просмотр данных иерархии:

(gdb) po [[(id)UIApp keyWindow] recursiveDescription]
<UIWindow: 0x736a4b0; frame = (0 0; 320 480); layer = <UIWindowLayer: 0x7367b40>>
   | <UILayoutContainerView: 0x76977a0; frame = (0 0; 320 480); autoresize = W+H; layer =     <CALayer: 0x769de60>>
   |    | <UINavigationTransitionView: 0x7692110; frame = (0 0; 320 480); clipsToBounds = YES;      autoresize = W+H; layer = <CALayer: 0x769a8c0>>
   |    |    | <UIViewControllerWrapperView: 0x73868d0; frame = (0 64; 320 416); autoresize =  W+H; layer = <CALayer: 0x75510e0>>
   |    |    |    | <UIView: 0x76b93e0; frame = (0 0; 320 416); autoresize = W+H; layer = <CALayer: 0x7386850>>
   |    | <UINavigationBar: 0x73664b0; frame = (0 20; 320 44); clipsToBounds = YES; opaque =  NO; autoresize = W; layer = <CALayer: 0x7366550>>
   |    |    | <UINavigationBarBackground: 0x7360ea0; frame = (0 0; 320 44); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7366520>> - (null)
   |    |    | <UINavigationItemView: 0x76b95e0; frame = (160 21; 0 0); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x76aa8e0>>
   |    |    | <UINavigationItemButtonView: 0x7550650; frame = (5 7; 73 30); opaque = NO;   userInteractionEnabled = NO; layer = <CALayer: 0x7368b40>>
Current language:  auto; currently objective-c
(gdb) 

Ответы [ 4 ]

4 голосов
/ 03 марта 2012

Я предлагаю вам использовать applicationWillEnterForeground:, а не applicationDidBecomeActive:, потому что он лучше работает с многозадачными жестами.Например, вы не хотите открывать экран блокировки, если пользователь дважды щелкает кнопку «Домой» для отображения панели задач, а затем закрывает панель задач без изменения приложений.

Предположительно, ваш AppDelegateимеет свойство window, и вы знаете, что контроллером представления вашего окна является UINavigationController.

- (void)applicationWillEnterForeground:(UIApplication *)application {
    PasscodeViewController *pvc = [[PasscodeViewController alloc] init];
    [(UINavigationController *)self.window.rootViewController pushViewController:pvc animated:NO];
    // [pvc release]; if not using ARC
}
0 голосов
/ 28 сентября 2018

Вот полное решение в Swift 4, реализующее это в didFinishLaunchingWithOptions

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

 let isLogin = UserDefaults.standard.bool(forKey: "Islogin")
    if isLogin{
        self.NextViewController(storybordid: "OtherViewController")


    }else{
        self.NextViewController(storybordid: "LoginViewController")

    }
}

написать эту функцию где угодно внутри Appdelegate.swift

  func NextViewController(storybordid:String)
{

    let storyBoard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let exampleVC = storyBoard.instantiateViewController(withIdentifier:storybordid )
   // self.present(exampleVC, animated: true)
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = exampleVC
    self.window?.makeKeyAndVisible()
}
0 голосов
/ 08 ноября 2016

Быстрая и быстрая версия в обобщенном виде:

getRootViewController().presentViewController(messageVC, animated: true, completion: nil)

func getRootViewController() -> UIViewController
{
    return (UIApplication.sharedApplication().delegate?.window??.rootViewController)!
}
0 голосов
/ 08 ноября 2016

Решено

PasscodeViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"passcodeVCID"]; 
UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:vc];
navController.navigationBar.hidden = YES;
vc.mode = @"enable";
self.window.rootViewController = navController;  

Использование в applicationWillEnterForeground метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...