Objective-C 코드베이스에서 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())
UIHostingController
는 UIViewController
의 하위 클래스이며 이제 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
가 있습니다. 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"
당신이 나와 같은 상황에 처해 있다면 이 글이 당신에게 도움이 되기를 바랍니다.
Reference
이 문제에 관하여(Objective-C 코드베이스에서 SwiftUI 보기 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/daholino/display-swiftui-views-from-objective-c-codebase-15o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)