Cloud Kit와 함께 Core Data를 사용하고 있으므로 응용 프로그램 시작 중에 iCloud 사용자 상태를 확인해야합니다. 문제가 발생하면 사용자에게 다이얼로그를 발행하고 싶은데 UIApplication.shared.keyWindow?.rootViewController?.present(...)
지금까지 사용 하고 있습니다.
Xcode 11 베타 4에는 이제 다음과 같은 새로운 지원 중단 메시지가 있습니다.
‘keyWindow’는 iOS 13.0에서 더 이상 사용되지 않음 : 연결된 모든 장면에서 키 창을 반환하므로 여러 장면을 지원하는 응용 프로그램에 사용해서는 안됩니다.
대신 대화를 어떻게 표시해야합니까?
답변
이것이 내 해결책입니다.
let keyWindow = UIApplication.shared.connectedScenes
.filter({$0.activationState == .foregroundActive})
.map({$0 as? UIWindowScene})
.compactMap({$0})
.first?.windows
.filter({$0.isKeyWindow}).first
사용 예 :
keyWindow?.endEditing(true)
답변
받아 들여지는 대답은 독창적이지만 지나치게 정교 할 수 있습니다. 훨씬 더 간단하게 정확히 동일한 결과를 얻을 수 있습니다.
UIApplication.shared.windows.filter {$0.isKeyWindow}.first
또한의 지원 중단이 keyWindow
지나치게 심각하게 받아 들여서 는 안된다는 점에주의하겠습니다 . 전체 경고 메시지는 다음과 같습니다.
‘keyWindow’는 iOS 13.0에서 더 이상 사용되지 않음 : 연결된 모든 장면에서 키 창을 반환하므로 여러 장면을 지원하는 응용 프로그램에 사용해서는 안됩니다.
따라서 iPad에서 여러 창을 지원하지 않는 경우 계속해서 사용하는 데 이의가 없습니다 keyWindow
.
답변
Matt의 탁월한 답변을 약간 개선하면 더 간단하고 짧고 우아합니다.
UIApplication.shared.windows.first { $0.isKeyWindow }
답변
다음은 이전 버전과 호환되는 감지 방법입니다 keyWindow
.
extension UIWindow {
static var key: UIWindow? {
if #available(iOS 13, *) {
return UIApplication.shared.windows.first { $0.isKeyWindow }
} else {
return UIApplication.shared.keyWindow
}
}
}
용법:
if let keyWindow = UIWindow.key {
// Do something
}
답변
Objective-C 솔루션의 경우
+(UIWindow*)keyWindow
{
UIWindow *foundWindow = nil;
NSArray *windows = [[UIApplication sharedApplication]windows];
for (UIWindow *window in windows) {
if (window.isKeyWindow) {
foundWindow = window;
break;
}
}
return foundWindow;
}
답변
일반적으로 사용
스위프트 5
UIApplication.shared.windows.filter {$0.isKeyWindow}.first
또한 UIViewController에서 :
self.view.window
view.window
cenes의 현재 창입니다.
주요 창
- 수동으로 창 추적
답변
이상적으로는 더 이상 사용되지 않기 때문에 SceneDelegate에 창을 저장하는 것이 좋습니다. 그러나 임시 해결 방법을 원하면 필터를 만들고 이와 같이 keyWindow를 검색 할 수 있습니다.
let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first