我想要做的是基本上用我的按钮发送某种形式的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;
}
答案 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
。