Ios 使用UITableViewCell委派

Ios 使用UITableViewCell委派,ios,objective-c,uitableview,delegates,Ios,Objective C,Uitableview,Delegates,当我进入“编辑模式”时,我试图在我的TableViewCell中隐藏标签。所以我创建了一个协议: // UITableView Class @protocol CellDelegate <NSObject> - (void)toggleOpacityOff - (void)toggleOpacityOn @end //in @interface @property (nonatomic, strong) id <CellDelegate> delegate; 但当我运

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

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

//in @interface
@property (nonatomic, strong) id <CellDelegate> delegate;
但当我运行此操作时,这些方法仅适用于TableView中最上面的单元格。

这是为什么?我该如何修复它?非常感谢!:)

您应该能够通过更改以下行来解决此问题,以设置正确的代理(请记住,代理应始终是弱的,而不是强的!):

行:

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; 
    }
}
-(无效)更新单元格
{
对于(NSInteger i=0;i<[self tableView:self.tableView numberofrowsin节:0];i++)
{
NSIndexPath*indexPath=[NSIndexPath indexPathForRow:i第1节:0];
MyCell*cell=(MyCell*)[self-tableView:self.tableView-cellforrowatinexpath:indexPath];
cell.opacity=是;
}
}

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

只需在tableview类中保留一些BOOL,如isInEditMode。然后在cellForRowAtIndexPath中添加类似的内容

if (isInEditMode)
    [cell.myText setHidden:YES];
else 
    [cell.myText setHidden:NO];
一旦你想切换到编辑模式,你只需这样做

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

如果我正确理解了您试图执行的操作,那么您的委托代码中有一个错误。我认为委托应该是
弱的
,而不是
强的
。@Zhang没有解决问题。没有说它解决了问题,只是指出:Dbut我的cell类没有delegate属性,事实上,我确实需要它是
self.delegate=cell
,因为我的协议在我的TableView类中。但问题是,我需要从
UITableViewClass
中的其他地方调用它,我有一个按钮可以打开和关闭编辑模式,我需要从那里调用它是的,你可以。使用:
tableView:cellforrowatinexpath:
方法获取单元格,并对特定单元格调用
setOpacity
。如果需要更多,只需创建
nsindepath
对象。如果需要将此应用于所有单元格,我需要创建什么类型的nsindepath对象
CustomCell*cell=(CustomCell*)[self.tableView cellforrowatinexpath:(?)
如何对所有单元格执行此操作?
if (isInEditMode)
    [cell.myText setHidden:YES];
else 
    [cell.myText setHidden:NO];
self.isInEditMode = YES;
[self.tableview reloadData]