每行UITableView的button
我有一个自定义单元格在一个自定义类(.h和.m文件)定义的UITableView中。 我能够显示单元格,并更改列表中的每个单元格的文本,但我的自定义单元格中也有button(实际上是两个)。 当我点击button时,我需要知道哪一行的button已被点击。 有没有什么办法可以在自定义的ui单元类中获取?
我希望我所要求的是明确的。 如果没有,请随时发表评论,我会尽力解释。
您不会显示任何代码进行评论,但一般而言,您可以:
-
为每个button定义一个
tag
,代表button出现的表格行; -
当你的button操作方法被调用时,你可以访问button的
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; }
为了更详细的解决scheme,看看这个SO线程 。
你可以使用这种方法:
-
用每个button设置一个关联的对象值。 你可以通过向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 ; }
我已经通过创build自定义单元类的protocol
,然后使UIViewController
处理UITableView
每个自定义单元的delegate
来完成此操作。
然后,我将UIButton
附加到自定义单元类中的IBAction
,该类调用它的委托,以获取有关哪个单元格或哪些信息需要采取行动的信息。
所以我会build立一个类似这样的protocol
:
@protocol CustomCellDelegate <NSObject> - (void) cellButtonPressed:(NSDictionary *)stuffForDelegate; @end
然后当我实现cellButtonPressed:
在ViewController
我会使用stuffForDelegate
来确定它是哪个单元格或需要采取什么行动。
tag
方法是可以的,但是我发现处理所有标签的繁琐工作,我更喜欢使用对象和协议,而不是使用代理。
- indexpath.row从1开始,而不是从0开始
- 当我的iPAD上安装了应用程序的’.ipa’文件时,如何获取IOS应用程序的Bundle ID
- iTunes Connect提交审核 – 您的应用信息无法保存。 再试一次
- tableView:cellForRowAtIndexPath:调用不仅为可见的单元格?
- 在Spritekit游戏中限制GUI元素的比例
- 循环访问NSAttributedString属性以增加字体
- UICollectionViewCell用内在大小展开/折叠
- 在需要之前,必须从模块“Darwin.POSIX.sys.types”中导入“u_char”声明
- 自动完成目标c中的数组项目的txtfield