我有一个带有标签的自定义单元格,该标签应该触发父/表视图控制器的方法。
即使XCode在自动填充建议中提供了该方法,但当我点击该特定标签时,它会引发错误:
UITableViewWrapperView showUserProfile unrecognized selector sent to instance
这是我的代码:
@implementation ItemTableViewCell
@synthesize item;
- (void)awakeFromNib
{
self.authorLabel.userInteractionEnabled = YES;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showUserProfile)];
[self.authorLabel addGestureRecognizer:tap];
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
}
- (void)showUserProfile
{
id parentView = [self superview];
[parentView showUserProfile];
}
@end
谢谢!
答案 0 :(得分:3)
这不是将一些操作传递给tableview的好方法。您必须在自定义类UITableViewCell和控制器之间使用委托。
在您的自定义UITableViewCell.h
中@protocol myUITableViewCellDelegate
@interface myUITableViewCell : UITableViewCell
@property (nonatomic, assign) id<myUITableViewCellDelegate> delegate;
@end
@protocol myUITableViewCellDelegate <NSObject>
-(void) cellDidTap:(myUITableViewCell*) sender
@end
在您的自定义UITableViewCell.m
中...
- (void)showUserProfile
{
[self.delegate cellDidTap:self];
}
...
在您的控制器中
-(UITableViewCell*) tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexpath
{
......
cell.delegate = self
......
}
-(void) cellDidTap:(myUITableViewCell*) sender
{
[self showUserProfile];
}
答案 1 :(得分:1)
您可以将控制器(例如托管UITableView的ViewController)添加到自定义单元格中。然后,你使用类似的东西:
if ([self.controller respondsToSelector:@selector("afunctioname")]) {
[self.controller performSelector:@selector("afunctionname")];
}
您的customCell:MyTableViewCell标题
@property (nonatomic, assign) id controller;
方法cellforRow;
MyTableViewCell *aCell = ...
aCell.controller = self
..
return aCell;
如果'afunctioname'接受参数,您可以向此选择器添加参数。如果您有多个参数,请使用NSDictionary作为参数。
答案 2 :(得分:1)
视图与视图控制器之间存在差异。视图控制器的类是UIViewController
(或子类),它具有类view
的属性UIView
,它控制它,它是视图控制器的“可见部分”。
方法
- (void)showUserProfile
{
id parentView = [self superview];
[parentView showUserProfile];
}
您在表格视图单元格的超级视图上调用showUserProfile
,但在视图控制器上调用而不是。由于您不知道UITableView
的内部实现,您甚至无法确定单元格的超级视图与表视图控制器的view
相同。事实上,事实并非如此。因为从错误日志中可以看出,表视图本身具有类UITableViewWrapperView
的子视图,其中包含所有单元格。但是这个视图对你在表视图控制器中声明的方法一无所知。这就是应用程序崩溃的原因。
要在表视图控制器中调用方法,您可以按tdelepine的建议声明委托,也可以在出列后立即在表视图控制器的tableView:cellForRowAtIndexPath:
方法中向按钮添加操作。细胞:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
ItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"yourID"];
[cell.yourButton addTarget:self action:@selector(showUserProfile) forControlEvents:UIControlEventTouchUpInside];
// customize other properties of your cell
return cell;
}
这是我认为最简单的方式。