Iphone 如何将参数传递到此函数?

Iphone 如何将参数传递到此函数?,iphone,objective-c,Iphone,Objective C,我有以下代码: [replyAllBtn addTarget:self.target action:@selector(ReplyAll:) forControlEvents:UIControlEventTouchUpInside]; - (void)replyAll:(NSInteger)tid { // some code } 如何向replyll函数发送参数?Cocoa中使用的MVC模型的工作原理不同。基本上,这个想法是,控件(=视图)如按钮只让函数知道它被按下了,而不知道这意味着什么

我有以下代码:

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

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

如何向
replyll
函数发送参数?

Cocoa中使用的MVC模型的工作原理不同。基本上,这个想法是,控件(=视图)如按钮只让函数知道它被按下了,而不知道这意味着什么。然后,函数必须知道所有的动态和依赖关系。在您的例子中,函数必须找到参数。要实现这一点,您需要将其他对象“绑定”到函数(=控制器)


如果您想继续iPhone编程,我建议您先阅读一些Cocoa教程。

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

- (void) ReplyAll:(id)sender;
因此,一个动作将收到的唯一参数是调用它的实际控件。
您可以向控件中添加一个属性,该属性可以在replyll中读取。有几种很好的方法可以做到这一点。最常用的两种方法是让控制器(接收操作的人)知道可能的发送者,或者让发送者自己有一种方法,您最终可以使用该方法来确定正确的行为

第一种(我更喜欢的方式,但很容易得出相反的结论)的实现方式如下:

@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

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;
    //...

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

NSInteger不是指针。试试这个

NSInteger tid = sender.tag;
它现在工作了:D

{
NSInteger tid = [sender tag];
}

Hii,Thanx为了及时回复,我有一个疑问,既然控件是UIButton的一个实例,我如何向它添加任何属性???也许问题是要天真。。。但我真的不明白。嘿,桑克斯,这正是我想要的。。。。。。添加标记可以正常工作,但在控制器中,定义了replyAll func{NSInteger*tid=(*NSInteger)sender.tag;}会出现一个错误,称为“请求非结构或联合中的成员标记”:(感谢您澄清这一点,Rob。我正试图弄清楚我将如何实现Vijayeta所寻求的相同行为。@Vijayeta:发送者就是按钮本身,因此我相信您需要尝试“((UIControl*)发送者.tag;”。请注意,在访问tag属性之前,必须将强制转换对象括在括号中。@Vijayeta:
。tag
是一个整数,而不是指向整数的指针。
NSInteget tid=sender.tag
我已尝试过它本身,但错误与对象类型无关,它没有获取发件人的类型。这就是错误所在说明“请求非结构或联合中的成员标记”发送方是您声明的自定义类的对象吗?在这种情况下,请尝试[sender tag]而不是sender.tag。这通常有效。