Я пытаюсь использовать UISearchDisplayController для поиска с помощью CLGeocode в качестве типов пользователей для использования с MKMapView. В моем контроллере представления есть только две вещи: UISearchBar, связанный с UISearchDisplayController, и представление карты. Я использую раскадровку.
Обычно это можно было бы сделать с базовым табличным представлением и объявить там ячейку-прототип, но здесь, похоже, нет способа сделать это, поскольку у меня нет табличного представления. Поэтому я создал подкласс UITableViewCell под названием SearchTableViewCell со связанным пером.
На наконечнике находится одна этикетка, к которой подключен этот выход:
@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;
}
И мой код таблицы выглядит так:
- (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.
Любые предложения о том, где я пошел не так?