[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 choLazyVGridvàHStackhiể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
buttonLayoutViewvào trongButtonLayout. - Đổi tên
VARthà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ả trongContentViewvàButtonLayoutnên cần một cơ chế để chia sẻ và cập nhật giá trị này. - Sử dụng
@BindingtrongButtonLayoutđể nhậnresultMessagetừ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
GeometryReadervàoButtonLayoutnhưng gặp vấn đề doGeometryReaderchiếm hết không gian. - Thử dùng
overlaynhưng vẫn không hoạt động vìGeometryProxykhô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
DeviceWidthPreferenceKeytheo protocolPreferenceKey, thêmtypealias,defaultValuevàreducefunction. - Bước 2: Sử dụng .preference modifier: Trong
GeometryReader, thêm.preferencemodifier để gán giá trị chiều rộng (geo.size.width) vàoDeviceWidthPreferenceKey. Thêm mộtColor.clearbê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
.onPreferenceChangemodifier để nhận giá trị từDeviceWidthPreferenceKeyvà gọi hàmarrangeGridItemskhi giá trị thay đổi. - Xóa các
.onAppearvà.onChangecũ.
- Bước 1: Tạo struct Preference Key: Tạo struct
- Tách Subview into New File:
- Tạo file mới
ButtonLayout.swiftvà di chuyển structButtonLayoutvào đó. - Sửa preview provider bằng cách sử dụng
.constant("")để truyền giá trịresultMessagecho 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ả!
