如何将变量传递给我使用@selector(methodname)时调用的新方法

时间:2013-03-01 17:08:38

标签: objective-c cocoa selector

好的问题很快。我正在使用MKMapAnnotation向我的iOS添加注释。我使用公开按钮创建一个int和一个注释,它调用方法loadPano,如下所示:

int integervariable;
[disclosureButton addTarget:self 
                     action:@selector(loadPano) 
           forControlEvents:UIControlEventTouchUpInside];    

现在说我想在方法load pano中访问整数变量我该如何做到这一点,我很难理解如何像上面那样调用变量到新方法。

4 个答案:

答案 0 :(得分:1)

如果您只需传递与每个公开按钮关联的整数,您可以设置disclosurebutton.tag = integer value;

hacky在标签中传递数据,但在简单的情况下它可以正常工作。

同样为了这个工作,请以这种方式声明loadpano

- (void)loadPano:(UIButton*)sender
{
    NSInteger relevantInteger = sender.tag;
   // More code here
}

并设置目标如下:

[disclosureButton addTarget:self 
                     action:@selector(loadPano:) 
           forControlEvents:UIControlEventTouchUpInside];    

请注意,该方法现在采用一个参数,因此选择器包含一个冒号。

答案 1 :(得分:1)

有几种解决方案:

  1. 使用标签。但这只能是一个整数。
  2. 将一个实例变量(可能使用属性访问)添加到按钮的类中。这意味着您必须为按钮创建自定义类。
  3. 最常见:使用运行时函数objc_setAssociatedObject()objc_getAssociatedObject()
  4. 使用关联对象(a.k.a.关联引用)

答案 2 :(得分:0)

您无法在target-action方法中传递sender和eventType以外的值。

操作消息可以选择按顺序包含发件人和事件作为参数。

如果该integerVariable是常量,那么您可以将其设置为您从中启动该操作的控件的标记(在您的情况下,它是disclosureButton)。

您可以在类中获取实例变量,并在loadPano方法中访问该值。

答案 3 :(得分:-1)

在一般情况下,您可以使用目标,选择器及其所需的任何参数创建NSInvocation的实例。然后调用调用的-invoke方法将消息发送到目标。