Как удалить UIWindow?
Я думал, что это легко, как [myWindow resignKeyWindow]
и [self.window makeKeyAndVisible]
, но я не думаю... Вы бы, ребята, знали, что делать?
Спасибо:)
Ответы
Ответ 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];