我在 UITableView 中有一个自定义单元格,由自定义类(.h 和 .m 文件)定义。我能够显示单元格,并更改列表中每个单元格的文本,但我的自定义单元格中也有按钮(实际上是两个)。当我单击按钮时,我需要知道单击了哪一行的按钮。有没有办法在自定义 ui 单元类中得到这个?
我希望我的要求很清楚。如果没有,请随时发表评论,我会尽力解释。
我在 UITableView 中有一个自定义单元格,由自定义类(.h 和 .m 文件)定义。我能够显示单元格,并更改列表中每个单元格的文本,但我的自定义单元格中也有按钮(实际上是两个)。当我单击按钮时,我需要知道单击了哪一行的按钮。有没有办法在自定义 ui 单元类中得到这个?
我希望我的要求很清楚。如果没有,请随时发表评论,我会尽力解释。
您可以使用这种方法:
为每个按钮设置一个关联的对象值。您可以通过向 UIButton 添加类别来支持这一点
@interface UIButton (AssociatedObject)
@property ( nonatomic, retain ) id associatedObject ;
@end
执行:
@implementation UIButton (AssociatedObject)
-(void)setAssociatedObject:(id)object
{
objc_setAssociatedObject( self, @"_associatedObject", object, OBJC_ASSOCIATION_RETAIN_NONATOMIC ) ;
}
-(id)associatedObject
{
return objc_getAssociatedObject( self, @"_associatedObject" ) ;
}
@end
像这样使用:
myButton.associatedObject = <some object>
将操作/目标设置为您的视图控制器(或者可能是表视图委托)
[ myButton addTarget:<view controller> action:@selector( buttonTapped: ) forControlEvents:UIControlEventTouchUpInside ] ;
在您的操作中,查看发件人的关联对象。发件人将是您的 UIButton
-(void)buttonTapped:(UIButton*)sender
{
// retrieve object associated with the tapped button:
id associatedObject = sender.associatedObject ;
}
您没有显示任何要评论的代码,但一般来说,您可以:
为每个按钮定义一个tag
代表按钮出现的表格行;
当您的按钮操作方法被调用时,您可以访问tag
按钮的属性以了解它是哪一行。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
...
}
...
[button setTag:indexPath.row];
...
}
- (void)buttonPressedAction:(id)sender
{
UIButton *button = (UIButton *)sender;
int row = button.tag;
}
如需更详细的解决方案,请查看此 SO thread。
我通过protocol
为自定义单元格类创建一个,然后为每个自定义单元格UIViewController
处理UITableView
这个来完成此操作delegate
。
然后我将 附加UIButton
到IBAction
自定义单元格类中的一个调用它的委托,并提供有关它是哪个单元格或我需要采取哪些信息的信息。
所以我会设置一个类似的protocol
东西:
@protocol CustomCellDelegate <NSObject>
- (void) cellButtonPressed:(NSDictionary *)stuffForDelegate;
@end
然后,当我在 中实现cellButtonPressed:
时,ViewController
我会使用stuffForDelegate
它来确定它是哪个单元格或我需要对哪些信息采取行动。
该tag
方法还可以,但我发现处理所有飞来飞去的标签很乏味,我更喜欢使用对象、协议和委托。