2013-08-06 2 views
1

Я пытаюсь использовать UISearchDisplayController для поиска с CLGeocode в качестве типов пользователей для использования с MKMapView. Контроллер моего представления имеет только две вещи: UISearchBar, связанный с UISearchDisplayController и видом карты. Я использую Раскадку.Использование UISearchViewController без базового UITableView (из раскадровки)

Обычно можно было бы сделать это с использованием основного вида таблицы и объявить там прототип ячейки, но, похоже, здесь нет способа сделать это, так как у меня нет табличного представления. Поэтому я создал подкласс UITableViewCell под названием SearchTableViewCell с соответствующим 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; 
} 

И мой код таблицы выглядит так:

- (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. Тем не менее, линия, dequeues новой ячейки не удается с исключением в первый раз, это называется:

'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.

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

ответ

0

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

После того, как я установил это, я получил отказ от утверждения в [NSLayoutConstraint constant]. Просто по прихоти я выключил AutoLayout в наконечнике, который, похоже, не нуждался в нем и престо. он работает сейчас.

Смежные вопросы