使用没有底层UITableView的UISearchViewController(来自故事板)

时间:2013-08-06 20:19:49

标签: uitableview storyboard uisearchdisplaycontroller

我正在尝试使用UISearchDisplayController作为用户类型使用CLGeocode进行搜索,以便与MKMapView一起使用。我的视图控制器只有两件事 - 与UISearchDisplayController关联的UISearchBar和地图视图。我正在使用故事板。

通常情况下,人们会使用基础表视图执行此操作,并在那里声明原型单元格,但由于我没有表格视图,因此似乎无法在此处执行此操作。所以我创建了一个名为SearchTableViewCell的UITableViewCell的子类,带有相关的nib。

笔尖包含一个标签,此插座已连接:

@interface SearchTableViewCell : UITableViewCell

@property (unsafe_unretained, nonatomic) IBOutlet UILabel *textLabel;

@end

我在viewDidLoad中加载了nib:

[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中配置为使用正确的类。为什么dequeue方法检查textLabel呢?我很确定在没有textLabel字段之前我已经有了自定义表格单元格。

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

1 个答案:

答案 0 :(得分:0)

事实证明,不知何故,我有两个连接到textLabel - 一个适当的连接到IBOutlet而另一个连接到File的所有者。那肯定是NSObject的回归方式。

在修复之后,我在 - [NSLayoutConstraint常量]中得到断言失败。只是一时兴起我在笔尖中关闭了AutoLayout,这似乎并不需要它和presto。它现在有效。