我正在尝试使用 UISearchDisplayController 来使用 CLGeocode 作为用户类型进行搜索,以便与 MKMapView 一起使用。我的视图控制器中只有两件事 - 与 UISearchDisplayController 关联的 UISearchBar 和地图视图。我正在使用故事板。
通常,人们会使用底层表格视图来执行此操作,并在那里声明一个原型单元格,但这里似乎没有办法这样做,因为我没有表格视图。所以我创建了一个名为 SearchTableViewCell 的 UITableViewCell 子类,并带有相关的 nib。
笔尖包含一个标签,此插座已连接:
@interface SearchTableViewCell : UITableViewCell
@property (unsafe_unretained, nonatomic) IBOutlet UILabel *textLabel;
@end
我在 viewDidLoad 中加载笔尖:
[self.searchDisplayController.searchResultsTableView registerNib:[UINib nibWithNibName:@"SearchTableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CellIdentifier"];
我像这样从 CLGeocoder 获取数据:
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
[self.geocoder geocodeAddressString:searchString completionHandler:^(NSArray *placemarks, NSError *error) {
self.placemarks = placemarks;
[self.searchDisplayController.searchResultsTableView reloadData];
}];
return NO;
}
我的 tableview 代码如下所示:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.placemarks count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *kCellID = @"CellIdentifier";
SearchTableViewCell *cell = (SearchTableViewCell *)[tableView dequeueReusableCellWithIdentifier:kCellID forIndexPath:indexPath];
CLPlacemark *placemark = self.placemarks[indexPath.row];
NSString *addressString = CFBridgingRelease(CFBridgingRetain(ABCreateStringWithAddressDictionary(placemark.addressDictionary, NO)));
cell.textLabel.text = addressString;
return cell;
}
搜索部分正在工作 - 当我到达 cellForRowAtIndexPath 时,self.placemarks 中有数据。但是,使新单元出列的行在第一次调用时失败并出现异常:
'NSUnknownKeyException', reason: '[<NSObject 0x1a840d40> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key textLabel.'
我的单元格对象符合 textLabel,但我想知道错误消息中的 NSObject - 返回的对象不是 SearchTableViewCell 吗?它在 IB 中配置为使用正确的类。为什么出队方法还要检查 textLabel 呢?我很确定在此之前我有自定义表格单元格没有 textLabel 字段。
关于我哪里出错的任何建议?