【问题标题】:iOS - passing arguments in action:@selector()iOS - 在行动中传递参数:@selector()
【发布时间】:2014-05-14 16:03:49
【问题描述】:

我正在以编程方式向 UITableViewCell 添加一个按钮。按下按钮时要运行的方法是- (void) quantityDown:(id)sender rowNumber:(int)rowNum,其中rowNum是按钮出现的行。

将目标添加到按钮时,Xcode 会自动完成以下内容:

[buttonDown addTarget:self action:@selector(quantityDown:rowNumber:) forControlEvents:UIControlEventTouchUpInside];

但是无论我尝试什么,我都无法将行号传递给方法。我假设代码的相关部分看起来像

action:@selector(quantityDown:rowNumber:indexPath.row)

但这并不能解决问题。我见过其他类似的东西

action:@selector(quantityDown:)rowNumber:indexPath.row

action:@selector(quantityDown:rowNumber:)withObject:@"first" withObject:@"Second"

但两者都不起作用。我不需要传递第一个参数,只需传递行号。我也尝试过定义- (void) quantityDown:(int)rowNum之类的方法,然后编写如下选择器:

action:@selector(quantityDown:indexPath.row)

但这也行不通。

想法?

提前致谢。

【问题讨论】:

  • 刚刚找到this 线程。会试试看。
  • 是的,做到了。我设置了buttonDown.tag = indexPath.row,然后在方法中我可以通过UIButton *clicked = (UIButton *)sender;访问它,然后将一个整数设置为clicked.tag
  • 您不能在按钮点击中传递值。可能的方法是从按钮发送者那里找到价值,或者在按钮点击时调用另一个方法。第一个是正确的方法。

标签: ios objective-c methods action selector


【解决方案1】:

将每个按钮标签设置为indexPath.row。然后只需声明函数:

- (void)quantityDown:(id)sender

在那个方法中这样做:

UIButton *btn = (UIButton *)sender;

像这样添加目标:

[buttonDown addTarget:self action:@selector(quantityDown:) forControlEvents:UIControlEventTouchUpInside];

btn.tag 可以得到行号。希望这可以帮助。 :)

【讨论】:

  • 是的。正如对原始问题的评论中所述,这就是我最终要做的。谢谢!
  • 欢迎您。是的,我现在看到了。可能是我忙于输入答案..:P
【解决方案2】:

为什么不创建一个Custom UIButton class 并将对象作为属性?

见下文。

“MyButton.h”

@interface MyButton : UIButton
@property(nonatomic, strong)MyClass *obj;
@end

“MyButton.m”

#import "MyButton.h"

@implementation MyButton

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

@end

现在将MyButton class 分配给单元格中的实际按钮/ 或初始化自定义按钮而不是普通的UIButton class 并直接分配对象。

在你的IBActionsender=MyButton

- (void) quantityDown:(id)sender{
   MyButton *btn  = (MyButton *)sender;
   //You get the object directly
   btn.obj;
}

这样做,您实际上可以轻松访问任意数量的属性。它在其他实现中也很有用。

希望对你有帮助。

【讨论】:

  • 是的,这是一个不错的解决方案。如果我需要更多的数据而不仅仅是行号,这肯定是我要走的路。我发现的快速修复方法目前有效,但可能无法承受日常使用的严苛要求。又是一个很好的解决方案!
【解决方案3】:

按钮只能携带一个输入,因此请保持发件人和rowNum 相同,以便轻松处理 在行方法的单元格中。

UIButton *b = [UIButton buttonWithType:UIButtonTypeContactAdd];
b.tag = indexPath.row;
[b addTarget:self action:@selector(quantityDown:) forControlEvents:UIControlEventTouchUpInside];

你的方法

 - (void)quantityDown:(id)sender  
    {    
       NSLog(@"%d", sender.tag);  
    }

希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2010-10-30
    相关资源
    最近更新 更多