将参数传递给addTarget:action:forControlEvents

Pie*_*nan 124 iphone cocoa-touch objective-c ios uicontrolevents

我正在使用addTarget:action:forControlEvents,如下所示:

[newsButton addTarget:self
action:@selector(switchToNewsDetails)
forControlEvents:UIControlEventTouchUpInside];

我想将参数传递给我的选择器"switchToNewsDetails".我成功的唯一方法是通过写入来传递(id)发件人:

action:@selector(switchToNewsDetails:)

但我试图传递整数值之类的变量.以这种方式编写不起作用:

int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];

以这种方式编写它也不起作用:

int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];

任何帮助,将不胜感激 :)

Vla*_*mir 172

action:@selector(switchToNewsDetails:)
Run Code Online (Sandbox Code Playgroud)

您不在switchToNewsDetails:此处将参数传递给方法.您只需创建一个选择器,使按钮能够在发生特定操作时调用它(在您的情况下触摸).控件可以使用3种类型的选择器来响应操作,所有这些选择器都具有预定义的参数含义:

  1. 没有参数

    action:@selector(switchToNewsDetails)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 带有1个参数,表示发送消息的控件

    action:@selector(switchToNewsDetails:)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用2个参数指示发送消息的控件和触发消息的事件:

    action:@selector(switchToNewsDetails:event:)
    
    Run Code Online (Sandbox Code Playgroud)

目前尚不清楚您尝试做什么,但考虑到您想为每个按钮分配特定的详细信息索引,您可以执行以下操作:

  1. 为每个按钮设置一个标签属性,等于所需的索引
  2. switchToNewsDetails:方法中,您可以获取该索引并打开相应的deatails:

    - (void)switchToNewsDetails:(UIButton*)sender{
        [self openDetails:sender.tag];
        // Or place opening logic right here
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 如果我们试图传递除整数之外的东西怎么办?如果我需要像字符串一样传递一个对象怎么办? (4认同)
  • 您无需单独传递它.如果你传递任何NSObject,你可以说`[button.layer setValue:yourObject forKey:@"anyKey"];`然后在方法中只检查`(objectClass*)[button.layer valueForKey:@"anyKey"] ;`这就像`.tag`的更免费版本 (3认同)

Yur*_*yev 64

要通过自定义参数和按钮单击,您只需要SUBCLASS UIButton.

(ASR已启用,因此代码中没有版本.)

这是myButton.h

#import <UIKit/UIKit.h>

@interface myButton : UIButton {
    id userData;
}

@property (nonatomic, readwrite, retain) id userData;

@end
Run Code Online (Sandbox Code Playgroud)

这是myButton.m

#import "myButton.h"
@implementation myButton
@synthesize userData;
@end
Run Code Online (Sandbox Code Playgroud)

用法:

myButton *bt = [myButton buttonWithType:UIButtonTypeCustom];
[bt setFrame:CGRectMake(0,0, 100, 100)];
[bt setExclusiveTouch:NO];
[bt setUserData:**(insert user data here)**];

[bt addTarget:self action:@selector(touchUpHandler:) forControlEvents:UIControlEventTouchUpInside];

[view addSubview:bt];
Run Code Online (Sandbox Code Playgroud)

接收功能:

- (void) touchUpHandler:(myButton *)sender {
    id userData = sender.userData;
}
Run Code Online (Sandbox Code Playgroud)

如果您需要我对上述代码的任何部分更具体 - 请随时在评论中询问.

  • 很棒的答案......非常可定制.正是我在寻找什么.MOLODETS!:) (2认同)

Ben*_*oît 19

Target-Action允许三种不同形式的动作选择器:

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event
Run Code Online (Sandbox Code Playgroud)


Alb*_*haw 15

需要的不仅仅是(int)via .tag?使用KVC!

您可以通过按钮对象本身传递您想要的任何数据(通过访问CALayers keyValue dict).


像这样设置目标(使用":")

[myButton addTarget:self action:@selector(buttonTap:) forControlEvents:UIControlEventTouchUpInside];
Run Code Online (Sandbox Code Playgroud)

将您的数据添加到按钮本身(以及.layer按钮),如下所示:

NSString *dataIWantToPass = @"this is my data";//can be anything, doesn't have to be NSString
[myButton.layer setValue:dataIWantToPass forKey:@"anyKey"];//you can set as many of these as you'd like too!
Run Code Online (Sandbox Code Playgroud)

然后,当点击按钮时,您可以像这样检查:

-(void)buttonTap:(UIButton*)sender{

    NSString *dataThatWasPassed = (NSString *)[sender.layer valueForKey:@"anyKey"];
    NSLog(@"My passed-thru data was: %@", dataThatWasPassed);

}
Run Code Online (Sandbox Code Playgroud)


Abh*_*ngh 7

我部分地根据上述信息制定了解决方案.我只是将titlelabel.text设置为我想要传递的字符串,并设置titlelabel.hidden = YES

像这样 :

UIButton *imageclick = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
imageclick.frame = photoframe;
imageclick.titleLabel.text = [NSString stringWithFormat:@"%@.%@", ti.mediaImage, ti.mediaExtension];
imageclick.titleLabel.hidden = YES;
Run Code Online (Sandbox Code Playgroud)

这样,就不需要继承或类别,也没有内存泄漏


小智 5

我正在为阵列中的每个电话号码创建几个按钮,因此每个按钮需要一个不同的电话号码才能呼叫.我使用setTag函数,因为我在for循环中创建了几个按钮:

for (NSInteger i = 0; i < _phoneNumbers.count; i++) {

    UIButton *phoneButton = [[UIButton alloc] initWithFrame:someFrame];
    [phoneButton setTitle:_phoneNumbers[i] forState:UIControlStateNormal];

    [phoneButton setTag:i];

    [phoneButton addTarget:self
                    action:@selector(call:)
          forControlEvents:UIControlEventTouchUpInside];
}
Run Code Online (Sandbox Code Playgroud)

然后在我的调用中:方法我使用相同的for循环和if语句来选择正确的电话号码:

- (void)call:(UIButton *)sender
{
    for (NSInteger i = 0; i < _phoneNumbers.count; i++) {
        if (sender.tag == i) {
            NSString *callString = [NSString stringWithFormat:@"telprompt://%@", _phoneNumbers[i]];
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:callString]];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)