iOS — Будет ли ViewController освобожден после его удаления с родительского контроллера?

#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()
  

Ссылка: Удаление дочернего контроллера просмотра.