我在 UITableViewController 内的表视图上实现了 UIRefreshControl。今天我的朋友(第一个测试者)正在玩这个应用程序,他能够通过拉动刷新来使崩溃,而当它刷新时,又很快地拉动了几次。我知道这不是一件常见的事情,但我可以很容易地重新创建它。我猜我实现刷新控件的方式有问题,因为我尝试使用 Gmail 应用程序重新创建它并且它没有崩溃。
这是我得到的错误:
[1008:907] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[__NSCFConstantString stringByAppendingString:]: nil argument' * First throw call stack: (0x343f32a3 0x3c08d97f 0x343f31c5 0x34c5c5e1 0x496b5 0x3624654d 0x3622b313 0x362427cf 0x361fe803 0x35fa8d8b 0x35fa8929 0x35fa985d 0x35fa9243 (0x35fa9051 0x35fa8eb1 0x343c86cd 0x343c69c1 0x343c6d17 0x34339ebd 0x34339d49 0x37efb2eb 0x3624f301 0x46da5 0x3c4c4b20)libc++abi.dylib:终止调用抛出异常
在 ViewDidLoad 下
// pull to refresh
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(updateTableView:) forControlEvents:UIControlEventValueChanged];
[self setRefreshControl:refreshControl];
这是 updateTableView 方法:
- (void)updateTableView:(id)sender {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMM d, h:mm:ss a"];
NSString *lastUpdated = [NSString stringWithFormat:@"Last updated on %@", [formatter stringFromDate:[NSDate date]]];
self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:lastUpdated];
if(topOptions.selectedSegmentIndex == 0) {
//fetch the feed
_feed = [[FetchData alloc] initFromURLWithString:@"some json file" completion:^(JSONModel *model, JSONModelError *err) {
[self.tableView reloadData];
[(UIRefreshControl *)sender endRefreshing];
}];
} else if (topOptions.selectedSegmentIndex == 1) {
//fetch the feed
_feed = [[FetchData alloc] initFromURLWithString:@"another json file" completion:^(JSONModel *model, JSONModelError *err) {
[self.tableView reloadData];
[(UIRefreshControl *)sender endRefreshing];
}];
}
}
我猜测(来自 nil 参数)通过多次执行刷新请求,它会达到无法找到值的点?我对此有点陌生,所以任何想法都非常感谢。
如果您需要代码的任何其他部分,请告诉我。