[Video Summary] Ch. 4.7 PreferenceKeys, GeometryReader, and Extracted SubViews in SwiftUI (Dungeon Dice App)
Mô tả nhanh
Video này trình bày cách sử dụng PreferenceKeys
để truyền dữ liệu từ view con lên view cha, giải quyết vấn đề GeometryReader
chiếm hết không gian, đồng thời hướng dẫn cách tách view phức tạp thành subview và chuyển chúng vào file riêng biệt trong SwiftUI.
Video
Mô tả chi tiết
Video này trình bày cách sử dụng PreferenceKeys
để truyền dữ liệu từ view con lên view cha, giải quyết vấn đề GeometryReader
chiếm hết không gian, đồng thời hướng dẫn cách tách view phức tạp thành subview và chuyển chúng vào file riêng biệt trong SwiftUI.
Các bước thực hiện chính:
- Tạo Computed Property cho Button Layout:
- Bắt đầu bằng việc tạo một computed property
buttonLayoutView
để chứa code choLazyVGrid
vàHStack
hiển thị các nút bấm. - Nhận thấy lỗi do có hai view ngang cấp trong computed property nên nhúng chúng vào trong một
VStack
.
- Bắt đầu bằng việc tạo một computed property
- Tách Subview Button Layout:
- Nhận thấy computed property trở nên phức tạp (có thêm enum và các biến khác) nên quyết định tạo một subview mới có tên
ButtonLayout
(dạng struct). - Chuyển code của
buttonLayoutView
vào trongButtonLayout
. - Đổi tên
VAR
thànhbody
(bắt buộc với View struct).
- Nhận thấy computed property trở nên phức tạp (có thêm enum và các biến khác) nên quyết định tạo một subview mới có tên
- Truyền Dữ Liệu với Binding:
- Nhận thấy rằng biến
resultMessage
được sử dụng cả trongContentView
vàButtonLayout
nên cần một cơ chế để chia sẻ và cập nhật giá trị này. - Sử dụng
@Binding
trongButtonLayout
để nhậnresultMessage
từContentView
. Cần thêm$
khi truyền giá trị.
- Nhận thấy rằng biến
- Giải Quyết Vấn Đề GeometryReader:
- Ban đầu, thử di chuyển
GeometryReader
vàoButtonLayout
nhưng gặp vấn đề doGeometryReader
chiếm hết không gian. - Thử dùng
overlay
nhưng vẫn không hoạt động vìGeometryProxy
không thể truy cập được trongVStack
.
- Ban đầu, thử di chuyển
- Sử Dụng Preference Keys:
- Bước 1: Tạo struct Preference Key: Tạo struct
DeviceWidthPreferenceKey
theo protocolPreferenceKey
, thêmtypealias
,defaultValue
vàreduce
function. - Bước 2: Sử dụng .preference modifier: Trong
GeometryReader
, thêm.preference
modifier để gán giá trị chiều rộng (geo.size.width
) vàoDeviceWidthPreferenceKey
. Thêm mộtColor.clear
bên trongGeometryReader
để nó có kích thước xác định. - Bước 3: Sử dụng onPreferenceChange modifier: Trong parent view, sử dụng
.onPreferenceChange
modifier để nhận giá trị từDeviceWidthPreferenceKey
và gọi hàmarrangeGridItems
khi giá trị thay đổi. - Xóa các
.onAppear
và.onChange
cũ.
- Bước 1: Tạo struct Preference Key: Tạo struct
- Tách Subview into New File:
- Tạo file mới
ButtonLayout.swift
và di chuyển structButtonLayout
vào đó. - Sửa preview provider bằng cách sử dụng
.constant("")
để truyền giá trịresultMessage
cho preview.
- Tạo file mới
- Kiểm Thử và Kết Thúc:
- Thêm một case mới vào enum để thấy khả năng update của code.
* Thử nghiệm trên simulator trên iPad mini để đảm bảo mọi thứ vẫn hoạt động đúng.
* Thêm icon và LaunchScreen cho app. - Tóm tắt lại các kỹ năng đã dùng: Lazy Stack/Grid, Extract View, Preference Keys.
Chúc bạn học tập và làm việc hiệu quả!