Objective-C 코드베이스에서 SwiftUI 보기 표시

6824 단어 iosobjcswiftuiswift
SwiftUI는 새로운 주요 iOS 릴리스가 나올 때마다 더욱 성숙해지고 있으며 이제 많은 사용 사례에 사용할 수 있는 상태에 있습니다. 일상 업무에서 작업하는 앱은 Objective-C를 기반으로 하며 더 빠르고 재미있기 때문에 SwiftUI에서 몇 가지 프로토타입을 만들고 싶었습니다. 또한 UIKit에서 잠시 벗어나 SwiftUI에 대해 자세히 알아볼 수 있는 좋은 방법이기도 했습니다. 즉, Objective-C ViewControllers에서 SwiftUI 보기를 표시해야 했습니다. 이 기사에서는 내가 어떻게했는지 설명합니다.

SwiftUI와 관련하여 Objective-C와 Swift 사이에는 몇 가지 제한 사항이 있습니다. SwiftUI 보기는 구조체이며 Objective-C 코드에서 볼 수 없습니다. 두 세계를 연결하는 유일한 방법은 Objective-C와 Swift 코드 사이에 일종의 중재자 클래스를 사용하는 것입니다.

SwiftUI 및 UIKit



UIKit에서 SwiftUI 뷰를 표시할 것이기 때문에 먼저 SwiftUI 뷰를 래핑하는 데 사용할 추상화를 알아야 합니다. UIKit은 인스턴스만 표시하거나 푸시할 수 있습니다UIViewController. SwiftUI 보기에서 UIViewController 인스턴스를 생성하려면 인스턴스를 UIHostingController 로 래핑해야 합니다. UIHostingController 이니셜라이저에서 우리는 아래 예제와 같이 래핑하려는 SwiftUI 보기를 전달합니다.

let controller = UIHostingController(rootView: SwiftUIView())

UIHostingControllerUIViewController의 하위 클래스이며 이제 controller 변수를 UIKit 코드에서 사용하여 표시하거나 내비게이션 스택에 푸시하거나 자식 뷰 컨트롤러로 추가할 수 있습니다. UIHostingController here에 대해 자세히 읽을 수 있습니다.

믹스에 Obj-C 추가



이제 UIKit 내부에 SwiftUI 보기를 표시하는 방법을 알았으므로 Objective-C 세계에 연결UIHostingController해야 합니다. 앞에서 언급했듯이 Swift 구조체는 Objective-C 컨텍스트에서 볼 수 없으므로 SwiftUI 보기를 감싸는 인스턴스를 생성할 중개자를 추가해야 합니다UIHostingController.

I like to call the middleman implementations as SwiftUIViewAdapter or SwiftUIViewFactory. I am still not settled on a final suffix but something between these two seems right.



초기자에 전달되는 텍스트를 표시하는 간단한 SwiftUI 보기부터 시작하겠습니다.

import SwiftUI

struct HelloWorldView: View {

    var text: String

    init(text: String) {
        self.text = text
    }

    var body: some View {
        Text(text)
    }
}

HelloWorldView를 표시하려면 UIHostingController를 생성할 중개자 클래스로 래핑해야 합니다.

@objc class HelloWorldViewFactory: NSObject {

    @objc static func create(text: String) -> UIViewController {
        let helloWorldView = HelloWorldView(text: text)
        let hostingController = UIHostingController(rootView: helloWorldView)

        return hostingController
    }
}


위의 HelloWorldViewFactory 클래스 구현에서 몇 가지 일이 발생하므로 하나씩 살펴보겠습니다.
  • HelloWorldViewFactory 클래스에는 create(text:)를 생성하고 초기화하고 HelloWorldView 안에 래핑하고 반환하는 하나의 정적 함수UIHostingController가 있습니다.
  • Objective-C 코드에 HelloWorldViewFactory를 노출하려면 @objc 주석 접두사를 붙여야 하고 NSObject 하위 클래스를 만들어야 합니다. 이는 NSObject가 대부분의 Objective-C 클래스 계층 구조의 루트 클래스이기 때문입니다. 여기에서 하위 클래스는 런타임 시스템에 대한 기본 인터페이스와 Objective-C 개체로 작동하는 기능을 상속받습니다.
  • 텍스트 문자열 인수를 create 함수에 전달하고 있음을 알 수 있습니다. 이를 통해 SwiftUI 보기에 대한 사용자 지정 초기화를 사용하고 보기에 필요한 종속성을 전달할 수 있습니다.

  • 이제 Objective-C에서 이 보기를 다음과 같이 표시할 수 있습니다.

    UIViewController *vc = [HelloWorldViewFactory createWithText:@"Hello from Obj-C!"];
    [self presentViewController:vc animated:YES completion:nil];
    


    이 예에서 장치는 텍스트가 중앙에 있고 Hello from Obj-C!로 설정된 보기를 표시해야 합니다.



    Swift 코드를 Objective-C로 가져오기



    기존 Objective-C 프로젝트에서 Swift를 사용하지 않은 경우 Swift 코드를 사용할 Objective-C 파일로 Swift 모듈 헤더를 가져와야 한다는 것을 아는 것이 중요합니다. 해당 헤더 파일의 이름은 $(SWIFT_MODULE_NAME)-Swift.h와 같으며 원하는 경우 대상에 대한 빌드 설정 내에서 해당 헤더 파일의 이름을 변경할 수 있습니다. 이름을 정의하는 구성 옵션은 Objective-C Generated Interface Header Name입니다.

    앱 대상이 호출되면MyTestApp 다음과 같이 Swift 코드를 Objective-C로 가져올 수 있습니다.

    #import "MyTestApp-Swift.h"
    


    당신이 나와 같은 상황에 처해 있다면 이 글이 당신에게 도움이 되기를 바랍니다.

    좋은 웹페이지 즐겨찾기