[Video Summary] Ch. 5.8 Interactive @Query in SwiftData - Change @Query Properties with a Picker ToDo List App
Mô tả nhanh
Video này hướng dẫn cách sử dụng Picker để thay đổi thuộc tính @Query trong SwiftData, giúp tải lại dữ liệu đã được sắp xếp, đặt hàng hoặc lọc theo lựa chọn của người dùng.
Video
Mô tả chi tiết
Video này hướng dẫn cách sử dụng Picker để thay đổi thuộc tính @Query trong SwiftData, giúp tải lại dữ liệu đã được sắp xếp, đặt hàng hoặc lọc theo lựa chọn của người dùng.
Để thực hiện điều này, bạn sẽ làm theo các bước sau:
-
Tạo một enum để xác định các tùy chọn sắp xếp:
- Tạo một enum
SortOption
với các trường hợp (case) nhưasEntered
,alphabetical
,chronological
, vàcompleted
. - Enum này tuân thủ
String
để có thể gán giá trị chuỗi cho từng trường hợp vàCaseIterable
để lặp qua tất cả các trường hợp.
- Tạo một enum
-
Thêm biến trạng thái cho Picker:
- Trong
ToDoListView
, thêm biến trạng thái@State private var sortSelection
kiểuSortOption
để lưu trữ lựa chọn từ Picker. - Khởi tạo biến với giá trị mặc định là
.asEntered
.
- Trong
-
Thêm Picker vào toolbar:
- Sử dụng
ToolbarItem
với vị trí.bottomBar
để thêm Picker vào phía dưới màn hình. - Sử dụng
Picker
vớititle
rỗng,selection
là$sortSelection
và nội dung là một vòng lặpForEach
qua tất cả các trường hợp củaSortOption
. - Sử dụng
.pickerStyle(.segmented)
để hiển thị Picker dưới dạng segmented control.
- Sử dụng
-
Tách
List
vàForEach
ra một View mới:- Tạo một struct mới gọi là
SortedToDoList
tuân thủView
. - Di chuyển phần code
List
vàForEach
từToDoListView
vàoSortedToDoList
. - Di chuyển cả khai báo
@Query
và@Environment
vào struct này. - Thêm một biến
let sortSelection: SortOption
vàoSortedToDoList
để nhận giá trị lựa chọn sắp xếp từToDoListView
.
- Tạo một struct mới gọi là
-
Truyền
sortSelection
vàoSortedToDoList
:- Trong
ToDoListView
, thay thế phần codeList
bằngSortedToDoList
, và truyền biến trạng tháisortSelection
vào view này qua parameter.
- Trong
-
Thêm initializer cho
SortedToDoList
:- Thêm một
init
vàoSortedToDoList
để khởi tạo thuộc tính@Query
dựa trênsortSelection
. - Sử dụng
switch
để chọn cách khởi tạo@Query
khác nhau dựa trên giá trị củasortSelection
:asEntered
: Không sắp xếp (mặc định củaQuery
).alphabetical
: Sắp xếp theo tên mục (item).chronological
: Sắp xếp theo ngày (date).completed
: Lọc chỉ hiển thị các ToDo chưa hoàn thành.
- Sử dụng
_toDos
để truy cập và khởi tạo@Query
tronginit
. Với_toDos
, ta hoàn toàn có thể set lại query với các giá trị khác nhau. - Sử dụng macro
#Predicate
để lọc cáctoDo
chưa hoàn thành.
- Thêm một
-
Chú ý:
- Mỗi khi giá trị
sortSelection
thay đổi (do người dùng chọn trên Picker),SortedToDoList
sẽ bị hủy và tạo lại với initializer mới, từ đó query cũng được tạo mới. - Mặc dù
animation
được cung cấp trong initializer nhưng trong query thì effect này chưa được implement.
- Mỗi khi giá trị
-
Thử nghiệm: Chạy ứng dụng trên simulator để xem kết quả. Dữ liệu được sắp xếp và lọc dựa trên lựa chọn của người dùng và được lưu lại trong simulator.
-
Lưu ý thêm:
- Mỗi simulator (không chỉ là device mà còn cả version OS) đều lưu trữ dữ liệu riêng biệt. Do đó, dữ liệu giữa các simulator là không đồng bộ.
- Để xoá toàn bộ data của app trên simulator, chỉ cần long-press icon app và chọn xoá ứng dụng. Khi chạy lại, app sẽ tạo dữ liệu mới hoàn toàn.
Chúc bạn thực hành thành công!