* Xây dựng tag, task và các thuộc tính của tag, task.
Trước tiên, để quản lý các task hoặc tag trong chương trình, ta phải xây dựng 4 class để quản lý chúng: 2 class quản lý task và 2 class quản lý tag. Trong đó, 2 class quản lý task bao gồm: 1 class để quản lý các thuộc tính của task và 1 class quản lý danh sách các task. Và 2 class quản lý tag bao gồm: 1 class để quản lý các thuộc tính của tag và 1 class quản lý danh sách các tag.
* Đối với tag:
Class quản lý thuộc tính của tag là kiểu NSObject, gồm 2 file Tag.h và Tag.m. Trong đó file Tag.h có dạng như sau:
Nhìn vào file trên ta sẽ thấy các thuộc tính toàn cục cơ bản của một tag là: name, type, data type, description, device, modbus address, value. Các thuộc tính này đều được lưu dưới dạng chuỗi (NSString). Do cách quản lý thế này nên mỗi khi cần truy xuất thuộc tính các tag ta chỉ cần gọi: tag.attribute. Ví dụ: tag.name: tên tag, tag.type: loại tag.
Class quản lý danh sách các tag là kiểu NSObject, gồm 2 file Tags.h và Tags.m. Trong đó file Tags.h có dạng như sau:
Page 38
Nhìn file trên ta thấy class này chỉ chứa duy nhất một thuộc tính toàn cục đó là tag với kiểu dữ liệu là NSMutableArray. Đây là kiểu dữ liệu mảng cho phép ta chứa các đối tượng khác bên trong nó. Ta dùng kiểu dữ liệu này để chứa các danh sách tag trong chương trình của mình.
Và ta sẽ dùng các lệnh sau để thao tác với các tag:
objectAtIndex: Gọi một tag nào đó tại vị trí có sẵn.
addObject: Thêm một tag vào list các tag.
replaceObjectAtIndex: thay thế 1 tag tại vị trí nào đó bằng một tag khác. * Đối với task:
Class quản lý thuộc tính của task là kiểu NSObject, gồm 2 file Task.h và Task.m. Trong đó file Task.h có dạng như sau:
Nhìn vào file trên ta sẽ thấy các thuộc tính toàn cục cơ bản của một tag là: name, method, priority và tags. Các thuộc tính này đều được lưu dưới dạng chuỗi (NSString) trừ tags.
Chú ý: Do task được phân cấp cao hơn tag và task lại chứa tag nên trong task sẽ có cả thuộc tính tags (tags ở đây tức là danh sách các tag, không phải từng tag riêng lẻ).
Do cách quản lý thế này nên mỗi khi cần truy xuất thuộc tính các task ta chỉ cần gọi: task.attribute. Ví dụ: task.name: tên task, task.period: chu kì của task.
Page 39
Còn khi muốn truy xuất tag từ task thì trước tiên ta sẽ lấy đối tượng task trong danh sách task trước. Sau đó ta sẽ lấy đối tượng tag chứa trong danh sách tag, danh sách tag này (trong code là tags) nằm trong đối tượng task ở trên. Đoạn code này như sau:
Class quản lý danh sách các task là kiểu NSObject, gồm 2 file Tasks.h và Tasks.m. Trong đó file Tasks.h có dạng như sau:
Nhìn file trên ta thấy class này chỉ chứa duy nhất một thuộc tính toàn cục đó là task với kiểu dữ liệu là NSMutableArray. Đây là kiểu dữ liệu mảng cho phép ta chứa các đối tượng khác bên trong nó. Ta dùng kiểu dữ liệu này để chứa danh sách các task trong chương trình của mình.
Và ta sẽ dùng các lệnh sau để thao tác với các task:
objectAtIndex: Gọi một task nào đó tại vị trí có sẵn.
addObject: Thêm một task vào list các task.
replaceObjectAtIndex: thay thế 1 task tại vị trí nào đó bằng một task khác.
* Xây dựng Task – Tag Form
Tiếp theo, để xây dựng được Task – Tag Form ta cần 3 ViewController:
ViewController thứ nhất (view giao diện chính của Task – Tag Form): gồm 2 table: table bên trái chứa danh sách các task trong chương trình và các nút thao tác đối với các task đó, table bên phải chứa danh sách các tag trong chương trình và các nút thao tác đối với các tag đó.
ViewController thứ hai (view design cho task): view cho phép ta nhập thông tin của task vào và 2 nút xác nhận (nút OK và nút Cancel).
ViewController thứ ba (view design cho tag): view cho phép ta nhập thông tin của tag vào và 2 nút xác nhận (nút OK và nút Cancel).
Các ViewController này tương tác với nhau thông qua các action như sau:
Khi ta nhấn nút add task (tag) hoặc chọn edit task (tag): chương trình sẽ thực thi giải thuật như sau:
Page 40
Hình 5-10 Giải thuật thực thi khi nhấn nút add task (tag) hoặc khi edit task (tag)
* Đối với task:
Đoạn code cho hàm add task như sau:
Hàm add task này chỉ làm một việc duy nhất là gọi ViewController thứ 2 lên (view design cho task) thông qua hàm:
Ở đây taskDesignView là đối tượng đại diện cho ViewController thứ 2. Sau khi nhập thông tin của task xong thì ViewController thứ 2 sẽ lấy những thông tin vừa nhập về task và trả về ViewController thứ 1 (view giao diện chính) thông qua lệnh gọi hàm sau:
Hàm này không thực thi ở ViewController thứ 2 mà được thực thi ở ViewController thứ nhất. Hàm này sẽ thêm task vào danh sách task đồng thời cập nhật lại table để hiển thị task đó lên. Đoạn code của hàm như sau:
Page 41
Còn về việc edit task thì hãy chú ý là ta không có nút edit, muốn edit 1 task nào đó ta chỉ việc nhấp 2 lần vào task đó, đoạn code thực thi điều này như sau:
Hàm này sẽ kiểm tra xem ta đã chạm 2 lần vào task đó chưa. Sau đó hàm sẽ lấy thông tin task được chạm vào thông qua biến taskIndex và gọi ViewController thứ 2 lên với những thông tin của task được chọn để cho người dùng edit. Edit xong thì ta chọn OK. Mọi việc sau đó diễn ra y như khi ta add task, chỉ khác là trong hàm didDesignTask ta sẽ thay thế task cũ bằng task mới chỉnh sửa.
* Đối với tag:
Đoạn code để add tag và edit tag gần như tương tự như add task và edit tag, chỉ thêm đoạn code kiểm tra xem có task nào được chọn hay chưa. Nếu chưa có task nào được chọn thì chương trình sẽ báo lỗi. Đoạn code này như sau (trong đó biến taskIndex sẽ kiểm tra xem có task nào được chọn chưa):
Page 42
Khi đã có 1 task nào đó được chọn rồi thì mọi xử lý tiếp theo như gọi ViewController thứ 2 (view design cho tag), nhập thông tin, trả thông tin tag về ViewController thứ nhất, cập nhật danh sách tag và hiển thị lên table chứa tag đều tương tự như khi ta xử lý với task. Chỉ khác là tag được add hay edit này sẽ được lưu đúng vào task đã chọn trước đó.
Khi ta chọn delete task (tag) thì chương trình sẽ tự động xóa task (tag) khỏi danh sách task (tag) và table chứa task (tag). Nút delete chỉ hiện ra khi ta dùng tay quét ngang một task (tag) nào muốn xóa. Vì đoạn code thực thi việc delete task và tag tương tự nhau nên ở đây ta chỉ nêu đoạn code xóa task thôi. Đoạn code này như sau:
Page 43