Пользовательский интерфейс модального контроллера просмотра не отвечает после presentViewController:animated:completion:

В моем приложении есть корневой контроллер просмотра, который в начале приложения отображает

  • вход в представление viewController, если пользователь не вошел в систему
  • главное представление viewController, если пользователь вошел в систему

Код делегата приложения:

- (BOOL)              application: (UIApplication*) application
    didFinishLaunchingWithOptions: (NSDictionary*) launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];

    self.window.rootViewController = [[RootViewController alloc] init];

    [self.window makeKeyAndVisible];

    return YES;
}

Вот код, используемый в RootViewController:

@implementation RootViewController

- (void) loadView
{
   [super loadView];

   // here mainViewController and loginNavigationController are initialized
}

...

- (UIView*) view
{   
   [super view]; // this invokes loadView

    return self.isLoggedIn ? self.mainViewController.view : 
                             self.loginNavigationController.view;
}

....

- (void) userDidLogin
{
     [self.loginNavigationController presentViewController: self.mainViewController 
                                                  animated: YES 
                                                completion: nil];
}
@end

Если пользователь не вошел в систему и нажимает кнопку входа, отображается основной viewController.

Проблема в том, что после представления основного viewController я не могу взаимодействовать ни с одним из элементов пользовательского интерфейса. Например, у меня есть tableView в качестве подвида основного viewController, и когда я пытаюсь его прокрутить, я получаю следующее предупреждение в панели отладки:

 <UITableView: 0x202a4000; frame = (0 0; 310 548); clipsToBounds = YES;
 gestureRecognizers = <NSArray: 0x1fd9f570>; layer = <CALayer: 0x1fdccff0>;
 contentOffset: {0, 0}>'s window 
 is not equal to <RootViewController: 0x1fd9f7d0>'s view's window!

person NikGreen    schedule 16.07.2013    source источник
comment
Где находится метод просмотра, который вы переопределили? В делегате приложения? Я чувствую, что динамический возврат представления не является правильным способом. Вы всегда должны нажимать или представлять свой следующий контроллер представления, который фреймворк должен автоматически отображать для вас, вам не нужно указывать ему, какое представление представлять.   -  person feliun    schedule 16.07.2013
comment
@feliun, пожалуйста, просмотрите мой обновленный ответ. Я не упомянул, что уже использовал этот подход в нескольких приложениях, и он работал безупречно. Это первый раз, когда я получил эту ошибку.   -  person NikGreen    schedule 16.07.2013


Ответы (1)


Итак, просмотрев обновленный код, я вижу, что у вас есть rootViewController, и вы динамически предоставляете представление, которое, по вашему мнению, должно быть представлено. Дело в том, что rootViewController отвечает за корневое представление, в то время как ваши два других контроллера представления управляют своими собственными представлениями. Вы не должны отключать представление другого контроллера представления.

Итак, в конце концов, похоже, что вы хотите условно установить свой rootviewcontroller. Итак, давайте посмотрим на делегат приложения. Я думаю, вы должны заставить своего делегата приложения делать что-то подобное. Пусть он определит во время выполнения, какой viewcontroller представить. Затем сделайте это rootviewcontroller для приложения.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIViewController * resolvedRootViewController = [self someMethodThatCorrectlyGivesRootViewController];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = resolvedRootViewController;
    [self.window makeKeyAndVisible];

    return YES;
}
person feliun    schedule 16.07.2013
comment
ОК, через пару часов я обнаружил, что проблема была вызвана глючным индикатором активности. Я приму ваш ответ, но я все еще думаю, что мой подход также жизнеспособен. Спасибо за ваше время, @feliun! - person NikGreen; 16.07.2013