1

我正在尝试使用 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 字段。

关于我哪里出错的任何建议?

4

1 回答 1

0

事实证明,不知何故,我与 textLabel 有两个连接——一个与 IBOutlet 正确连接,另一个与文件所有者连接。这一定是返回 NSObject 的方式。

修复该问题后,我在 -[NSLayoutConstraint 常量] 中遇到断言失败。只是一时兴起,我关闭了笔尖中的 AutoLayout,这似乎并不需要它,而且很快。现在可以了。

于 2013-08-07T02:54:42.587 回答