我有一个视图控制器,具有表视图和表单元格模板的单独的笔尖 . 单元格模板有一些按钮 . 我想访问按钮单击以及在我已定义表视图的视图控制器内单击的单元格的索引 .
所以我有 ViewController.h
和 ViewController.m
,我有 UITableView
和 TableTemplate.h
, TableTemplate.m
和 TableTemplate.xib
,我有定义的笔尖 . 我想在 ViewController.m
中使用单元格索引的按钮单击事件 .
有什么帮助,我该怎么办?
17 回答
1)在
cellForRowAtIndexPath:
方法中,将按钮标记指定为索引:2)为按钮添加目标和操作,如下所示:
3)基于索引的代码动作如下
ViewControler
:Updates for multiple Section:
您可以检查this link以检测表格视图中的按钮单击多行和部分 .
Delegates are the way to go.
正如其他使用视图的答案所见,可能会过时 . 谁知道明天可能会有另一个包装器,可能需要使用
cell superview]superview]superview]superview]
. 如果使用标签,最终会有n个if else条件来识别单元格 . 为了避免所有这些设置委托 . (通过这样做,您将创建一个可用的单元类 . 您可以使用相同的单元类作为基类,您所要做的就是实现委托方法 . )首先,我们需要一个接口(协议),单元将用于通信(委托)按钮点击 . (您可以为协议创建单独的.h文件,并包含在表视图控制器和自定义单元类中,或者只将其添加到自定义单元类中,无论如何都将其包含在表视图控制器中)
在自定义单元格和表格视图控制器中包含此协议 . 并确保表视图控制器确认此协议 .
在自定义单元格中创建两个属性
在
UIButton
IBAction委托中单击:(可以对自定义单元类中需要委托回视图控制器的任何操作执行相同操作)在取消单元格后的表视图控制器
cellForRowAtIndexPath
中,设置上述属性 .并在表视图控制器中实现委托:
这将是在表视图控制器中获取自定义单元格按钮操作的理想方法 .
我采取了不同的方法,而不是玩标签 . 为我的UITableViewCell子类(OptionButtonsCell)制作了委托,并添加了一个indexPath var . 从我在故事板中的按钮,我将@IBAction连接到OptionButtonsCell,然后我向任何感兴趣的人发送带有正确indexPath的委托方法 . 在索引路径的单元格中我设置当前indexPath并且它工作:)
让代码说明一切:
Swift 3 Xcode 8
OptionButtonsTableViewCell.swift
MyTableViewController.swift
这应该有所帮助: -
这里 sender 是发送事件的UIButton实例 . myTableView 是您正在处理的UITableView实例 .
只需获得正确的单元格参考,所有工作都已完成 .
您可能需要从单元格的contentView中删除按钮,并将它们直接添加到UITableViewCell实例,因为它是子视图 .
要么
您可以在cell.contentView中为不同的UIButton制定标记命名方案 . 使用此标记,稍后您可以根据需要了解行和部分信息 .
以下代码可能会帮助您 .
我在
UIViewController
中使用了名为UITableViewCell
的自定义原型单元类UITableView
.所以我有
ViewController.h
,ViewController.m
和TableViewCell.h
,TableViewCell.m
这是代码:
ViewController.h
ViewController.m
Custom cell class :
和
Note :我在这里使用了Storyboard全部
UIControls
.希望能帮到你...... !!!
我喜欢下面的技术,因为它也帮助我识别表的部分 .
在单元格cellForRowAtIndexPath中添加按钮:
事件addTask:
希望这有帮助 .
Tarun的代码在iOS7上不起作用,因为UITableViewCell结构已经改变,现在他将获得“UITableViewCellScrollView” .
这篇文章Getting UITableViewCell with superview in iOS 7有一个很好的解决方案,可以创建一个循环来查找正确的父视图,而不管结构中是否有任何未来的变化 . 归结为创建一个循环:
该链接具有更可重用的解决方案的代码,但这应该有效 .
Swift 2.2
您需要为该按钮添加目标 .
FunctionName: connected //例如
当然,您需要设置该按钮的标签,因为您正在使用它 .
您可以通过继承UITableViewCell来实现此目的 . 在界面构建器中使用它,在该单元格上放置一个按钮,通过插座连接它,然后你去 .
要在连接函数中获取标记:
Swift 3 with a Closure
一个不错的解决方案是在自定义UITableViewCell中使用闭包来回调viewController以获取操作 .
在细胞中:
在View Controller中:Tableview委托
我发现将单元格中的按钮子类化是最简单的(Swift 3):
在你的细胞类中:
在表视图或集合视图的数据中source,当出列单元格时,给按钮指定索引:
所以你可以把这些代码放到你的表视图控制器中:
在接口生成器中输入't forget to set the button'类,并将其链接到
handleTapOnCellInfoButton
函数!编辑:
使用依赖注入 . 要设置调用闭包:
并在集合视图的委托的willDisplay方法中注入闭包:
它的工作对我来说 .
@Mani答案很好,但是单元格内容视图中的视图标记通常用于其他目的 . 您可以使用单元格的标记(或单元格的contentView标记):
1)在
cellForRowAtIndexPath:
方法中,将单元格的标记指定为索引:2)为按钮添加目标和操作,如下所示:
3)创建返回发送方行的方法(感谢@Stenio Ferreira):
4)基于索引的代码操作:
CustomTableCell.h是一个UITableViewCell:
进口后的MyVC.m:
在MyVC.m中的“cellForRowAtIndexPath”内:
MyVC.m:
使用Swift闭包:
对于swift 4: