如何在WatchKit表格视图中重新加载数据?

23

我有一个iPhone应用程序,其中包含一个Tableview,其数据来自CoreData。

enter image description here

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

enter image description here

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

enter image description here

并且我在手表应用程序中重新加载数据:

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];
}

我错在哪里?


很难说。我想在LLDB中运行这段代码,这几乎肯定是有用的。 - Tom Harrington
自从WatchOS2.0发布以来,您现在如何管理相同的事情(跨iOS和watchOS数据一致性)? - air_bob
使用watchOS 2,CoreData是一个非常大的问题!! - Ragazzetto
@Ragazzetto 是的,我一直在思考解决方案,但没有一个完美的方法可以使数据在watchOS2.0上保持一致。 - air_bob
6个回答

11

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

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

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

例如,如果您的行有一行.Label并且您要更改它,请执行row.Label.text=@"" 然后再次执行row.Label.text=@"[实际文本]"


是你的帖子引领我来到这篇文章并解决了我的问题,非常感谢 :) - Bonan
这是一个好的解决方法,它有效地解决了问题。这个问题让我疯狂了几个小时。这似乎是Beta版中的一个错误,他们希望能够修复。 - thgc
这个 bug 在 GM 版本中修复了吗? - erdekhayser

6
调用setRowTypes:setNumberOfRows:withRowType:方法。
以下是开发者文档中的一句话,我相信这会起作用。
当您想要更新表格的内容时,请再次调用setRowTypes:setNumberOfRows:withRowType:方法以获取新的行类型信息。 再次调用这些方法会强制表格放弃旧行并创建新行。 要插入新行而不删除旧行,请使用insertRowsAtIndexes:withRowType:方法。
链接到文档: Link to document

从loadTable方法中的代码可以看出,已经调用了一个方法[self.watchTableView setNumberOfRows:self.watchMArray.count withRowType:@"date"]。 - Ragazzetto
从技术上讲,只需一行代码即可使用setRowTypes。虽然我没有尝试过,但我已经阅读了文档,这就是为什么我把它发送给你的原因。 - Jay
谢谢@JayahariV,我已经使用了Duncan的代码,但在我的情况下,更改代码并没有解决问题!!现在所有行都是空的 :-( - Ragazzetto
在beta版之后的当前版本中,这个bug还存在吗?当我重新加载时,我记录了我在标签中使用的文本,但它并没有改变表格中的内容。 - Jason Hocker

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

这实际上在WKInterfaceController文档中有记录。 - mxcl

1
重新加载数据,请将您的 IBAction 更改为以下内容:

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

来自苹果公司的WKInterfaceTable开发人员文档:

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

假设您在原始代码中使用了setNumberOfRows:withRowType:,我在这里也使用了该方法。方法setRowTypes:也可以实现相同的效果。


谢谢你的建议,但在我的情况下,代码的更改并没有解决问题!!现在所有的行都是空的:-( - Ragazzetto
是的;-) 奇怪的是,详细视图完美地工作,只有表格数据丢失 :-( - Ragazzetto
你是否正在使用NSTimer轮询底层数据集的更改? - Duncan Babbage
没有 NSTimer @DuncanBabbage!在我将对象添加到 iPhone 应用程序后,我会手动更新手表扩展中的表格! - Ragazzetto
1
@Ragazzetto 我想SDK中可能仍然存在着一些错误。 - jkingyens
显示剩余4条评论

1
对于 watchOS 5.1 和 iOS 12.1,只有在 didAppear 方法中添加 setNumberOfRows:withRowType: 才能正常工作。使用 awake(withContext:)willActivate 方法对我无效,前四行为空白。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接