iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
Mobile Development

SwiftUI 男孩系列 第 26

Day 26: UIViewControllerRepresentable

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20231009/20130138ecVt6nAmqi.jpg
Photo by Tonia Kraakman on Unsplash
Mount Cook, Canterbury, New Zealand

當你在紐西蘭的庫克山國家公園Mt. Cook,走Hooker Valley Track路段看到這景色,拐個彎就快到達Hooker Lake (胡克湖)🚶🏻。


SwiftUI → UIKit’s ViewController 用 UIViewControllerRepresentable 協定

SwiftUI → UIKit’s View 用 UIViewRepresentable 協定

這就是🫸🏻backward compatibility🫷🏻


cheat sheet

struct CustomView: UIViewRepresentable {

    func makeUIView(context: Context) -> some UIView {
        // Return the UIView object
    }

    func updateUIView(_ uiView: some UIView, context: Context) {
        // Update the view
    }
}

有加 delegate 的話

textView.delegate = context.coordinator
func makeCoordinator() -> Coordinator {
    Coordinator($text)
}

class Coordinator: NSObject, UITextViewDelegate {
    var text: Binding<String>

    init(_ text: Binding<String>) {
        self.text = text
    }

    func textViewDidChange(_ textView: UITextView) {
        self.text.wrappedValue = textView.text
    }
}

實作例子 🌰

import SwiftUI
import WebKit

struct WebView: UIViewRepresentable {

    var url: URL

    func makeUIView(context: Context) -> WKWebView {
        return WKWebView()
    }

    func updateUIView(_ webView: WKWebView, context: Context) {
        let request = URLRequest(url: url)
        webView.load(request)
    }
}
private struct ResourceLinkRow: View {
    var title: String
    var webViewUrl: String
    var isPDF: Bool
    @State private var showWebView = false
    
    func checkUrl() -> URL {
        var url = URL(string: webViewUrl)
        if isPDF {
            url = Bundle.main.url(forResource: webViewUrl, withExtension: "pdf")
        }
        return url!
    }
    
    var body: some View {
        HStack(spacing: 16) {
            Button {
                showWebView.toggle()
            } label: {
                Text(title)
                    .padding(.vertical, 12)
                    .padding(.horizontal, 24)
                    .background(Color.blue)
                    .foregroundColor(.white)
                    .cornerRadius(8)
            }
            .sheet(isPresented: $showWebView) {
                WebView(url: checkUrl())
            }
        }
        .padding(.horizontal)
    }
}
ResourceLinkRow(title: "iOS App Dev Tutorials", webViewUrl: "https://developer.apple.com/tutorials/app-dev-training", isPDF: false)

https://ithelp.ithome.com.tw/upload/images/20231010/20130138kc7836Kwj1.png


咖啡廳門口有人抽雪茄,整個咖啡廳有雪茄味,今天到這。收工
一人抽雪茄,大家一起吸。
詳細請看下面兩篇文章 👋🏻

使用 UIViewRepresentable 協定 讓你輕鬆建立 SwiftUI TextView

利用 UIViewControllerRepresentable 協定 在 SwiftUI 存取相簿並使用相機


上一篇
Day 25: UIHostingController 🫸🏻🤏🏻 
下一篇
Day 27: MVVM傳值,不是傳情
系列文
SwiftUI 男孩30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言