我正在尝试开发一个模仿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
我该如何解决这个问题?非常感谢。
答案 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.view
。 sender
的格式为UITapGestureRecognizer
,因此您可以检索已点按的视图。
要了解选择器的内容,您可以看到Selectors in Objective C和Apple 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:)
。