当我进入“编辑模式”时,我正试图在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中最顶层的单元格 为什么这样,我该如何解决?非常感谢! :)
答案 0 :(得分:2)
您应该可以通过更改以下行来设置正确的委托来解决这个问题(请记住委托应始终弱,而不是强大!):
self.delegate = cell;
到行:
cell.delegate = self;
更长的解释是委托不是实现此目的的正确方法。
代表是要回复一些特定的操作或信息,这样你的单元格实际上会告诉代表它有什么东西被打开或关闭。这没有任何意义,因为你希望切换一些东西。
实现目标的正确方法是创建UITableViewCell
子类并在单元格(toggleOpacityOff
和toggleOpacityOn
)上实现这些方法。或者甚至更好地创建特定的单元属性并覆盖它的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]