[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
SortOptionvớ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 sortSelectionkiể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
ToolbarItemvới vị trí.bottomBarđể thêm Picker vào phía dưới màn hình. - Sử dụng
Pickervớititlerỗng,selectionlà$sortSelectionvà nội dung là một vòng lặpForEachqua 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
ListvàForEachra một View mới:- Tạo một struct mới gọi là
SortedToDoListtuân thủView. - Di chuyển phần code
ListvàForEachtừToDoListViewvàoSortedToDoList. - Di chuyển cả khai báo
@Queryvà@Environmentvào struct này. - Thêm một biến
let sortSelection: SortOptionvà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
sortSelectionvàoSortedToDoList:- Trong
ToDoListView, thay thế phần codeListbằngSortedToDoList, và truyền biến trạng tháisortSelectionvào view này qua parameter.
- Trong
-
Thêm initializer cho
SortedToDoList:- Thêm một
initvàoSortedToDoListđể khởi tạo thuộc tính@Querydựa trênsortSelection. - Sử dụng
switchđể chọn cách khởi tạo@Querykhá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@Querytronginit. 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áctoDochưa hoàn thành.
- Thêm một
-
Chú ý:
- Mỗi khi giá trị
sortSelectionthay đổi (do người dùng chọn trên Picker),SortedToDoListsẽ 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!