Я думал, что это легко, как [myWindow resignKeyWindow]
и [self.window makeKeyAndVisible]
, но я не думаю... Вы бы, ребята, знали, что делать?
Спасибо:)
Я думал, что это легко, как [myWindow resignKeyWindow]
и [self.window makeKeyAndVisible]
, но я не думаю... Вы бы, ребята, знали, что делать?
Спасибо:)
Не вызывайте -resignKeyWindow
напрямую, он должен быть переопределен для выполнения некоторого кода при удалении UIWindows. Чтобы удалить старое окно, вам нужно создать новый экземпляр UIWindow и сделать его -makeKeyAndVisible
, старое окно сменит его статус ключа. В iOS 4 даже мусор будет собирать старый UIWindow, если у вас нет ссылок на него. Выполнение этого в iOS 3.x будет иметь катастрофические последствия. Предупрежден я.
Правильный способ скрыть окно - установить для свойства hidden
значение YES. Чтобы удалить его из свойства UIApplication windows
, вы просто отпустите окно (в ARC вы установили все ссылки на нуль).
Конечно, вы хотели бы иметь другое окно на месте в это время.
Вы не можете удалить окно из делегата приложения. Однако вы можете удалить любые созданные пользовательские окна.
Чтобы удалить окно, вы должны сначала предоставить замену. Таким образом, мы получаем окно по умолчанию.
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
Теперь у нас есть доступ к окну по умолчанию через свойство делегата приложения window
.
Теперь получите оригинальный или нестандартный навигационный контроллер. Присвойте себя rootViewController
.
Вызов makeKeyandVisible
удаляет все окна и назначает окно делегата приложения в качестве ключевого окна. Установите rootViewController для контроллера навигации, который вы только что создали, и все готово!
DEMONavigationController *demoNav = [[DEMONavigationController alloc]initWithRootViewController:self];
[appDelegate.window makeKeyAndVisible];
appDelegate.window.rootViewController = demoNav;
Если у вас есть какое-либо окно, кроме окна приложения, используйте его.
let mainWindow = UIApplication.shared.delegate?.window
mainWindow??.makeKeyAndVisible()
Для 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)
}
}
}
}
У меня та же проблема, она может помочь.
Вам нужно уничтожить все сильные ссылки перед удалением и освобождением окон, особенно rootWindowController. Я думаю, что ниже кода достаточно, чтобы удалить любое окно:
[self.window.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
self.window.rootViewController = nil;
[self.window resignKeyWindow];
[self.window removeFromSuperview];