селектор, добавляющий параметры - PullRequest
3 голосов
/ 14 июля 2011

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

У меня есть NSMutableArray аннотаций, в которые я добавляю кнопку к деталям булавки. Кнопка работает и загружает следующий вид, но я хочу выяснить, какая кнопка была нажата.

Я использую синглтон с массивом NSMutableArray. Синглтон зовут Хелпер

То, что я сделал, было:

Helper* array = [Helper sharedManager];
int clickedNum = [array.array indexOfObject:annotation];
[myDetailButton setTag:clickedNum];
[myDetailButton addTarget:self action:@selector(moreInfo:event:) forControlEvents:UIControlEventTouchUpInside];

Именно здесь я создаю аннотации, которые идут на карту. Следующая строка - это идентификатор моей функции

- (IBAction)moreInfo:(UIButton*)sender

И здесь я хочу получить тег

Helper *array = [Helper sharedManager];
array.clicked = sender.tag;

Когда я запускаю это и нажимаю на кнопку в одной из моих аннотаций, я получаю исключение, которое говорит NSInvalidArgumentException, причина: - (MapViewController moreInfo: event:]

Любая помощь будет оценена

Edit:

По запросу интерфейса для помощника:

@interface Helper : NSObject {
    NSMutableArray *array;
    int clicked;
}
@property (nonatomic, retain) NSMutableArray *array;
@property (nonatomic) int clicked;

+(id)sharedManager;

@end    

Также я подумал, что стоит добавить:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{
static NSString *identifier = @"Events";
MKPinAnnotationView *retval = nil;
if ([annotation isKindOfClass:[Events class]]) 
{

    (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

    if (retval == nil) {
        retval = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];
        Helper *array = [Helper sharedManager];
        int clickedNum = [array.array indexOfObject:annotation];
        // Set up the Left callout
        UIButton *myDetailButton = [UIButton buttonWithType:UIButtonTypeCustom];
        myDetailButton.frame = CGRectMake(0, 0, 23, 23);
        myDetailButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        myDetailButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
        [myDetailButton setTag:clickedNum];
        NSLog([NSString stringWithFormat:@"Testing tag: %@", clickedNum]);
        [myDetailButton addTarget:self action:@selector(moreInfo:) forControlEvents:UIControlEventTouchUpInside];
        // Set the image for the button
        [myDetailButton setImage:[UIImage imageNamed:@"icon72.png"] forState:UIControlStateNormal];

        // Set the button as the callout view
        retval.leftCalloutAccessoryView = myDetailButton;
    }


    if (retval) {
        [retval setPinColor:MKPinAnnotationColorGreen];
        retval.animatesDrop = YES;
        retval.canShowCallout = YES;
    }
}

return retval;   
}

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

Ваш метод moreInfo: не соответствует тому, что вы установили в качестве селектора в

[myDetailButton addTarget:self action:@selector(moreInfo:event:) forControlEvents:UIControlEventTouchUpInside];

Так измените это на

[myDetailButton addTarget:self action:@selector(moreInfo:) forControlEvents:UIControlEventTouchUpInside];

Или измените определение метода.

0 голосов
/ 14 июля 2011

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

Вместо добавления собственного целевого действия + используйте метод делегата mapView:annotationView:calloutAccessoryControlTapped: представления карты, который будет вызываться при касании представления выноски. Там аннотация доступна как view.annotation. Вам не нужно устанавливать тег кнопки или использовать индекс аннотации.

Например, см. этот другой ответ .

Отдельная проблема заключается в том, что в вашем методе viewForAnnotation вы вызываете dequeueReusableAnnotationViewWithIdentifier, но ничего не делаете с результатом (поэтому не получаете повторного использования). Вместо этого ему следует присвоить retval, а внутри последнего if установить retval.annotation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...