코디네이터 설정 변경 내용

11460 단어 iosswift
내가 한 프로젝트에 조율기 흐름을 설치한 지 이미 한동안 되었다.나의 이전 프로젝트는 이미 세워졌는데, 일단 프로젝트를 시작하는 절차가 세워지면 수정되지 않는다.
코디네이터 모드에 익숙하지 않은 사람들에게는 사용과 설정에 관한 블로그 게시물이 많다.이것은 내가 가장 즐겨 보는 부분이다. 왜냐하면 나는 새로운 프로젝트를 세울 때 항상 복습을 해야 하기 때문이다.
  • Soroush Khanlou - The Coordinator
  • Soroush Khanlou - Coordinator Redux
  • Paul Hudson - How to use the coordinator pattern in iOS apps
  • Ian MacCallum - Coordinators, Routers, and Back Buttons
  • Ray Wenderlich - Coordinator Tutorial in iOS: Getting Started
  • 그래서 지난주에 나는 새로운 예시 프로젝트를 만들기로 결정했지만 AppDelegate에서 var window: UIWindow?를 찾지 못했을 때 얼마나 놀랐는지 상상해 보자.그냥 거기 없어요.

    아포 대표



    새로운 AppDelegate



    AppDelegate와 관련된 일부 의뢰 방법은 애플이 iOS 13을 발표할 때 사용할 수 있는 새로운 파일로 이전되었다는 사실이 증명되었다.SceneDelegateAppDelegate의 차이에 대한 개요는 Understanding the iOS 13 Scene Delegate를 참조하십시오.
    나는 모두에게 이 문장을 읽으라고 강력히 건의하는데, 특히 SceneDelegate의 수정에 관해서는 이 문장을 소개하지 않을 것이다.

    영사관


    info.plist 파일에 창 속성이 포함되어 있습니다.SceneDelegate좋아, 별거 아니야, 내가 여기에 내 조율원을 배치할게.
    역시 안 된다
    알겠습니다. 개발자 문서를 보십시오. var window: UIWindow?는 여전히 부합AppDelegate하지만 의뢰 방법은 이미 바뀌었습니다.이것은 여전히 전송 알림을 등록하고, 이 알림에 응답하며, 응용 프로그램 자체를 목표로 하는 이벤트에 응답하는 파일이지만, 응용 프로그램 장면을 설정할 수 있는 새로운 영역도 있습니다. 구체적으로 말하면, 연결하고 버리는 장면을 설정할 수 있습니다.UIApplicationDelegate 파일은 SceneDelegate에 부합되고 그 자체는 UISceneWindowDelegate에 부합된다.UISceneDelegate 속성은 window과 장면과 관련된 메인 창의 일부분이다.UIWindowSceneDelegate의 관련 함수는 SceneDelegate의 프로토콜 방법이다.장면이 프론트에 들어가고 백엔드에 들어가며 장면에서 발생하는 다른 생명주기 사건을 처리할 때 응용 프로그램이 해야 할 일을 처리한다.
    그러나 UISceneDelegate 속성으로 돌아가면 이 변수를 초기화할 수 있는 새로운 방법이 있다.이전에는 window: UIWindow에서 window 속성을 초기화했습니다.AppDelegate너는 여전히 이렇게 창을 설정할 수 있다.self.window = UIWindow(frame: UIScreen.main.bounds) 여전히 사용할 수 있습니다.그러나 장면에 대한 소개를 통해 애플은 새로운, 첫 번째 선택 방식으로 초기화UIScreen.main.bounds를 할 수 있다는 것을 알게 되었다.
    의뢰 방법UIWindow의 내부에는 다음과 같은 주석이 있다.

    Use this method to optionally configure and attach the UIWindow window to the provided UIWindowScene scene.

    If using a storyboard, the window property will automatically be initialized and attached to the scene.

    This delegate does not imply the connecting scene or session are new (see application:configurationForConnectingSceneSession instead).


    따라서 UIScreen을 사용하여 창 프레임을 초기화하는 것보다 다음과 같이 하십시오.
  • 첫 번째 단계: 위탁 방법에 제공된 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)를 안전하게 열고 scene: UIScene로 전환한다.
  • 두 번째 단계: unwrappedUIWindowScene를 사용하여 초기화window 속성을 사용합니다.
  • 3단계: 설정UIWindowScene 속성, 이 속성은 현재 UIWindow에서 찾을 수 있으며 첫 번째 단계의 전개windowScene를 포함한다.
  • 세 번째 단계는 매우 중요하다. 만약 이 단계를 놓치면 프로그램을 실행할 때 공백 화면만 나타날 수 있기 때문이다.
    코드에서는 다음과 같습니다.
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene) else { return }
        let uiWindow = UIWindow(frame: windowScene.coordinateSpace.bounds)
        self.window = uiWindow
        self.window?.windowScene = windowScene
    }
    
    지금까지 나는 실제 조율원에 관한 어떤 것도 언급하지 않았다.창을 초기화하면 조정기가 매우 간단하기 때문에 나는 둘을 분리하고 싶다.
    먼저, 프로토콜부터...:)
    protocol Coordinator {
        func start()
    }
    
    다음에 프로토콜에 맞는 응용 프로그램 조정기를 만듭니다.(위의 링크Ray Wenderlich blog post를 예로 AppCoordinator를 사용하고 있습니다.)
    class AppCoordinator: Coordinator {
        let window: UIWindow
        let rootViewController: UINavigationController
    
        init(_ window: UIWindow) {
        self.window = window
        rootViewController = UINavigationController()
    
        let mainVC = MainViewController()
        rootViewController.pushViewController(mainVC, animated: true)
        }
    
        func start() {
        window.rootViewController = rootViewController
        window.makeKeyAndVisible()
        }
    }
    
    이후 windowScene에서 앞서 언급한 위탁 방법만 수정하면 된다.
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene) else { return }
        let uiWindow = UIWindow(frame: windowScene.coordinateSpace.bounds)
        self.window = uiWindow
        self.window?.windowScene = windowScene
    
        let appCoordinator = AppCoordinator(uiWindow)
        self.appCoordinator = appCoordinator
        appCoordinator.start()
    }
    
    스토리보드를 사용하지 않고 프로그램을 설정하는 것을 선택했습니다.줄거리 요약에 대한 인용을 삭제하려면 SceneDelegateSceneConfiguration에서 주요 줄거리 요약을 찾을 수 있습니다.응용 프로그램 목표plist에서 삭제하는 것만으로는 부족합니다.

    원한다면 스토리보드에서 코디네이터를 사용할 수 있습니다. (위에 링크된 Paul Hudson 글 참조)

    좋은 웹페이지 즐겨찾기