如何在cell.swift

时间:2016-11-05 11:12:58

标签: swift uitableview nsindexpath

我有2个文件。

  • myTableViewController.swift
  • myTableCell.swift

我可以在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?

9 个答案:

答案 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?
}

custom class

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
        }