选择器添加参数

时间:2011-07-14 12:32:05

标签: iphone objective-c ios ipad mapkit

我想要做的是基本上用我的按钮发送某种形式的id,这样我就可以计算出哪一个被点击了。我的按钮被动态创建,并且所有按钮都执行加载新视图的相同功能,我想知道点击了哪个按钮,所以我可以在新视图上显示正确的数据。

我有一个注释的NSMutableArray,我在引脚的细节上添加了一个按钮。按钮工作,它加载下一个视图,但我想弄清楚按下了哪个按钮。

我使用一个名为array的NSMutableArray的单例。单身人士的名字是帮手

我做的是:

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

这就是我创建进入地图的注释的地方。下一行是我的功能ID

- (IBAction)moreInfo:(UIButton*)sender

这就是我想要检索标签的地方

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

当我运行它并单击我的一个注释中的按钮时,我得到一个异常说NSInvalidArgumentException,原因: - (MapViewController moreInfo:event:]

任何帮助都是适当的

编辑:

根据要求提供帮助界面:

@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 个答案:

答案 0 :(得分:4)

您的方法moreInfo:与您在

中设置的选择器不匹配
[myDetailButton addTarget:self action:@selector(moreInfo:event:) forControlEvents:UIControlEventTouchUpInside];

所以改为

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

或更改方法定义。

答案 1 :(得分:0)

虽然Deepak的答案是正确的并且可行,但由于您的按钮是注释标注附件视图,因此可以更轻松地判断选择了哪个注释按钮。

使用地图视图的mapView:annotationView:calloutAccessoryControlTapped:委托方法,而不是添加自己的目标+操作,该方法将在点按标注视图时被调用。在那里,注释可以view.annotation获得。您无需设置按钮标记或使用注释的索引。

有关示例,请参阅this other answer

另一个问题是,在viewForAnnotation方法中,您正在调用dequeueReusableAnnotationViewWithIdentifier但不对结果执行任何操作(因此不会重复使用)。相反,应将其分配到retval并在最后if内,设置retval.annotation