Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Clean Code
- clean architecture
- Protocol
- map
- SWIFT
- uitableview
- combine
- HIG
- UITextView
- Refactoring
- 리팩토링
- UICollectionView
- ios
- Observable
- RxCocoa
- 리펙터링
- Xcode
- uiscrollview
- collectionview
- swift documentation
- swiftUI
- 리펙토링
- rxswift
- ribs
- MVVM
- 클린 코드
- tableView
- 스위프트
- Human interface guide
- 애니메이션
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - SwiftUI] UIHostingController 사용 방법 (UIKit에서 SwiftUI 사용 방법) 본문
iOS 기본 (SwiftUI)
[iOS - SwiftUI] UIHostingController 사용 방법 (UIKit에서 SwiftUI 사용 방법)
jake-kim 2022. 10. 25. 23:24
cf) SwiftUI에서 UIKit 사용 방법은 이전 포스팅 글 (UIViewRepresentable) 참고
UIHostingController 란?
- UIKit에서 SwiftUI 뷰를 사용하고 싶을때 사용
- UIHostingController 코드를 보면 UIViewController를 상속받고 있는 형태
- 동시에 SwiftUI의 View형태를 준수
- UIKit에서 SwiftUI 사용 원리
- SwiftUI 뷰를 생성
- HostingController를 만들고, 이곳의 제네릭스 타입에 위에서 생성한 뷰로 지정 (SwiftUI를 UIKit에서 접근 할 수 있도록 wrapping하는 작업)
- UIKit에서 HostingController를 불러와서 사용
open class UIHostingController<Content> : UIViewController where Content : View {
UIKit에서 SwiftUI 사용하기
예제 내용) UIKit ViewController에서 present하여 SwiftUI의 뷰(HostingController) 띄우기
- 프로젝트 생성 > Interface를 SwiftUI가 아닌 Storyboard로 생성
- UIKit에서 띄울 SwiftUI뷰 추가
import SwiftUI
struct MySwiftUIView: View {
var body: some View {
VStack {
Text("SwiftUI 뷰")
Text("Hello, World!")
}
}
}
struct MySwiftUIView_Previews: PreviewProvider {
static var previews: some View {
MySwiftUIView()
}
}
- SwiftUI 뷰를 UIKit에서 접근할 수 있도록 wrapping해주는 HostingController 추가 & 제네렉스 타입에 위에서만든 MySwiftUIView 지정
import UIKit
import SwiftUI
// 제네릭스 타입에 SwiftUI 뷰를 넣어주기만하면 완성
final class MyHostingController: UIHostingController<MySwiftUIView> {
}
- UIKit의 ViewController에 특정 버튼을 눌렀을때 SwiftUI를 띄워야하므로 버튼 준비
// ViewController.swift
import UIKit
class ViewController: UIViewController {
private let button: UIButton = {
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("버튼", for: .normal)
button.setTitleColor(.systemBlue, for: .normal)
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
button.addTarget(self, action: #selector(tapButton), for: .touchUpInside)
view.addSubview(button)
NSLayoutConstraint.activate([
button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
button.centerYAnchor.constraint(equalTo: view.centerYAnchor),
])
}
@objc private func tapButton() {
}
}
- tapButton() 메소드 구현
- 단순히 위에서 SwiftUI 뷰를 wrapping한 MyHostingController를 일반 UIViewController 처럼 사용
- HostingController를 초기화할땐 rootView에 SwiftUI뷰를 주입
@objc private func tapButton() {
present(MyHostingController(rootView: MySwiftUIView()), animated: true)
}
* 전체 코드: https://github.com/JK0369/ExHostingController-SwiftUI
* 참고
https://developer.apple.com/documentation/swiftui/uihostingcontroller
'iOS 기본 (SwiftUI)' 카테고리의 다른 글
[iOS - SwiftUI] State, Binding 개념, 사용 방법 (0) | 2022.10.27 |
---|---|
[iOS - SwiftUI] UIViewRepresentable, UIViewControllerRepresentable 사용 방법 (SwiftUI에서 UIKit 사용 방법) (0) | 2022.10.26 |
[iOS - SwiftUI] coordinateSpace(name:) 사용 방법 (0) | 2022.10.24 |
[iOS - SwiftUI] GeometryReader, GeometryProxy 사용 방법 (뷰 레이아웃) (0) | 2022.10.23 |
[iOS - SwiftUI] Gradients (Linear, Angular, Radial) 사용 방법 (0) | 2022.10.22 |
Comments