Подтвердить что ты не робот

Как удалить UIWindow?

Я думал, что это легко, как [myWindow resignKeyWindow] и [self.window makeKeyAndVisible], но я не думаю... Вы бы, ребята, знали, что делать?

Спасибо:)

4b9b3361

Ответ 1

Не вызывайте -resignKeyWindow напрямую, он должен быть переопределен для выполнения некоторого кода при удалении UIWindows. Чтобы удалить старое окно, вам нужно создать новый экземпляр UIWindow и сделать его -makeKeyAndVisible, старое окно сменит его статус ключа. В iOS 4 даже мусор будет собирать старый UIWindow, если у вас нет ссылок на него. Выполнение этого в iOS 3.x будет иметь катастрофические последствия. Предупрежден я.

Ответ 2

Правильный способ скрыть окно - установить для свойства hidden значение YES. Чтобы удалить его из свойства UIApplication windows, вы просто отпустите окно (в ARC вы установили все ссылки на нуль).

Конечно, вы хотели бы иметь другое окно на месте в это время.

Ответ 3

Вы не можете удалить окно из делегата приложения. Однако вы можете удалить любые созданные пользовательские окна.

Чтобы удалить окно, вы должны сначала предоставить замену. Таким образом, мы получаем окно по умолчанию.

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

Теперь у нас есть доступ к окну по умолчанию через свойство делегата приложения window.

Теперь получите оригинальный или нестандартный навигационный контроллер. Присвойте себя rootViewController.

Вызов makeKeyandVisible удаляет все окна и назначает окно делегата приложения в качестве ключевого окна. Установите rootViewController для контроллера навигации, который вы только что создали, и все готово!

DEMONavigationController *demoNav = [[DEMONavigationController alloc]initWithRootViewController:self];
[appDelegate.window makeKeyAndVisible];
appDelegate.window.rootViewController = demoNav;

Ответ 4

Если у вас есть какое-либо окно, кроме окна приложения, используйте его.

let mainWindow = UIApplication.shared.delegate?.window
mainWindow??.makeKeyAndVisible()

Ответ 5

  Для iOS 13 я смог сделать это таким образом

Я создал массив, содержащий окно, в котором представлен этот новый viewController,

var arrWindow = [UIWindow]()
arrWindow.append(yourNewWindow)

//Примечание: это будет сохранено как сильная ссылка, поэтому необходимо удалить его.

Также сохраните исходное окно в переменной

let originalWindow = yourOriginalWindow

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

На момент удаления есть много способов сделать это, но это был самый подходящий способ для меня,

 func removeAppendedWindow() {

     for window in arrWindow {
         if window != originalWindow {
              if let index = arrWindow.index(of: window) {
                  window.isHidden = true
                  arrWindow.remove(at: index)
              }
         }
     }
}

Ответ 6

У меня та же проблема, она может помочь.

Вам нужно уничтожить все сильные ссылки перед удалением и освобождением окон, особенно rootWindowController. Я думаю, что ниже кода достаточно, чтобы удалить любое окно:

[self.window.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
self.window.rootViewController = nil;
[self.window resignKeyWindow];
[self.window removeFromSuperview];