Как я могу перезагрузить данные в виде таблицы WatchKit?
У меня есть приложение для iPhone с Tableview, данные которого поступают из CoreData.
![enter image description here]()
Те же данные также отображаются в приложении часов:
![enter image description here]()
Если я добавлю строку из приложения iPhone:
![enter image description here]()
и я перезагружаю данные в приложении Watch:
![enter image description here]()
Я вижу, что старые строки пустые!
![enter image description here]()
Если остановить приложение часов и начать его снова, все будет выглядеть правильно!
![enter image description here]()
Это код для заполнения Tableview в приложении часов
-(void)awakeWithContext:(id)context{
[super awakeWithContext:context];
[self loadTable];
}
-(void)loadTable{
NSLog(@"loadTableData");
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Data"];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Data"
inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortByDate = [[NSSortDescriptor alloc] initWithKey:@"sortedDateAndTime" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByDate, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
self.watchMArray = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
// [self.watchTableView setRowTypes:self.watchMArray];
[self.watchTableView setNumberOfRows:self.watchMArray.count withRowType:@"data"];
for (NSInteger i = 0; i < self.watchMArray.count; i++)
{
WatchTableCell *cell = [self.watchTableView rowControllerAtIndex:i];
NSManagedObject *data = [self.watchMArray objectAtIndex:i];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread
UIImage *foto =[self loadImageFromData:[data valueForKey:@"imageData"]];
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run UI Updates
[cell.watchImage setImage:foto];
[cell.watchDate setText:[NSString stringWithFormat:@"%@", [data valueForKey:@"dataEOra"] ]];
});
});
}
}
Это код, который я использую для его перезагрузки:
- (IBAction)reloadTable {
[self loadTable];
}
Где я ошибаюсь?
Ответы
Ответ 1
В сообщении @leolobato, на самом деле существует обходное решение. Это решило мою проблему.
https://devforums.apple.com/message/1098875#1098875
когда вы меняете свои строки, просто установите их в = @ ".
Например, если в вашей строке есть row.Label и вы меняете ее, выполните row.Label.text = @" ", а затем сразу после row.Label.text = @" [Фактический текст]"
Ответ 2
Вызов метода setRowTypes:
или setNumberOfRows:withRowType:
.
Ниже приведено выражение из документа разработчика, я считаю, что это сработает.
Если вы хотите обновить содержимое таблицы, вызовите setRowTypes: или setNumberOfRows: withRowType: снова с информацией о новой строке. Вызов этих методов снова заставляет таблицу отбрасывать старые строки и создавать новые. Чтобы вставить новые строки без удаления старых, используйте метод insertRowsAtIndexes: withRowType:.
Ссылка на документ
Ответ 3
Я обнаружил, что вызов setNumberOfRows: rowType не обновляет таблицу, если вы не вызываете ее из метода willActivate. У меня был метод делегата, который я вызывал из модального контроллера, который будет извлекать новый набор записей из родительского приложения, а затем перезагружать таблицу. Несмотря на то, что распечатка numberOfRows показала новое количество строк, которые я установил, визуально существующие строки все еще отображались на экране. Это было только после того, как я установил флаг в свой метод делегата, а затем в willActivate проверил этот флаг и только затем перезагрузил таблицу, обновил ли этот экран.
Ответ 4
Чтобы перезагрузить данные, измените IBAction на:
- (IBAction)reloadTable {
[self.watchTableView setNumberOfRows:self.watchMArray.count withRowType:@"data"];
}
Из Документация разработчика Apple на WKInterfaceTable:
Этот метод удаляет все существующие строки из таблицы и настраивает новый набор строк на основе информации в параметрах numberOfRows и rowType.
Учитывая, что вы используете setNumberOfRows:withRowType:
в своем исходном коде, я использовал это здесь. Метод setRowTypes:
также достигает такого же эффекта.
Ответ 5
Я действительно считаю, что вам нужно сделать две вещи одновременно, чтобы добиться того же результата функции tableview.reloadData() iOS, чтобы перезагрузить таблицу в часах с новыми данными, сделайте следующее:
Метод таблицы с одним вызовом: setNumberOfRows
2-цикл через обновляющие значения строк.
vacationList.setNumberOfRows(dict.count, withRowType: "vacationRow")
for index in 0..<vacationList.numberOfRows {
if let controller = vacationList.rowControllerAtIndex(index) as? VacationRowcontroller {
controller.vacation = dict.objectForKey("\(index)") as? NSDictionary
}
}
hint: dict = словарь вновь перезагруженных данных из бэкэнд.