В iOS возможно присоединение обратных вызовов и связывание разных отправителей? - PullRequest
1 голос
/ 11 марта 2011

Предположим, у меня есть кнопка, которую я добавляю к объекту аннотации в виде карты:

 AnnotationButton* rightButton = [AnnotationButton buttonWithType:UIButtonTypeDetailDisclosure];
            [rightButton addTarget:self
                            action:@selector(showDetails:)
                  forControlEvents:UIControlEventTouchUpInside];

Вы заметите, что кнопка вызывает функцию showDetails при нажатии.

Показать детали определяется как - (void)showDetails:(id)sender; и принимает отправителя. Есть ли способ отправить больше переменных или связать другого отправителя? Причина в том, что я хочу, чтобы кнопка нажала, чтобы сообщить мне, какая аннотация связана с этой кнопкой. Рассмотрим аннотацию как некоторый другой объект, который доступен во время контекста, где создается кнопка.

Я думал о создании подкласса класса UIButton и сохранении в нем дополнительной информации, но это похоже на хак.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 12 марта 2011

Если эта кнопка используется для rightCalloutAccessoryView или leftCalloutAccessoryView MKAnnotationView, делегат вашей карты должен получить сообщение mapView:annotationView:calloutAccessoryControlTapped: при нажатии кнопки. Это передает вам экземпляр MKAnnotationView, к которому был подключен, который имеет свойство annotation, чтобы дать вам соответствующую аннотацию. Вы должны использовать это вместо того, чтобы пытаться использовать действие для кнопки напрямую.

2 голосов
/ 11 марта 2011

Нет, нет способа изменить то, что отправлено в сообщении действия. Вы можете запросить два аргумента, но они будут кнопкой и событием, вызвавшим ее. Чтобы получить то, что вы хотите, у вас есть два варианта (о которых я могу думать сейчас).

  1. Используйте свойство кнопки tag. Вы можете присвоить каждой кнопке уникальный тег, который идентифицирует аннотацию, например, индекс аннотации в массиве. Тогда легко получить аннотацию в вашем методе showDetails:.
  2. Подкласс UIButton. Нет ничего плохого в добавлении функциональности к встроенным объектам. Все, что вам нужно добавить, это свойство для хранения какого-либо объекта. Бонус: если вы используете общий тип id для свойства и даете ему общее имя, например representedObject, вы можете использовать его и в других проектах в будущем.
  3. от Anomie Используйте objc_setAssociatedObject, чтобы добавить значение к кнопкам без создания подклассов. Возможно, вы захотите добавить категорию в UIButton, чтобы упростить ее использование.
...