在自定义视图中重现tableView委托行为

时间:2012-09-07 12:34:03

标签: objective-c ios delegates performselector uitableview

我正在尝试开发一个模仿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

我该如何解决这个问题?非常感谢。

3 个答案:

答案 0 :(得分: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,因此您可以检索已点按的视图。

要了解选择器的内容,您可以看到Selectors in Objective CApple doc

说这个,我也会改变你委托HPSChoiceDelegate的选择器。所以,例如,我会称之为(仅为了清晰起见):

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

如果您使用此选项卡,则选择器将为didSelectChoiceView:withSelectedIndex:。注意冒号!!

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

希望有所帮助。

答案 1 :(得分:1)

由于您正在调用

,因此该方法崩溃了
didSelectChoice:

,而您定义的方法是

choiceView:didSelectChoice:

我相信您可以通过致电:

来解决这个问题
[(id)self.delegate performSelector:@selector(choiceView:didSelectChoice:) withObject:choiceView withObject:selectedIndex];

当然,你必须在didSelectChoice:方法中获得choiceView。

答案 2 :(得分:0)

应该充当委托的类必须声明并符合HPSChoiceDelegate协议,并且还必须将自己注册为UITableView'ish class的代表。

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