Использование UISearchViewController без базового UITableView (из раскадровки)

Я пытаюсь использовать 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.

Любые предложения о том, где я пошел не так?


person janineanne    schedule 06.08.2013    source источник


Ответы (1)


Оказалось, что каким-то образом у меня было два подключения к textLabel - одно правильное к IBOutlet, а другое к владельцу файла. Должно быть, именно так возвращался NSObject.

После исправления я получил ошибку утверждения в -[Константа NSLayoutConstraint]. Просто по прихоти я отключил AutoLayout в пере, которое, похоже, не нуждалось в этом, и вуаля. это работает сейчас.

person janineanne    schedule 07.08.2013