我在UITableView中有一个自定义单元格,由自定义类(.h和.m文件)定义。我能够显示单元格,并更改列表中每个单元格的文本,但我的自定义单元格中也有按钮(实际上是两个)。当我单击按钮时,我需要知道单击了哪一行按钮。有没有办法在自定义ui单元类中获得这个?
我希望我要求的是清楚的。如果没有,请随时发表评论,我会尽力解释。
答案 0 :(得分:2)
您可以使用此方法:
使用每个按钮设置关联的对象值。您可以通过向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 ;
}
答案 1 :(得分:2)
您没有显示任何要评论的代码,但一般来说您可以:
为每个按钮定义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;
}
有关更详细的解决方案,请查看this S.O. thread。
答案 2 :(得分:0)
我通过为自定义单元格类创建protocol
然后为每个自定义单元格处理UIViewController
UITableView
delegate
来完成此操作
然后我将UIButton
附加到自定义单元格类中的IBAction
,该类调用了它的委托,其中包含有关哪个单元格或我需要处理哪些信息的信息。
所以我会设置protocol
,例如:
@protocol CustomCellDelegate <NSObject>
- (void) cellButtonPressed:(NSDictionary *)stuffForDelegate;
@end
然后,当我在cellButtonPressed:
中实施ViewController
时,我会使用stuffForDelegate
来确定它是哪个单元格,或者我需要采取哪些信息。
tag
方法没问题,但是我觉得处理所有标记很乏味,我更喜欢使用对象和协议以及代理。