Не удалось передать данные аннотаций в tableviewcontroller

ОТРЕДАКТИРОВАННЫЙ ВОПРОС:

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

У меня есть файл RegionAnnotation.h/.m NSObject, который работает с обратным геокодированием, которое мне нужно для заполнения выводов на моем 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;

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

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


person meltrek    schedule 24.08.2012    source источник
comment
В viewDidLoad строка [self.annotations addObjectsFromArray:_annotations]; не имеет смысла, потому что _annotations — это ivar, стоящий за свойством annotations, поэтому, по сути, они указывают на одно и то же. Если таблица должна показывать контакты, почему numberOfRowsInSection возвращает region.count? Какое отношение регионы имеют к аннотациям? В cellForRowAtIndexPath, почему вы создаете новый объект RegionAnnotation?   -  person    schedule 25.08.2012
comment
Вы правы насчет viewDidLoad, я хотел удалить его, спасибо. У меня есть файл .m с именем RegionAnnotation, в котором есть код, вызывающий информацию. Я отредактирую оригинал, чтобы показать.   -  person meltrek    schedule 25.08.2012
comment
Хорошо, но если у вас уже есть аннотации в контроллере представления карты, зачем вам создавать их новые экземпляры в cellForRowAtIndexPath? Разве в аннотациях на карте ВК уже не заданы заголовок и подзаголовок? До сих пор непонятно, почему у вас есть и регионы, и аннотации в PinListVC. Как карта VC создает и показывает PinListVC?   -  person    schedule 25.08.2012
comment
Да, представление карты показывает заголовок и подзаголовок при выборе булавки. Я просто не знаю, как заставить эту информацию отображаться в виде списка на столе. Я подумал, что, поскольку я вызываю информацию из файла RegionAnnotation для отображения на карте, мне нужно вызвать ту же информацию в pinlistVC. И вот где я застрял. Мне не нужно создавать новые экземпляры, просто передайте информацию. Однако я не уверен, как это сделать. Если я удалю количество регионов из viewDidLoad, то мое табличное представление будет пустым.   -  person meltrek    schedule 25.08.2012
comment
Я удалил [self.annotations addObjectsFromArray:_annotations]; все еще застряли. Любые другие предложения?   -  person meltrek    schedule 27.08.2012
comment
Эта строка была чем-то странным — ее удаление не помогло. Вопросы из моего комментария 2-дневной давности до сих пор актуальны и открыты. Позвольте спросить по-другому: у вашей карты VC есть аннотации и массив аннотаций. Ваша таблица VC использует массив регионов в качестве основы для количества строк и данных. Почему таблица ВК не использует аннотации из карты ВК? Как карта VC создает и показывает таблицу VC?   -  person    schedule 27.08.2012
comment
Вопрос 1: Относительно массива регионов как основы для подсчета строк и данных. - Из моего файла RegionAnnotation.m у меня есть (id)initWithCLRegion:(CLRegion *)newRegion, где [self.getAddress] вызывается, поэтому я вызывал массив регионов в viewDidLoad и cellForRowAtIndexPath. Если я посмотрю на журналы, я захватил все данные, включая адрес, который был геокодирован из координат долготы/широты. Но по какой-то причине я не мог заставить это заполнить ячейку. Вопрос 2: Я не знаю, как получить аннотации из MapViewController.m.   -  person meltrek    schedule 06.09.2012
comment
Я обновил вышеуказанный вопрос и удалил весь код, который не имеет отношения. Я все еще был бы признателен за помощь.   -  person meltrek    schedule 14.09.2012
comment
Хорошо, посмотрю еще раз, когда будет возможность.   -  person    schedule 14.09.2012


Ответы (1)


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

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, в том месте, где вы хотите представить/подтолкнуть/показать 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. Если вам нужно показать пользовательские свойства, которые могут быть в вашем пользовательском классе аннотаций, вы должны использовать isKindOfClass, чтобы проверить, относится ли annotation к этому типу, а затем вы можете привести его к этому пользовательскому классу и сослаться на пользовательские свойства.

person Community    schedule 15.09.2012
comment
Спасибо, Анна, я сделал что-то очень похожее на ваш ответ, прежде чем увидел это. Единственное, что я не мог получить, это заголовок для загрузки, но теперь адреса заполняют tableviewcontroller. Я рассмотрю вышеизложенное и добавлю все, что может помочь, и опубликую позже, чтобы вы знали, что это сработало. Огромное спасибо! - person meltrek; 18.09.2012