我有一个带有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];
}
我哪里错了?
答案 0 :(得分:11)
在@leolobato发布的链接中,实际上有一种解决方法。它确实解决了我的问题。
https://devforums.apple.com/message/1098875#1098875
当您更改行时,首先将它们设置为= @“”。
例如,如果你的行有一个row.Label并且你要更改它,那么在row.Label.text = @“[Actual text]”
答案 1 :(得分:5)
调用setRowTypes:
或setNumberOfRows:withRowType:
方法。
以下是开发者文档中的声明,我相信这会起作用。
如果要更新表的内容,请调用setRowTypes:或 setNumberOfRows:withRowType:再次使用新的行类型信息。 再次调用这些方法会强制表丢弃旧行 并创造新的。要插入新行而不删除旧行, 使用insertRowsAtIndexes:withRowType:method。
答案 2 :(得分:3)
我发现调用setNumberOfRows:rowType不刷新表,除非你从willActivate方法调用它。我有一个委托方法,我从一个模态控制器调用,它将从父应用程序中获取一组新的记录,然后重新加载表。即使打印出的numberOfRows显示了我设置的新行数,但在视觉上现有的行仍显示在屏幕上。只有在我的委托方法中设置了一个标志之后,然后在willActivate中检查了该标志,然后才重新加载表,它是否刷新了显示。
答案 3 :(得分:1)
要重新加载数据,请将您的IBAction更改为:
- (IBAction)reloadTable {
[self.watchTableView setNumberOfRows:self.watchMArray.count withRowType:@"data"];
}
来自Apple's developer documentation on WKInterfaceTable:
此方法从表中删除所有现有行,并根据numberOfRows和rowType参数中的信息配置一组新行。
鉴于您在原始代码中使用setNumberOfRows:withRowType:
,我在此处使用了它。方法setRowTypes:
也可以达到同样的效果。
答案 4 :(得分:1)
对于watchOS 5.1(iOS 12.1),仅当我在setNumberOfRows:withRowType:
方法中添加didAppear
时,它才起作用。
使用awake(withContext:)
或willActivate
对我不起作用。前4行为空白。
答案 5 :(得分: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 =从后端重新加载数据的字典。