1

Мое приложение имеет корень ViewController, который в начале Приложение отображаетМодальные ViewController UI не реагирует после presentViewController: анимированный: завершение:

  • просмотреть Войти ViewController если пользователь не вошел в систему
  • основной вид ViewController если пользователь вошел в систему

AppDelegate код:

- (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 представлена.

Проблема заключается в том, что после представления main 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! 
+0

Где находится метод просмотра, который вы перестроили? В делегате приложения? Я чувствую, что динамическое возвращение такого вида не является правильным. Вы всегда должны указывать или представлять свой следующий контроллер представлений, который каркас должен автоматически отображать для вас, вам не нужно указывать, какой вид его представить. – feliun

+0

@feliun, просмотрите мой обновленный ответ. Я не упомянул, что раньше использовал этот подход в нескольких приложениях, и он работал безупречно. Это первый раз, когда я получил эту ошибку. – NikGreen

ответ

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; 
} 
+1

ОК, через пару часов я обнаружил, что проблема была вызвана индикатором багги. Я приму свой ответ, но я все же считаю, что мой подход также жизнеспособен. Спасибо за ваше время, @feliun! – NikGreen

Смежные вопросы