How to pass variable to new method I call when using @selector(methodname)

末鹿安然 提交于 2019-11-28 12:45:47

问题


Ok very quick question. I am adding annotations to my iOS using MKMapAnnotation. I create a int and an annotation with a disclosure button Which calls the method loadPano like so:

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

Now say I want to access the integer variable in the method load pano how would I do this, I am struggling to understand how I would pass the variable to the new method when it is called like the above.


回答1:


If you just have to pass an integer associated to each disclosurebutton, you can set disclosurebutton.tag = integer value;.

Sort of hacky to pass data around in tags but in simple cases it works.

Also for this to work, declare loadpano this way:

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

And set the target like this:

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

Note that the method now takes a parameter so the selector includes a colon.




回答2:


There are several solutions:

  1. Use the tag. But this can only be an integer.
  2. Add an instance variable (probably accessed using a property) to the class of the button. That means you must make a custom class for the button.
  3. Most general: Use associated objects (a.k.a. associative references), using the runtime functions objc_setAssociatedObject() and objc_getAssociatedObject()



回答3:


You can not pass values other than sender and eventType in target-action methods.

The action message may optionally include the sender and the event as parameters, in that order.

If that integerVariable is a constant, then you can set it as a tag for the control from which you are initiating that action (in your case it is disclosureButton).

or

You can take an instance variable in your class, and access that value in loadPano method.




回答4:


In the general case, you can create an instance of NSInvocation with your target, selector, and whatever parameters it needs. Then you call the invocation's -invoke method to send the message to the target.



来源:https://stackoverflow.com/questions/15163100/how-to-pass-variable-to-new-method-i-call-when-using-selectormethodname

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!