0

我正在尝试开发一个模仿 UITableView 控件行为的控件。我已经定义了一个委托协议如下:

@protocol HPSChoiceDelegate

- (void)choiceView:(HPSChoice *)choiceView didSelectChoice:(NSNumber*)selectedIndex;

@end

用户可以在主控制视图中点击子视图。我有 TapGesture 识别器在主控制视图中触发方法。我把这些连接起来是这样的:

UITapGestureRecognizer *containerTap = 
        [[UITapGestureRecognizer alloc] initWithTarget:self
                                                action:@selector(didSelectChoice:)];

然后我在视图中有一个方法,它试图在委托中调用正确的方法。视图中的方法如下所示:

-(void)didSelectChoice:(UITapGestureRecognizer*)sender
{
    NSNumber* selectedIndex = [NSNumber numberWithInt:sender.view.tag];

    [(id)self.delegate performSelector:@selector(didSelectChoice:) withObject:selectedIndex afterDelay:0.0f];
}

在委托控制器中,我定义了以下方法:

- (void)choiceView:(HPSChoice *)choiceView didSelectChoice:(NSNumber*)selectedChoice
{
    NSLog(@"HPSFormController didSelectChoice:(HPSChoice*)choiceView tag = %@",[[choiceView class] description]);
}

这一切都会编译,当我点击控件时,会在视图中调用 didSelectChoice,然后调用委托中的方法。但是,委托方法崩溃并出现以下错误:

-[HPSFormController didSelectChoice:]: unrecognized selector sent to instance 0x29b4e0

我该如何解决?非常感谢。

4

3 回答 3

1

例如,如果您的视图被调用HPSChoiceView,您还需要说明它的委托是您创建该视图的控制器。

例如,在委托控制器中的某个地方(HPSFormController我想)你需要做:

HPSChoiceView* choiceView = // alloc-init here
// self refers to an instance of HPSFormController at run-time
choiceView.delegate = self;

这意味着每次您在该视图中点击时,控制器都会响应该点击,因为它已被设置为其委托。

此外,您调用了错误的选择器。而不是打电话

[self.delegate performSelector:@selector(didSelectChoice:) withObject:selectedIndex afterDelay:0.0f];

称呼

[self.delegate performSelector:@selector(choiceView:didSelectChoice:) withObject:choiceView withObject:selectedIndex];

choiceView可以从中检索sender.viewsender是一个例子,UITapGestureRecognizer因此您可以检索被点击的视图。

要了解什么是选择器,您可以查看Objective CApple doc中的选择器。

说这个,我也会为你更改选择器 delegate HPSChoiceDelegate。因此,例如,我称之为(为了清楚起见):

- (void)didSelectChoiceView:(HPSChoice *)choiceView withSelectedIndex:(NSNumber*)selectedIndex;

如果你使用它,选择器将是didSelectChoiceView:withSelectedIndex:. 注意冒号!!

此外,我会在调用委托方法之前添加一个控件,就像@Cirylle 所建议的那样。该控件允许您验证您是否设置了委托(我的答案的第一部分),并且委托可以响应该选择器,因为它已正确实现。

希望有帮助。

于 2012-09-07T12:45:50.293 回答
1

该方法正在崩溃,因为您正在调用

didSelectChoice:

而您定义的方法是

choiceView:didSelectChoice:

I believe that you can fix this by calling:

[(id)self.delegate performSelector:@selector(choiceView:didSelectChoice:) withObject:choiceView withObject:selectedIndex];

You would have to get the choiceView in your didSelectChoice: method of course.

于 2012-09-07T12:47:23.290 回答
0

应该充当委托的类必须声明并符合HPSChoiceDelegate协议,并且它还必须将自己注册为您UITableView的“ish 类”的委托。

另外,尝试更改为@selector(choiceView:didSelectChoice:).

于 2012-09-07T12:46:46.660 回答