[uikit] 해결 방법 : ‘keyWindow’는 iOS 13.0에서 더 이상 사용되지 않습니다.

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의 현재 창입니다.

WWDC 2019 :
여기에 이미지 설명 입력

주요 창

  • 수동으로 창 추적


답변

이상적으로는 더 이상 사용되지 않기 때문에 SceneDelegate에 창을 저장하는 것이 좋습니다. 그러나 임시 해결 방법을 원하면 필터를 만들고 이와 같이 keyWindow를 검색 할 수 있습니다.

let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first