如何从单元格调用父表视图方法?

时间:2014-07-29 13:29:57

标签: ios objective-c uitableview

我有一个带有标签的自定义单元格,该标签应该触发父/表视图控制器的方法。

即使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

谢谢!

3 个答案:

答案 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;
}

这是我认为最简单的方式。