将UIEvent挂钩到自定义今日扩展

时间:2015-03-09 04:31:58

标签: ios8 today-extension

我正在编写一个iOS Today Extension,其中包含UITableView。我的想法是在加载扩展时从文件加载存档数据,在UI上显示数据,以及在widgetPerformUpdateWithCompletionHandler中获取远程内容。

获取远程内容后,它将保存在本地存档文件中,并在reloadData上调用UITableViewUITableView也会响应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

0 个答案:

没有答案