Подтвердить что ты не робот

Как я могу перезагрузить данные в виде таблицы 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];
}

Где я ошибаюсь?

4b9b3361

Ответ 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 = словарь вновь перезагруженных данных из бэкэнд.