使用UITableViewCell委派

时间:2014-11-11 12:50:56

标签: ios objective-c uitableview delegates

当我进入“编辑模式”时,我正试图在TableViewCell中隐藏标签。所以我创建了一个协议:

// UITableView Class
@protocol CellDelegate <NSObject>
- (void)toggleOpacityOff
- (void)toggleOpacityOn
@end

//in @interface
@property (nonatomic, strong) id <CellDelegate> delegate;

我在UITableViewCell类中实现了这些方法,并将委托传递给了单元类:

// cellForRowAtIndexPath method
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

self.delegate = cell;

return cell;

但是当我运行它时,这些方法仅适用于TableView中最顶层的单元格 为什么这样,我该如何解决?非常感谢! :)

2 个答案:

答案 0 :(得分:2)

您应该可以通过更改以下行来设置正确的委托来解决这个问题(请记住委托应始终,而不是强大!):

self.delegate = cell;

到行:

cell.delegate = self;

更长的解释是委托不是实现此目的的正确方法。

代表是要回复一些特定的操作或信息,这样你的单元格实际上会告诉代表它有什么东西被打开或关闭。这没有任何意义,因为你希望切换一些东西。

实现目标的正确方法是创建UITableViewCell子类并在单元格(toggleOpacityOfftoggleOpacityOn)上实现这些方法。或者甚至更好地创建特定的单元属性并覆盖它的setter。然后,您可以在UITableViewDelegate方法tableView:didSelectRowAtIndexPath:中调用此方法。请参阅以下示例:

@interface MyCell : UITableViewCell

@property (nonatomic) BOOL opacity;

@end

@implementation MyCell

- (void)setOpacity:(BOOL)opacity
{
    if (opacity)
    {
        // Set opacity to ON
        ...
    }
    else
    {
        // Set opacity to OFF
    }
}

@end

循环遍历所有单元格:

- (void)updateCells
{
    for (NSInteger i = 0; i < [self tableView:self.tableView numberOfRowsInSection:0]; i++)
    {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];

        MyCell *cell = (MyCell *)[self tableView:self.tableView cellForRowAtIndexPath:indexPath];
        cell.opacity = YES; 
    }
}

除此之外,在模型中记住这种状态可能是明智之举,因此在重复使用单元格时(滚动时)它仍然是正确的。

答案 1 :(得分:0)

只需在tableview类中保留一些BOOL,如isInEditMode。然后你将这样的东西添加到你的cellForRowAtIndexPath

if (isInEditMode)
    [cell.myText setHidden:YES];
else 
    [cell.myText setHidden:NO];

一旦你想切换到编辑模式,你就可以这样做

self.isInEditMode = YES;
[self.tableview reloadData]