Squeak.ru - шаблоны программирования

UIWindow setRootViewController не очищает существующую иерархию

В моем приложении я программно меняю контроллеры корневого представления на основе действий пользователя, например. функция входа / выхода.

В iOS 8 - замечаю странную проблему. Даже после установки rootViewController в окне старая иерархия все еще сохраняется. Я только что проверил это, зафиксировав иерархию представлений.

- (void) logout{
     [self.window setRootViewController:[self loadLoginView]];
}

-(UIViewController *) loadLoginView{
      WelcomeScreenVC *wsVC;
      wsVC = [[WelcomeScreenVC alloc] initWithNibName:@"WelcomeScreenVC" bundle:nil];
      UINavigationController *onboardingVC = [[UINavigationController alloc]initWithRootViewController:wsVC];
      return onboardingVC;
 }

Даже после выполнения этой строки кода старая иерархия представлений, вошедших в систему, все еще сохраняется. Был бы признателен, если бы кто-нибудь мог предположить, что происходит за кулисами.

Изменить: я только что посмотрел документацию UIWindow setRootViewController, и вот что Apple должна сказать об этом:

Контроллер корневого представления обеспечивает представление содержимого окна. Назначение контроллера представления этому свойству (программно или с помощью Interface Builder) устанавливает представление контроллера представления как представление содержимого окна. Если окно имеет существующую иерархию представлений, старые представления удаляются перед установкой новых.

07.11.2014

  • Не могли бы вы поделиться кодом для [self loadLoginView]? 07.11.2014
  • @JoshHeald добавил это к вопросу 07.11.2014
  • Это скопировано напрямую из вашего приложения или вы его набрали? Я спрашиваю, потому что loadLoginView объявляет тип возвращаемого значения void, что не поможет. 07.11.2014
  • @JoshHeald, извините, я скопировал его из приложения, но удалил некоторую конфиденциальную информацию во время редактирования. Тип возврата этого метода - UIViewController. 07.11.2014
  • нет проблем. Я изо всех сил пытаюсь воссоздать это, но хотел знать, как вы проверяете иерархию - вы говорите, что проверили это, захватив иерархию представлений, используется ли это новый отладчик иерархии представлений Xcode 6 или какие-то другие средства? 07.11.2014
  • @JoshHeald да, я использовал отладчик иерархии представлений Xcode 6 07.11.2014
  • Давайте продолжим это обсуждение в чате. 07.11.2014
  • Для меня эта проблема возникает, если я представляю что-то github.com/onmyway133/notes/issues/251 13.12.2016

Ответы:


1

Я заметил то же самое.

По сути, у меня есть довольно сложная раскадровка, которая действует как интерфейс входа / приветствия. Этот интерфейс находится в контроллере навигации, который модально представляет другой контроллер навигации.

После определенного момента пользователь выполняет действие, которое переводит его в основной интерфейс. Используя отладчик представлений iOS 8, я заметил, что старая иерархия представлений все еще сохранялась после установки свойства rootViewController окна.

Мое решение на данный момент - использовать следующий код непосредственно перед повторной проверкой свойства window.rootViewController:

for (UIView* subView in self.window.rootViewController.view.subviews) {
    [subView removeFromSuperview];
}
[self.window.rootViewController.view removeFromSuperview];

Это некрасиво, но работает.

Еще одна странная вещь, которую я заметил, - это то, что модально представленный viewController интерфейса приветствия не очищается должным образом с помощью этого метода. Я должен вручную отклонить его И выполнить эту очистку.

02.12.2014
  • похоже, это работает с точки зрения отображаемого пользовательского интерфейса, но на правильном экране теперь по какой-то причине не включено взаимодействие ... поэтому я не могу нажать ни одну из кнопок или текстовых полей ... есть идеи? Раньше у меня была аналогичная проблема, когда правильный пользовательский интерфейс не отображался, а предыдущий пользовательский интерфейс несколько не отвечал, поэтому элементы панели вкладок показывали, что они выбраны, но не выполняли какие-либо из своих изменений. 19.12.2014
  • Получил альтернативное решение для моей ситуации, когда замена контроллера корневого представления во время выполнения длинного набора сетевых подключений, в конечном итоге я бы остался со старым пользовательским интерфейсом (если бы я был достаточно быстрым), с функциональными кнопками, но с кнопками панели вкладок не меняет вид контроллера вкладки. CGRect windowFrame = self.window.frame; self.window.rootViewController = ноль; self.window = ноль; UIWindow * newWindow = [[выделение UIWindow] initWithFrame: windowFrame]; [newWindow makeKeyAndVisible]; self.window = newWindow; 02.02.2015

  • 2

    Лучший способ исправить:

    self.window.subviews.forEach { $0.removeFromSuperview() }
    

    или, по старинке:

    for view in self.window.subviews {
       view.removeFromSuperview()
    }
    
    13.03.2019

    3
    var loginNavigationController: OnBoardViewController?{
        willSet{
            if newValue == nil {
                loginNavigationController?.view.removeFromSuperview()
            }
        }
    }
    

    loginNavigationController = nil Затем установите window.rootviewcontroller = {Другой VC}

    27.07.2018
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

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

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