Tôi đã sử dụng NSFetchedResultController
và WKInterfaceTable
cho ứng dụng Apple Watch của mình. Đúng là nó không thuận tiện như một UITableViewController
, nhưng nó rất dễ làm. Tôi không có bất kỳ vấn đề về hiệu suất nào, ngay cả khi đang tải hơn 20 hàng (không thử 80-90). Tất nhiên điều này là trong giả lập, vì vậy tôi không biết làm thế nào các thiết bị chính họ sẽ hành xử.
Chèn, cập nhật và xóa bạn phải tự triển khai, nhưng không quá khó.
Dưới đây là một phần của mã của tôi trong InterfaceController, với chèn hàng làm ví dụ, nhưng chỉnh sửa và xóa không phải là khó khăn hơn:
Interface
...
@property (weak, nonatomic) IBOutlet WKInterfaceTable *interfaceTable;
@property(strong, nonatomic) NSFetchRequest *fetchRequest;
@property(strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
@property(strong, nonatomic) NSMutableArray *data;
...
Thực hiện
Việc tìm nạp giống như mọi khi, ngoại trừ việc chúng tôi không gán một đại biểu đến resultscontroller, nhưng lưu dữ liệu trực tiếp:
self.fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"YourModel" inManagedObjectContext:self.managedObjectContext];
self.fetchRequest.entity = entityDescription;
[self.fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"createdAt" ascending:YES]]];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
[self.fetchedResultsController performFetch:&error];
self.data= self.fetchedResultsController.fetchedObjects;
sau đó tôi sử dụng một chức năng loadTableData
:
- (void)loadTableData {
[self.interfaceTable setNumberOfRows:[[self data] count] withRowType:@"YourCustomCell"];
[self.interfaceTable insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:[[self data] count]] withRowType:@"YourRowType"];
for (int i = 0; i<[[self data] count];i++)
[self configureRowControllerAtIndex:i];
}
nào gọi configureRowControllerAtIndex
, một chức năng mà populates một hàng (Tôi có hai nhãn) :
- (void)configureRowControllerAtIndex:(NSInteger)index {
WKTableVIewRowController *listItemRowController = [self.interfaceTable rowControllerAtIndex:index];
[listItemRowController setTitle:[[self.data[index] title] integerValue]];
[listItemRowController setDescription:[self.data[index] description]];
}
Khi bạn chèn một hàng mới, chỉ cần thêm nó bằng tay trong managedObjectContext
và trong mảng dữ liệu:
// Add in managedObjectContext
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"YourModel" inManagedObjectContext:self.managedObjectContext];
YourModel *newRow = [[YourModel alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil];
// Add in data array
[self.data addObject:newRow];
và thường xuyên lưu managedObjectContext:
if (![self.managedObjectContext save:&error]) {
if (error) {
NSLog(@"Unable to save changes.");
NSLog(@"%@, %@", error, error.localizedDescription);
}
}
cách bạn xử lý gọi lại phương pháp NSFetchResultControllerDelegates? Tôi nghĩ rằng bạn cần phải tính toán tất cả các hàng và những thứ khác ngay cả khi bạn thêm một mục vì iWatch hiển thị màn hình một lần cho bảng và để thực hiện một thay đổi duy nhất, bạn cần tải lại tất cả dữ liệu bảng. –
Bây giờ tôi tải lại bảng sau khi chèn, cập nhật, xóa, có. Bạn có thể cập nhật một hàng hiện có với 'configureRowControllerAtIndex' mặc dù (xem ở trên). Bạn muốn sử dụng phương thức gọi lại nào? 'didChangeObject: atIndexPath' và như vậy bạn có thể thay thế bằng cách thực hiện các khối của bạn (trên một luồng riêng biệt) sau khi' configureRowControllerAtIndex' chạy. Điều đó hoạt động tốt trong ứng dụng Đồng hồ. – Wouter