2012-08-24 5 views
1

EDITED ВОПРОС:Невозможно передать данные аннотаций к tableviewcontroller

Я пытаюсь взять аннотации, созданные в виде карты (с заголовком/подзаголовком) и нажать все аннотации на моей карте в Tableview показывает список с названием/субтитры.

У меня есть файл NSObject RegionAnnotation.h/.m, который работает с обратным геокодированием, мне нужно заполнить контакты на моем MapViewController. Это прекрасно работает. Я делаю длинную печать, которая создает вывод, и заголовок и субтитры появляются, и обратное геокодирование работает.

Теперь я хочу надавить данные штыря в список таблиц. Я попытался вызвать информацию о аннотации региона в пределах cellForRowAtIndexPath, и я использую UITableViewCellStyleSubtitle, чтобы получить правильный формат для ячейки, чтобы заполнить заголовок и субтитры. Однако, когда я называю следующее:

if (cell == nil){ 
    NSLog(@"if cell"); 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
     } 

CLPlacemark *pins = [self.annotations objectAtIndex:indexPath.row]; 
RegionAnnotation *annotation = [[RegionAnnotation alloc] initWithLocationIdentifier:(NSString *)pins]; 
cell.textLabel.text = annotation.title; 

я только получить титул, который в этом случае является «Location Reminder», однако, информация субтитров, которая является адресом не заполняет таблицу. Все, что отображается, это текст «субтитры».

Как заполнить ячейку как заголовком, так и информацией об утилях. Я работаю над этим уже более месяца и не могу найти решение. Пожалуйста помоги.

+1

В viewDidLoad строка '[self.annotations addObjectsFromArray: _annotations];' не имеет смысла, потому что _annotations является Ивар за собственность аннотаций так, по существу, они указывают на одно и то же. Если таблица должна показывать контакты, почему numberOfRowsInSection возвращает region.count? Какие регионы связаны с аннотациями? В cellForRowAtIndexPath, почему вы создаете новый объект RegionAnnotation? – Anna

+0

Вы правы относительно viewDidLoad, я хотел удалить это, спасибо. У меня есть файл .m, называемый RegionAnnotation, который имеет код, который вызывает информацию. Я отредактирую оригинал, чтобы показать. – meltrek

+0

OK, но если у вас уже есть аннотации на контроллере отображения карты, зачем вам создавать новые экземпляры в cellForRowAtIndexPath? Разве аннотации на карте VC уже имеют заголовок и набор субтитров? Пока неясно, почему у вас есть оба региона и аннотации в PinListVC. Как карта VC создает и показывает PinListVC? – Anna

ответ

0

Некоторые комментарии к последней версии кода отвечал:

CLPlacemark *pins = [self.annotations objectAtIndex:indexPath.row]; 
RegionAnnotation *annotation = [[RegionAnnotation alloc] 
    initWithLocationIdentifier:(NSString *)pins]; 

Это не выглядит правильно. Переменная pins объявлена ​​как CLPlacemark (что само по себе является подозрительным, потому что CLPlacemark не соответствует MKAnnotation, так почему же он находится в массиве «аннотаций»?), А затем он отливается NSString *, который не имеет отношения к CLPlacemark. Листинг не преобразует pins в строку - он будет обрабатывать данные, на которые указывает pins, как если бы это был NSString (а это не так).

Слишком много других вопросов, вопросов и неизвестных с предыдущим кодом, который был опубликован также.


Вместо этого я приведу пример того, как вы могли бы пройти аннотаций, которые находятся на карте зрения на вид таблицы и показать данные в клетках ...

  • В PinListViewController (один с видом таблицы), мы объявить NSArray свойство получать и ссылаться на аннотации:

    //in the .h: 
    //Don't bother declaring an ivar with the same name. 
    @property (nonatomic, retain) NSArray *annotations; 
    //in the .m: 
    @synthesize annotations; 
    
  • Далее, в MapViewController, в том месте, Wher е вы хотите представить/PUSH/показать PinListViewController, код будет выглядеть примерно так:

    PinListViewController *plvc = [[PinListViewController alloc] init... 
    
    //pass the map view's annotations array... 
    plvc.annotations = mapView.annotations; 
    
    [self presentModalViewController:plvc animated:YES]; //or push, etc. 
    
    [plvc release]; //remove if using ARC 
    

    Важным моментом здесь является то, что этот пример посылает массив целые аннотаций. Если вы показываете текущее местоположение пользователя, используя showsUserLocation = YES, тогда массив будет включать эту аннотацию. Если вы хотите только отправить определенные аннотации, вам нужно сначала создать новый массив, содержащий те, которые вы хотите, из массива отображения карты, и установить plvc.annotations, равный этому новому массиву.Простым способом для этого является цикл через mapView.annotations, и если аннотация - это одна, которую вы хотите включить, добавьте ее в новый массив, используя addObject. Еще одна возможная проблема с использованием массива annotations вида карты - это то, что если аннотации на карте меняются (добавляются/удаляются) , а в представлении таблицы по-прежнему отображается список аннотаций, он будет выходить из синхронизации и может привести к сбою, исключения по временному диапазону. Чтобы этого избежать, при необходимости вы можете установить plvc.annotations на копию массива аннотаций вида карты (то есть [mapView.annotations copy]).

  • В PinListViewController, в numberOfRowsInSection метода:

    return self.annotations.count; 
    
  • В PinListViewController, в методе cellForRowAtIndexPath:

    //typical dequeue/alloc+init stuff here... 
    //assume cell style is set to UITableViewCellStyleSubtitle 
    
    id<MKAnnotation> annotation = [self.annotations objectAtIndex:indexPath.row]; 
    cell.textLabel.text = annotation.title; 
    cell.detailTextLabel.text = annotation.subtitle; 
    
    return cell; 
    

    annotation объявлен как id<MKAnnotation> поэтому он будет работать с любым типом аннотация, так как в этом примере должен отображаться только стандарт title и subtitle propertyt х годов. Если вам нужно показать пользовательские свойства, которые могут быть у вас в вашем пользовательском классе аннотаций, вы должны использовать isKindOfClass, чтобы проверить, является ли annotation этого типа, а затем вы можете отнести его к этому настраиваемому классу и ссылаться на пользовательские свойства.

+0

Спасибо, Анна, я сделал что-то очень похожее на ваш ответ, прежде чем увидел это. Единственное, что я не смог получить, - это название для загрузки, но теперь адреса заполняют диспетчер tableview. Я рассмотрю вышеизложенное и добавлю все, что может помочь, и опубликуйте позже, чтобы вы знали, что это сработало. Огромное спасибо! – meltrek

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