我有以下代码:
[replyAllBtn addTarget:self.target action:@selector(ReplyAll:) forControlEvents:UIControlEventTouchUpInside];
- (void)replyAll:(NSInteger)tid {
// some code
}
如何将参数发送到ReplyAll
函数?
答案 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