0Pricing
Swift Academy · บทเรียน

UIViewRepresentable: ห่อหุ้ม View ของ UIKit

ใช้งาน makeUIView, updateUIView และการถอด View ของ UIKit ใน SwiftUI

UIViewRepresentable: ห่อหุ้ม View ของ UIKit เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องใช้ UIViewRepresentable

วิว UIKit จำนวนมากยังไม่มีสิ่งเทียบเท่าใน SwiftUI UIViewRepresentable จึงทำหน้าที่เชื่อมวิว UIKit เข้ากับ SwiftUI

import SwiftUI
import UIKit

struct WebView: UIViewRepresentable {
  let url: URL
  // ...
}

เมธอดที่จำเป็น

ใช้งาน makeUIView เพื่อสร้างวิว และ updateUIView เพื่อซิงค์การเปลี่ยนแปลงสถานะของ SwiftUI

func makeUIView(context: Context) -> WKWebView {
  WKWebView()
}
func updateUIView(_ uiView: WKWebView, context: Context) {
  uiView.load(URLRequest(url: url))
}

ตัวอย่าง WebView ฉบับสมบูรณ์

ตัวอย่าง UIViewRepresentable ฉบับสมบูรณ์ที่ห่อหุ้ม WKWebView เพื่อแสดงเนื้อหาเว็บใน SwiftUI

struct WebView: UIViewRepresentable {
  let url: URL
  func makeUIView(context: Context) -> WKWebView { WKWebView() }
  func updateUIView(_ uiView: WKWebView, context: Context) {
    uiView.load(URLRequest(url: url))
  }
}

การใช้ใน SwiftUI

ใช้วิวที่ห่อหุ้มไว้ได้เช่นเดียวกับวิวของ SwiftUI และใช้ตัวปรับแต่งตามปกติ

WebView(url: URL(string: "https://apple.com")!)
  .frame(height: 400)
  .cornerRadius(12)

การส่งข้อมูลเข้าไป

ส่งข้อมูลจาก SwiftUI ไปยัง UIKit ผ่านคุณสมบัติที่จัดเก็บไว้ของ representable แล้วอัปเดตใน updateUIView

struct MapView: UIViewRepresentable {
  var region: MKCoordinateRegion
  func makeUIView(context: Context) -> MKMapView { MKMapView() }
  func updateUIView(_ uiView: MKMapView, context: Context) {
    uiView.setRegion(region, animated: true)
  }
}

การถอดวิว UIKit

ใช้งาน dismantleUIView ซึ่งเป็นเมธอดเสริม เพื่อทำความสะอาดทรัพยากร เช่น ตัวสังเกตการณ์ เมื่อวิวถูกนำออก

static func dismantleUIView(_ uiView: WKWebView, coordinator: Coordinator) {
  uiView.stopLoading()
}

พารามิเตอร์ Context

context ให้เข้าถึง coordinator, environment และธุรกรรมของแอนิเมชัน

func updateUIView(_ uiView: MKMapView, context: Context) {
  print(context.environment.colorScheme)  // .light or .dark
}

ค่าจากสภาพแวดล้อมใน UIViewRepresentable

อ่านค่าจากสภาพแวดล้อมของ SwiftUI ผ่าน context.environment เพื่อปรับการกำหนดค่าของ UIKit

if context.environment.colorScheme == .dark {
  uiView.overrideUserInterfaceStyle = .dark
}

การกำหนดขนาดวิว UIKit

UIViewRepresentable ใช้ขนาดเนื้อหาภายในหรือใช้ตัวปรับแต่งเฟรมของ SwiftUI ให้ใช้งาน sizeThatFits สำหรับการกำหนดขนาดแบบกำหนดเอง

func sizeThatFits(_ proposal: ProposedViewSize, uiView: WKWebView, context: Context) -> CGSize? {
  CGSize(width: proposal.width ?? 300, height: 400)
}

การหลีกเลี่ยงผลข้างเคียงของ makeUIView

ให้ makeUIView ทำงานแบบบริสุทธิ์ — สร้างและกำหนดค่าเท่านั้น ส่วนการอัปเดตที่ขับเคลื่อนด้วยสถานะให้ใส่ไว้ใน updateUIView

// WRONG:
func makeUIView(context: Context) -> MKMapView {
  let v = MKMapView()
  v.setRegion(region, animated: false)  // belongs in updateUIView
  return v
}

วิวที่ห่อหุ้มโดยทั่วไป

วิว UIKit ที่มักห่อหุ้มด้วย UIViewRepresentable ได้แก่ WKWebView, MKMapView, UITextView, UIImagePickerController และ AVPlayerLayer

// UITextView with custom toolbar
struct RichTextEditor: UIViewRepresentable {
  @Binding var text: String
  // makeUIView, updateUIView, Coordinator...
}

ตรวจสอบความเข้าใจ

เมธอดใดใน UIViewRepresentable ที่ถูกเรียกเพื่อซิงค์สถานะของ SwiftUI เข้ากับวิว UIKit หลังจากสร้างวิวครั้งแรก

สรุปบทเรียน

UIViewRepresentable ต้องมี makeUIView (สร้างครั้งเดียว) และ updateUIView (ซิงค์เมื่อสถานะเปลี่ยนแปลง) ใช้ context.environment เพื่อปรับการแสดงผล และทำความสะอาดใน dismantleUIView ใช้ตัวปรับแต่งเฟรมของ SwiftUI เพื่อควบคุมขนาด

คำถามที่พบบ่อย

บทเรียน “UIViewRepresentable: ห่อหุ้ม View ของ UIKit” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “UIViewRepresentable: ห่อหุ้ม View ของ UIKit” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “UIViewRepresentable: ห่อหุ้ม View ของ UIKit”

ใช้งาน makeUIView, updateUIView และการถอด View ของ UIKit ใน SwiftUI คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “UIViewRepresentable: ห่อหุ้ม View ของ UIKit” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. UIViewRepresentable: ห่อหุ้ม View ของ UIKit
  2. รูปแบบ Coordinator สำหรับการสื่อสารกับผู้รับมอบหมาย
  3. UIViewControllerRepresentable
  4. UIHostingController: SwiftUI ภายใน UIKit
← กลับไปที่ Swift Academy