Mapkit с несколькими аннотациями (выноской), отображающими следующий вид

Нужна помощь с проблемой с мапкитом, с которой я столкнулся. Должно быть глупая проблема, или я что-то пропустил, просматривая структуру мапкита.

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

Я проверил все деликатные наборы карт, но не нашел ни одного, где я мог бы сопоставить эту информацию со следующим видом и аннотацией.

Надеюсь, я не запутал вас, ребята, в моем вопросе. Пожалуйста, дайте мне знать, я переформулирую его.

Спасибо заранее.


person Ameya    schedule 15.08.2010    source источник
comment
Я также создаю аннотационный штифт, как и вы. По щелчку моей аннотации pi мне нужно передать некоторые значения моему следующему классу. но я застрял между ними. Не могли бы вы помочь мне или предоставить пример кода для передачи значений на щелчок по аннотации к следующему классу   -  person Rocky    schedule 11.05.2011


Ответы (3)


Когда вы создаете UIButton для аннотации, задайте для свойства tag (тег является свойством NSInteger для UIView) идентификатор или индекс массива, который идентифицирует соответствующий объект. Затем вы можете получить это значение тега из параметра sender в свой селектор.


Изменить: вот пример кода.

Вы создаете свое представление аннотации и связываете кнопку с вашим делегатом -mapView:viewForAnnotation: метод:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    // Boilerplate pin annotation code
    MKPinAnnotationView *pin = (MKPinAnnotationView *) [self.map dequeueReusableAnnotationViewWithIdentifier: @"restMap"];
    if (pin == nil) {
        pin = [[[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: @"restMap"] autorelease];
    } else {
        pin.annotation = annotation;
    }
    pin.pinColor = MKPinAnnotationColorRed
    pin.canShowCallout = YES;
    pin.animatesDrop = NO;

    // now we'll add the right callout button
    UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    // customize this line to fit the structure of your code.  basically
    // you just need to find an integer value that matches your object in some way:
    // its index in your array of MKAnnotation items, or an id of some sort, etc
    // 
    // here I'll assume you have an annotation array that is a property of the current
    // class and we just want to store the index of this annotation.
    NSInteger annotationValue = [self.annotations indexOfObject:annotation];

    // set the tag property of the button to the index
    detailButton.tag = annotationValue;

    // tell the button what to do when it gets touched
    [detailButton addTarget:self action:@selector(showDetailView:) forControlEvents:UIControlEventTouchUpInside];

    pin.rightCalloutAccessoryView = detailButton;
    return pin;

}

Затем в методе действия вы распаковываете значение из tag и используете его для отображения нужных сведений:

-(IBAction)showDetailView:(UIView*)sender {
    // get the tag value from the sender
    NSInteger selectedIndex = sender.tag;
    MyAnnotationObject *selectedObject = [self.annotations objectAtIndex:selectedIndex];

    // now you know which detail view you want to show; the code that follows
    // depends on the structure of your app, but probably looks like:
    MyDetailViewController *detailView = [[MyDetailViewController alloc] initWithNibName...];
    detailView.detailObject = selectedObject;

    [[self navigationController] pushViewController:detailView animated:YES];
    [detailView release];
}
person Seamus Campbell    schedule 15.08.2010
comment
не могли бы вы вставить образец, ваш подход кажется мне запутанным - person Ameya; 15.08.2010
comment
Ой, забыл добавить кнопку на пин. - person Seamus Campbell; 16.08.2010
comment
Хотя не могли бы вы объяснить строку NSInteger annotationValue = [self.annArray indexOfObject:annotation];. Эта строка приводит к сбою приложения, когда я использую свой массив аннотаций. Это то, что вы имели в виду? annArray = [NSArray arrayWithObjects:ann1,ann2,ann3,ann4,nil];[mapView addAnnotations:annArray]; Так что я бы использовал nnArray. Нужны ли мне дополнительные данные для объекта аннотации? - person daihovey; 26.08.2010
comment
вы храните annArray в переменной экземпляра? Строка, о которой вы спрашиваете, указывает, для какой аннотации вы создаете представление, чтобы вы могли получить ее позже в showDetailView. Что показывает консоль после сбоя приложения? - person Seamus Campbell; 26.08.2010
comment
Да, nnArray — это переменная экземпляра, которая настраивается в viewDidLoad, где она добавляется к представлению карты. [mapView addAnnotations:annArray] Как ни странно, если я даже попытаюсь отследить содержимое annArray внутри метода mapView:viewForAnnotation:, произойдет сбой. Что-то определенно не так. Консоль ничего умного не говорит. - person daihovey; 27.08.2010
comment
Похоже, вы где-то перевыпускаете annaArray. Я предлагаю вам опубликовать вопрос и показать свой код. - person Seamus Campbell; 27.08.2010

Можно ли в представлении «Аннотации» получить, скажем, заголовок или подзаголовок или любую другую информацию, которую вы использовали при создании пинов? Что я хочу сделать, так это иметь всплывающее окно определенного изображения в аннотации на основе одной из этих переменных.

#import "MapPin.h"

@implementation MapPin


@synthesize coordinate;
@synthesize title;
@synthesize subtitle;
@synthesize indexnumber;
@synthesize imageFile;

-(id)initWithCoordinates:(CLLocationCoordinate2D)location
               placeName: placeName
             description:description
                indexnum:indexnum
            imageFileLoc:imageFileLoc{

    self = [super init];
    if (self != nil) {
        imageFile=imageFileLoc;
        [imageFile retain];
        indexnumber=indexnum;
        [indexnumber retain];
        coordinate = location;
        title = placeName;
        [title retain];
        subtitle = description;
        [subtitle retain];
    }
    return self;

}



-(void)addAnnotations {

    // Normally read the data for these from the file system or a Web service
    CLLocationCoordinate2D coordinate = {35.9077803, -79.0454936};
    MapPin *pin = [[MapPin alloc]initWithCoordinates:coordinate
                                          placeName:@"Keenan Stadium"
                                        description:@"Tar Heel Football"
                                            indexnum:@"1"
                                        imageFileLoc:@"owl.jpg"];
    [self.map addAnnotation:pin];
person Tony    schedule 08.12.2010
comment
Пожалуйста, поместите новый, отдельный вопрос. - person Pål Brattberg; 26.04.2011

Другой вариант:

Вы можете реализовать эти методы:

- (void)mapView:(MKMapView *)mapView didSelectAnnotation:(MKAnnotationView *)view;
- (void)mapView:(MKMapView *)mapView didDeselectAnnotation:(MKAnnotationView *)view;
person LittlePhoenix    schedule 15.03.2012