iPhone: Как сделать прокси-контроллер, который может выбирать разные представления + контроллеры - PullRequest
0 голосов
/ 27 мая 2010

У меня есть приложение с TabBar.

Одно из представлений, связанных с TabBar, фактически является переменным:

При первом открытии этого представления оно должно показать диалог входа в систему.Если пользователь входит в систему, представление входа в систему завершается и отображается фактическое представление данных.

Позже, если пользователь вернется на эту вкладку, представление данных должно появиться сразу, поэтому больше не будет диалогового окна входа..

До сих пор я решал эту проблему, непосредственно манипулируя массивом контроллера контроллера представления элемента панели вкладок: изначально он настроен на отображение представления входа в систему.Как только пользователь вошел в систему, контроллер входа удаляется из контроллера навигации и вместо него вставляется фактическое представление данных.

Однако я не доволен этим решением, поскольку оно вызывает проблемы, если их больше, чем5 элементов вкладки.

Следовательно, мне интересно, как я могу избежать "исправления" этого контроллера навигации и вместо этого иметь новый корневой контроллер для этой вкладки, который затем либо вызовет представление входа в систему, либо сразу отобразит представление данных.

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

Как бы мне этого добиться?

Или есть другие концепции?Я использую здесь использование?

Ответы [ 2 ]

0 голосов
/ 29 января 2013

Thomas:> Для этого требуется, чтобы контроллер обрабатывал обе функции в одном классе

Более чистым подходом может быть создание класса прокси-контроллера. Класс будет использовать класс входа в систему и класс отображения данных и будет переключать функциональность между ними внизу. Пользователь класса не скажет никакой разницы.

0 голосов
/ 28 мая 2010

Мое предложение будет иметь два совершенно разных контроллера представления. После завершения входа в систему измените массив контроллера представления панели вкладок, удалив контроллер представления входа в систему и добавив контроллер представления содержимого. Примерно так:

- (void) didLogin {
    UITabBarController *tabBarController = self.tabBarController;
    NSMutableArray *array = [NSMutableArray arrayWithARray:tabBarController.viewControllers];
    int idx = [array indexOfObject:self];
    UIViewController *contentViewController = //Create or get a chached copy of the content view controller
    //Optionally here you could copy the tab bar item rather than setting it up within the contentViewController.
    contentViewController.tabBarItem = self.tabBarItem;
    [array replaceObjectAtIndex:idx withObject:contentViewController];
    tabBarController.viewControllers = array;
    tabBarController.selectedViewController = contentViewController;
}

Редактировать:

Если вы находитесь в дополнительном контроллере вида, он автоматически определяет, показывает ли он навигационный контроллер при обычном выборе вкладки. Если вы делаете это программно, я думаю, вам нужно сделать то же самое, но вручную. Примерно так:

- (void) didLogin {
    UITabBarController *tabBarController = self.tabBarController;
    NSMutableArray *array = [NSMutableArray arrayWithARray:tabBarController.viewControllers];
    if (array.count > 5 && [array indexOfObject:self] >= 5) {
        [tabBarController popToRootViewControllerAnimated:NO];
        [tabBarController.moreNavigationController pushViewController:contentViewController animated:NO];
        //Note: Not sure if this next line should be contentViewController or moreNavigationController.
        tabBarController.selectedViewController = contentViewController;
    } else {
        //Normal method above
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...