我正在编写一个iOS Today Extension,其中包含UITableView
。我的想法是在加载扩展时从文件加载存档数据,在UI上显示数据,以及在widgetPerformUpdateWithCompletionHandler
中获取远程内容。
获取远程内容后,它将保存在本地存档文件中,并在reloadData
上调用UITableView
。
UITableView
也会响应tableView:didSelectRowAtIndexPath
。当用户点击其中一行时,它将启动Safari。
但我注意到,当加载扩展时,系统将使用以前的快照而不是显示我的UI。没关系,我知道这是出于性能原因。但是快照不能像UITableView
那样接受任何UI事件,这意味着用户将看到扩展程序后会有延迟,直到他们可以点击每一行。
有谁知道如何减少快照可见的时间?在加载扩展程序时,似乎今天没有调用widgetPerformUpdateWithCompletionHandler
扩展名。
以下是我使用的示例代码:
@implementation TodayViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.preferredContentSize = CGSizeMake(0, 0);
[self loadArchivedData];
self.preferredContentSize = CGSizeMake(0, self.stories.count * kCellHeight);
[self.tableView registerNib:[UINib nibWithNibName:@"RHNTodayCell" bundle:nil] forCellReuseIdentifier:@"RHNTodayCell"];
}
- (void) viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.tableView reloadData];
}
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.stories.count;
}
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
RHNTodayCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RHNTodayCell" forIndexPath:indexPath];
NSDictionary *story = self.stories[indexPath.row];
cell.titleLabel.text = story[@"title"];
cell.scoreLabel.text = [NSString stringWithFormat:@"%d", (int)[story[@"score"] integerValue]];
cell.commentLabel.text = [NSString stringWithFormat:@"%d", (int)[story[@"kids"] count]];
cell.nameLabel.text = story[@"by"];
return cell;
}
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSDictionary *story = self.stories[indexPath.row];
[self.extensionContext openURL:[NSURL URLWithString:story[@"url"]] completionHandler:nil];
}
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
completionHandler(NCUpdateResultNewData);
[[RemoteAPI sharedClient] asyncFetchRemoteData:(NSArray *response) {
[self saveArchiveFilesWithResponse: response];
[self loadArchivedData];
self.preferredContentSize = CGSizeMake(0, self.stories.count * kCellHeight);
[self.tableView reloadData];
completionHandler(NCUpdateResultNewData);
}];
}
@end