23

我有一个带有 Tableview 的 iPhone 应用程序,其数据来自 CoreData。

在此处输入图像描述

手表应用中也会显示相同的数据:

在此处输入图像描述

如果我从 iPhone 应用程序添加一行:

在此处输入图像描述

我在 Watch 应用程序中重新加载数据:

在此处输入图像描述

我看到旧行是空的!

在此处输入图像描述

如果停止手表应用程序并重新启动它,一切都会正确显示!

在此处输入图像描述

这是在手表应用程序中填充 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];
}

我哪里错了?

4

6 回答 6

11

在发布的链接@leolobato 中,实际上有一个解决方法。它确实解决了我的问题。

https://devforums.apple.com/message/1098875#1098875

当您更改行时,只需将它们设置为 =@"" 首先。

例如,如果您的行有一个 row.Label 并且您正在更改它,请在 row.Label.text =@"" 之后再次执行 row.Label.text =@"[Actual text]"

于 2015-02-26T05:58:47.487 回答
6

调用setRowTypes:orsetNumberOfRows:withRowType:方法。

以下是开发人员文档中的声明,我相信这会起作用。

当您想要更新表的内容时,请再次使用新的行类型信息调用 setRowTypes: 或 setNumberOfRows:withRowType:。再次调用这些方法会强制表丢弃旧行并创建新行。要插入新行而不删除旧行,请使用 insertRowsAtIndexes:withRowType: 方法。

链接到文档

于 2015-01-20T10:50:16.783 回答
4

我发现调用 setNumberOfRows:rowType 不会刷新表,除非您从 willActivate 方法调用它。我有一个从模态控制器调用的委托方法,该方法将从父应用程序获取一组新记录,然后重新加载表。即使打印出 numberOfRows 显示了我设置的新行数,在视觉上现有的行仍然显示在屏幕上。只有在我在我的委托方法中设置了一个标志,然后在 willActivate 检查该标志,然后才重新加载表之后,它才会刷新显示。

于 2015-04-06T05:20:31.717 回答
1

要重新加载数据,请将您的 IBAction 更改为:

- (IBAction)reloadTable {
    [self.watchTableView setNumberOfRows:self.watchMArray.count withRowType:@"data"];
}

来自Apple 关于 WKInterfaceTable 的开发人员文档

此方法从表中删除所有现有行,并根据 numberOfRows 和 rowType 参数中的信息配置一组新行。

鉴于您setNumberOfRows:withRowType:在原始代码中使用,我在这里使用了它。该方法setRowTypes:也达到了同样的效果。

于 2015-01-20T20:47:36.413 回答
1

对于 watchOS 5.1、iOS 12.1,它只有在我添加了setNumberOfRows:withRowType:indidAppear方法时才有效。使用awake(withContext:)orwillActivate对我不起作用。前 4 行是空白的。

于 2018-11-08T19:36:21.563 回答
0

我确实相信您必须同时做两件事才能获得与 tableview.reloadData() iOS 函数相同的结果,因此要使用新数据重新加载手表中的表,请执行以下操作: 1-调用表方法: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
        }
    } 

提示:dict = 从后端重新加载的新数据字典。

于 2016-06-30T10:49:01.433 回答