关于选择者的问题

时间:2011-07-25 05:06:55

标签: iphone objective-c ipad

我有以下内容:

  UITapGestureRecognizer *tapGesture;
    SEL sel = @selector(profilePop:withUser:) withObject:tapGesture withObject:message.creator;
    tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:sel];

我想让它能够打电话:

- (void)profilePop:(UITapGestureRecognizer *)recognizer withUser:(Login *)user
{
    //some code here
}

但为什么不这样做?

3 个答案:

答案 0 :(得分:3)

选择器只知道它的名称和任何参数名称,而不知道它的参数。

UIGestureRecognizer只接受采用其类型为零或一个参数的操作。

为了做你想做的事,你需要编写一个包装器方法来将Login实例传递给profilePop:withUser:

所以,你会写这样的东西:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(profilePopWrapper:)];
[[self view] addGestureRecognizer:tapGesture];
[tapGesture release];


//....

- (void) profilePopWrapper:(UIGestureRecognizer *) gr {
    Login *someUser = ...;
    [self profilePop:gr withUser:someUser];
}

答案 1 :(得分:1)

正如the documentation中所述,行动讯息必须采取特定形式

- (void)handleGesture
- (void)handleGesture:(UIGestureRecognizer *)sender

你不能只使用任意选择器作为动作;它必须是符合上述模式之一的选择器。

答案 2 :(得分:1)

以这种方式在@selector函数中使用单个参数。

 UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(profilePop:)];

因为UITapGestureRecognizer只能识别点击识别。