我有2个文件。
我可以在myTabelCell.swift函数中获取indexPath.row吗?
这是myTableCell.swift
import UIKit
import Parse
import ActiveLabel
class myTableCell : UITableViewCell {
//Button
@IBOutlet weak var commentBtn: UIButton!
@IBOutlet weak var likeBtn: UIButton!
@IBOutlet weak var moreBtn: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
}
@IBAction func likeBtnTapped(_ sender: AnyObject) {
//declare title of button
let title = sender.title(for: UIControlState())
//I want get indexPath.row in here!
}
这是myTableViewController.swift
class myTableViewController: UITableViewController {
//Default func
override func viewDidLoad() {
super.viewDidLoad()
//automatic row height
tableView.estimatedRowHeight = 450
tableView.rowHeight = UITableViewAutomaticDimension
}
// cell config
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//define cell
let cell = tableView.dequeueReusableCell(withIdentifier: "myTableCell", for: indexPath) as! myTableCell
}
正如你所看到的......我正试图在myTableCell,liktBtnTapped函数中获取indexPath.row。
您能否告诉我如何访问或获取IndexPath.row?
答案 0 :(得分:29)
我创建了一个带有递归方法的UIResponder
扩展,您可以在任何UIView
(继承自UIResponder
)中使用该扩展来查找特定类型的父视图。
import UIKit
extension UIResponder {
func next<T: UIResponder>(_ type: T.Type) -> T? {
return next as? T ?? next?.next(type)
}
}
使用这个,我们可以使用一些方便的只读计算属性来扩展UITableViewCell
,用于表格视图和单元格的索引路径。
extension UITableViewCell {
var tableView: UITableView? {
return next(UITableView.self)
}
var indexPath: IndexPath? {
return tableView?.indexPath(for: self)
}
}
以下是您在示例中使用它的方法:
@IBAction func likeBtnTapped(_ sender: AnyObject) {
//declare title of button
let title = sender.title(for: UIControlState())
//I want get indexPath.row in here!
indexPath.flatMap { print($0) }
}
答案 1 :(得分:9)
Swift 4 +
在你的牢房内试试。
func getIndexPath() -> IndexPath? {
guard let superView = self.superview as? UITableView else {
print("superview is not a UITableView - getIndexPath")
return nil
}
indexPath = superView.indexPath(for: self)
return indexPath
}
答案 2 :(得分:3)
简单..您可以在按钮操作中执行此操作:
let section = 0
let row = sender.tag
let indexPath = IndexPath(row: row, section: section)
let cell: myTableCell = self.feedTableView.cellForRow(at: indexPath) as! myTableCell
然后在cellForRowAtIndexPath
:
// add the row as the tag
cell.button.tag = indexPath.row
答案 3 :(得分:2)
迅速4.1。在这里,我创建了获取IndexPath的函数。只需传递您的UIView(UIButton,UITextField等)和UITableView对象即可获取IndexPath。
withTx(g -> { anotherMethod(g); return null; });
答案 4 :(得分:1)
在单元格类中创建属性indexPath
,并在重复使用单元格时将其设置为cellForRowAtIndexPath
。
但有一点需要注意:重新排列单元格的一些表格视图方法不会调用cellForRowAtIndexPath
。你必须考虑这种情况。
但如果你总是只使用reloadData()
,那么这是安全且非常简单的。
另一种方法是将关于控制事物的代码放回 controller 类中,并通过捕获索引路径的回调闭包来运行它。
答案 5 :(得分:1)
这是另一种做法
import UIKit
import Parse
import ActiveLabel
class myTableCell : UITableViewCell {
//Button
@IBOutlet weak var commentBtn: UIButton!
@IBOutlet weak var likeBtn: UIButton!
@IBOutlet weak var moreBtn: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
}
}
class myTableViewController: UITableViewController {
//Default func
//assuming you have an array for your table data source
var arrayOfTitles = [String]()
override func viewDidLoad() {
super.viewDidLoad()
//automatic row height
tableView.estimatedRowHeight = 450
tableView.rowHeight = UITableViewAutomaticDimension
}
// cell config
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//define cell
let cell = tableView.dequeueReusableCell(withIdentifier: "myTableCell", for: indexPath) as! myTableCell
cell.commentBtn.tag = indexPath.row
cell.commentBtn.addTarget(self, action: #selector(likeBtnTapped(_:), forControlEvents:.TouchUpInside)
//cell config end
@IBAction func likeBtnTapped(sender: UIButton) {
let btn = sender
let indexP = NSIndexPath(forItem: btn.tag, inSection: 0)
let cell = tableView.dequeueReusableCell(withIdentifier: "myTableCell", for: indexP) as! myTableCell
//I want get indexPath.row in here!
let title = arrayOfTitles[indexP.row]
//declare title of button
cell.commentBtn.setTitle(title, forState: UIControlState.Normal)
}
}
答案 6 :(得分:1)
我的解决方案是继承UITableViewCell,因此可以添加IndexPath属性。为故事板中的表视图单元分配自定义类。在rowAtIndexPath调用时指定IndexPath值。
class MyTableViewCell: UITableViewCell {
var indexPath: IndexPath?
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: "cellid1", for: indexPath)
(cell as? MyTableViewCell)?.indexPath = indexPath
return cell
}
答案 7 :(得分:1)
Swift 4.2的另一种方法,而不是假设Superview始终是表视图
extension UITableViewCell{
var tableView:UITableView?{
return superview as? UITableView
}
var indexPath:IndexPath?{
return tableView?.indexPath(for: self)
}
}
用法示例
@IBAction func checkBoxAction(_ sender: UIButton) {
guard let indexPath = indexPath else { return }
sender.isSelected = !sender.isSelected
myCustomCellDelegate?.checkBoxTableViewCell(didSelectCheckBox: sender.isSelected, for: indexPath)
}
答案 8 :(得分:0)
迅速5:
if
let collectionView = superview as? UICollectionView,
let index = collectionView.indexPath(for: self)
{
// stuff
}