#ios #objective-c #iphone #uiview #uiviewcontroller
#iOS #objective-c #iPhone #uiview #uiviewcontroller
Вопрос:
Я работаю над приложением с регистрацией / входом в систему.
Мой корневой контроллер является UITabBarController
.
Каждая вкладка является контроллером просмотра по отдельности.
Я хочу сделать один из них вкладкой входа.
Каждый раз, когда приложение запускается и пользователь переключается на эту вкладку, оно проверяет, вошел ли пользователь в систему. Если нет, он представляет контроллер регистра, в то время как он представляет контроллер входа при входе пользователя в систему.
Для реализации этой функции я писал два вида контроллеров отдельно (регистр один и журналов).
Чтобы соответствовать стилю MVC, я также создаю два класса UIView для рендеринга представления.
Подводя итог, структура
root viewcontroller(UITabBarController) -> user tab controller(UIViewController) -> login/register view controller(UIViewController -> login/register view(UIView)
login/register controller
является childViewController из user tab controller
.
После регистрации пользователя я хочу, чтобы он register controller
был удален из user tab controller
, который является его родительским контроллером.
Когда я обрабатываю событие касания в представлении (UIView), я создаю в нем протокол и делаю пользовательский контроллер вкладки его делегатом.
Когда регистрация завершена, представление сообщает делегату удалить его дочерний контроллер.
#pragma mark - RegViewDelegate
-(void)parentViewControllerPop{
[_cRegController removeFromParentViewController];
NSLog(@"_cRegController removed from parent viewcontroller");
}
Однако после этого представление все еще отображается на экране, почему?
Я не думаю, что дизайн является хорошим, но я не знаю, каков наилучший способ реализовать то, что я хочу.
Кто-нибудь может помочь?
Комментарии:
1. Почему он все еще не будет отображаться на экране? Вы больше ничего не отобразили.
2. Почему вы используете контроллер панели вкладок? Используя навигационный контроллер, вы можете нажимать и всплывать контроллеры views, чтобы он не был доступен в стеке view.
3. @Tibrogargan Я думаю, поскольку view является подвидом контроллера регистра, представление будет удалено вместе с контроллером регистра. Как только контроллер регистра не будет дочерним по отношению к контроллеру вкладок, он исчезнет.
4. @Jinglei. Y Это не имеет никакого отношения к удалению его с контроллера. Если вы не удалите его из вида / окна, он будет продолжать отображаться до тех пор, пока вы его не замените. Как только это произойдет, он может быть освобожден, если на него нет ссылок в другом месте, но простое удаление его из родительского контроллера не будет иметь большого эффекта вообще.
5. @Aneesh Я использую контроллер панели вкладок только потому, что хочу размещать разные вещи в разных разделах. Точно так же, как есть вкладка «Главная» и вкладка «Настройки». И я использую дочерний контроллер на вкладке, потому что я думал, что это делает приложение более «модульным», хотя я не знаю, хороший это способ или нет (я не читал много другого кода, поэтому я не знаю, как разработчики обычно это делают).
Ответ №1:
Чтобы удалить дочерний контроллер просмотра из его родительского, вам нужно выполнить следующие 3 шага:
viewController.willMoveToParentViewController(nil)
viewController.view.removeFromSuperview()
viewController.removeFromParentViewController()