繁体   English   中英

如何在WatchKit tableview中重新加载数据?

[英]How can I reload the data in a WatchKit tableview?

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

在此输入图像描述

相同的数据也会显示在观看应用中:

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

我看到旧行空了!

在此输入图像描述

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

在此输入图像描述

这是在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];
}

我哪里错了?

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

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

当你改变行时,首先将它们设置为= @“”。

例如,如果你的行有一个row.Label并且你要更改它,那么在row.Label.text = @“[Actual text]”之后再次执行row.Label.text = @“”

调用setRowTypes:setNumberOfRows:withRowType:方法。

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

如果要更新表的内容,请使用新的行类型信息再次调用setRowTypes:或setNumberOfRows:withRowType :. 再次调用这些方法会强制表丢弃旧行并创建新行。 要在不删除旧行的情况下插入新行,请使用insertRowsAtIndexes:withRowType:方法。

链接到文档

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

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

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

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

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

鉴于您在原始代码中使用setNumberOfRows:withRowType:我在此处使用了它。 方法setRowTypes:也达到了相同的效果。

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

我相信你必须同时做两件事才能达到tableview.reloadData()iOS函数的相同结果,所以要用新数据重新加载表中的表,执行以下操作:1-call table method:setNumberOfRows 2-loop通过行刷新值。

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 =来自后端的新重载数据的字典。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM