Come posso ottenere indexPath.riga nella cella.swift

Ho 2 file.

  • myTableViewController.swift
  • myTableCell.swift

Posso ottenere il indexPath.riga in myTabelCell.swift funzione?

Qui è 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!

    }

Qui è 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



 }

Come si può vedere… sto cercando di ottenere indexPath.riga in myTableCell, liktBtnTapped funzione.

Potresti farmi sapere come è possibile accedere o ottenere IndexPath.riga?

InformationsquelleAutor Shawn Baek | 2016-11-05

 

9 Replies
  1. 30

    Ho creato un UIResponder estensione con un metodo ricorsivo che è possibile utilizzare in qualsiasi UIView (che eredita da UIResponder) per trovare un genitore vista di un tipo specifico.

    import UIKit
    
    extension UIResponder {
    
        func next<T: UIResponder>(_ type: T.Type) -> T? {
            return next as? T ?? next?.next(type)
        }
    }

    Utilizza questo, siamo in grado di estendere UITableViewCell con alcuni conveniente in sola lettura calcolata proprietà per la visualizzazione della tabella e il percorso dell’indice della cella.

    extension UITableViewCell {
    
        var tableView: UITableView? {
            return next(UITableView.self)
        }
    
        var indexPath: IndexPath? {
            return tableView?.indexPath(for: self)
        }
    }

    Ecco come si potrebbe utilizzare nel tuo esempio:

    @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) }
    }
    • Sembra impressionante estensione. Ti dispiacerebbe, una volta inserito il codice come utilizzare?
    • Basta creare un nuovo file chiamato UITableViewCell+IndexPath.swift e aggiungere il codice riportato sopra. Poi, quando all’interno della cella, è possibile ottenere il percorso dell’indice di utilizzo self.indexPath.
    • Grazie mille~! Funziona benissimo
    • Questo codice sta facendo un presupposto che può o non può essere vero a seconda della versione di iOS. Non si deve presumere che la vista del tavolo di cell superview è la visualizzazione della tabella stessa. Mai fare ipotesi circa il privato sottoview struttura di un UITableView.
    • Questo è corretto, è possibile, tuttavia, si supponga che la tabella cella è almeno un discendente di vista tabella. Ho aggiornato la mia risposta di trovare la tabella di visualizzazione utilizzando il UIResponder di proprietà successivo. In definitiva, la soluzione migliore è semplicemente passare il percorso di indice per il cellulare durante l’annullamento dell’accodamento, ma tutti amano un po ‘ di magia.
    • No, non è migliore per passare il percorso dell’indice di cella. Che in realtà è la peggiore soluzione. Fallisce se il numero di righe può essere inserito, rimossi o spostati nella vista tabella.
    • Sì, adesso pensare – si prega di ignorare che una parte del mio commento. Questo è il punto di ottenere la visualizzazione della tabella cella. Sei d’accordo che il mio aggiornamento migliora la stabilità?
    • Che sembra come dovrebbe funzionare. Ma qual è il punto di avere entrambi i gruppi di codice nella tua risposta? Basta modificare il codice originale con la correzione.
    • Concordato, con un aggiornamento – grazie!

  2. 11

    Swift 4+

    Provare questo all’interno della cella.

    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
    }
    • Questa Risposta è sbagliata… Guard a ritornare, nil, per cui le funzioni deve restituire un optional…
    • grazie per la segnalazione. Corretto 🙂
    • Grande! Sembra meglio ora! 🙂
    • Grande! Ha funzionato
  3. 3

    Facile.. Si può fare come questo all’interno del pulsante di azione:

    let section = 0
    let row = sender.tag
    let indexPath = IndexPath(row: row, section: section)
    let cell: myTableCell = self.feedTableView.cellForRow(at: indexPath) as! myTableCell

    E, successivamente, in cellForRowAtIndexPath:

    //add the row as the tag
    cell.button.tag = indexPath.row
    • Potresti incollare i tuoi commenti nel mio codice? Ho dovuto incollare il codice in likeBtnTapped func. Ma di sé. myTableViewController <- non riesco a trovare..
    • Ho detto YourTableViewCellulare non controller
    • Oh, ora ho capito Grazie
  4. 2

    Swift 4.1. Qui ho creato una funzione per ottenere IndexPath. Basta passare il vostro UIView(UIButton,UITextField ecc) e UITableView oggetto per ottenere IndexPath.

    func getIndexPathFor(view: UIView, tableView: UITableView) -> IndexPath? {
    
                let point = tableView.convert(view.bounds.origin, from: view)
                let indexPath = tableView.indexPathForRow(at: point)
                return indexPath
     }
  5. 1

    Creare una proprietà indexPath nella cella di classe e di impostare in cellForRowAtIndexPath quando la cella viene riutilizzato.

    Ma c’è un avvertimento: Alcuni vista tabella metodi per riorganizzare le cellule non chiamare cellForRowAtIndexPath. È necessario considerare questo caso.

    Ma se si utilizza sempre e solo reloadData() è sicuro e abbastanza facile.


    Un altro modo è quello di mettere il codice in materia di controllo tutto in controller di classe e di eseguirlo tramite callback chiusure di catturare l’indice di percorso.

    • Grazie mi aiuta 🙂
  6. 1

    Heres un altro modo per farlo

    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)
    
    
    
    }
    
    
    }
    • Vi ringrazio tanto. Funziona benissimo
    • Nessun problema, qualcuno contento appreaciated la mia risposta 🙂
  7. 1

    La mia soluzione è stata la creazione di sottoclassi UITableViewCell, può aggiungere IndexPath proprietà. assegnare la classe personalizzata per la tavola, la cella in storyboard. assegnare IndexPath valore quando rowAtIndexPath chiamato.

    class MyTableViewCell: UITableViewCell {
    
        var indexPath: IndexPath?
    }

    Come posso ottenere indexPath.riga nella cella.swift

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        var cell = tableView.dequeueReusableCell(withIdentifier: "cellid1", for: indexPath)
        (cell as? MyTableViewCell)?.indexPath = indexPath
        return cell
    }
  8. 1

    Un altro Approccio per Swift 4.2 e non assumendo Superview sarà sempre una tableview

    extension UITableViewCell{
    
        var tableView:UITableView?{
            return superview as? UITableView
        }
    
        var indexPath:IndexPath?{
            return tableView?.indexPath(for: self)
        }
    
    }

    Esempio di utilizzo

    @IBAction func checkBoxAction(_ sender: UIButton) {
    
            guard let indexPath = indexPath else { return }
    
            sender.isSelected = !sender.isSelected
            myCustomCellDelegate?.checkBoxTableViewCell(didSelectCheckBox: sender.isSelected, for: indexPath)
    
    }
  9. 0

    Swift 5:

            if 
                let collectionView = superview as? UICollectionView, 
                let index = collectionView.indexPath(for: self) 
            {
                //stuff
            }

Lascia un commento