如何将参数传递给此函数?

时间:2009-01-16 12:06:12

标签: iphone objective-c

我有以下代码:

[replyAllBtn addTarget:self.target action:@selector(ReplyAll:) forControlEvents:UIControlEventTouchUpInside];

- (void)replyAll:(NSInteger)tid {
// some code
}

如何将参数发送到ReplyAll函数?

6 个答案:

答案 0 :(得分:21)

replyAll方法应该接受(id)发件人。如果UIButton触发了该事件,那么相同的UIButton将作为发件人传递。 UIButton有一个属性“标记”,您可以将自己的自定义数据附加到(很像.net winforms)。

所以你要用以下方式来结束你的活动:

[replyAllBtn addTarget:self.target action:@selector(ReplyAll:) forControlEvents:UIControlEventTouchUpInside];
replyAllBtn.tag=15;

然后处理:

(void) ReplyAll:(id)sender{
    NSInteger *tid = ((UIControl*)sender).tag;
    //...

答案 1 :(得分:2)

选择器功能通常定义如下:

- (void) ReplyAll:(id)sender;

因此,动作将获得的唯一参数是调用它的实际控件。 你可以在控件中添加一个属性,可以在replyAll中读取

答案 2 :(得分:2)

如果要发送int值,请设置button = tag要传递的int值。然后,您可以访问按钮的标记值以获得所需的int。

NSInteger不是指针。试试这个

NSInteger tid = sender.tag;

答案 3 :(得分:2)

现在正在运作:D。

{
NSInteger tid = [sender tag];
}

答案 4 :(得分:1)

Cocoa中使用的MVC模型的工作方式不同。基本上,这个想法是控件(=视图)(如按钮)只允许函数知道它被按下,而不知道这意味着什么。然后,该函数必须知道所有动态和依赖性。在您的情况下,它是必须找到参数的函数。为此,您将“绑定”其他对象到函数(=控制器)。

如果你想要推进iPhone编程,我建议你先阅读一些Cocoa教程。

答案 5 :(得分:0)

有一些很好的方法可以做到这一点。最常见的两种方法是让控制器(谁接收动作)知道可能的发送者,或让发送者本身有一种方法,最终用来确定正确的行为。

第一种(我更喜欢的方式,但很容易反驳)会像这样实施:

@interface Controller : NSObject {
    UIButton *_replyToSender;
    UIButton *_replyToAll;
}
- (void)buttonClicked:(id)sender;
@end

@implementation Controller
- (void)buttonClicked:(id)sender {
    if (sender == _replyToSender) {
         // reply to sender...
    } else if (sender == _replyToAll) {
         // reply to all...
    }
}
@end

第二种方式将以如下方式实施:

typedef enum {
    ReplyButtonTypeSender = 1,
    ReplyButtonTypeAll,
} ReplyButtonType;

@interface Controller : NSObject {
}
- (void)buttonClicked:(id)sender;
@end

@interface MyButton : UIButton {
}
- (ReplyButtonType)typeOfReply;
@end

@implementation Controller
- (void)buttonClicked:(id)sender {
    // You aren't actually assured that sender is a MyButton, so the safest thing
    // to do here is to check that it is one.
    if ([sender isKindOfClass:[MyButton class]]) {
        switch ([sender typeOfReply]) {
            case ReplyButtonTypeSender:
                // reply to sender...
                break;
            case ReplyButtonTypeAll:
                // reply to all...
                break;
        }
    }
}
@end