2017-12-06 5 views
0

Ich habe eine UISearchController mit einem separaten UITableViewController als searchResultsController.Holen Sie sich den Indexpfad von benutzerdefinierten Schaltfläche in AccessoryView eines UITableViewCell

class SearchResultsViewController: UITableViewController { 

    var fruits: [String] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.tableFooterView = UIView(frame: .zero) 
     tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell") 
    } 

    @objc func addFruit(_ sender: UIButton) { 
     let point = tableView.convert(sender.bounds.origin, to: sender) 
     let indexPath = tableView.indexPathForRow(at: point) 
     print(indexPath?.row) 
    } 

    // MARK: - Table view data source 
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return fruits.count 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
     cell.textLabel?.text = fruits[indexPath.row] 
     cell.selectionStyle = .none 

     let addButton = UIButton(type: .custom) 
     addButton.frame = CGRect(x: 0, y: 0, width: 44, height: 44) 
     addButton.setImage(UIImage(named: "add"), for: .normal) 
     addButton.contentMode = .scaleAspectFit 
     addButton.addTarget(self, action: #selector(addFruit(_:)), for: .touchUpInside) 
     addButton.sizeToFit() 
     cell.accessoryView = addButton 

     return cell 
    } 

} 

Ich brauche eine benutzerdefinierte Schaltfläche in Zellen, die Suchergebnisse angezeigt werden. Also fügte ich eine UIButton als die Zellen accessoryView hinzu. Und es sieht gut aus und funktioniert gut.

enter image description here

Jetzt muss ich die Zelle indexPath erhalten, wenn der Benutzer auf diese Schaltfläche tippt.

Ich versuche, es wie unten gezeigt zu bekommen.

@objc func addFruit(_ sender: UIButton) { 
    let point = tableView.convert(sender.bounds.origin, to: sender) 
    let indexPath = tableView.indexPathForRow(at: point) 
} 

Aber es liefert nil für jede Zelle zurück.

Gibt es eine andere Möglichkeit, die indexPath von einer benutzerdefinierten Schaltfläche tippen? Ich habe auch hier eine demo project hinzugefügt.

+0

versuch 'let cell = sender.superview? .superview als? CustomTableViewCell Lassen Sie indexPath = tblView.indexPath (für: Zelle!) ' –

Antwort

1

Erstellen Sie eine benutzerdefinierte Klasse mit dem Namen SOButton, und fügen Sie eine Variable vom Typ IndexPath hinzu. Verwenden Sie diese Klasse für die Initialisierung Ihrer Add-Schaltfläche.

//Your class will look like - 

class SOButton: UIButton { 
    var indexPath: IndexPath? 
} 

//Your action will look like - 

@objc func addFruit(_ sender: SOButton) { 
    print(sender?.indexPath.row) 
} 

//And in your cellForRow add 

let addButton = SOButton(type: .custom) 
addButton.indexPath = indexPath 

this helps you :)

+0

Das funktioniert! Vielen Dank. – Isuru

+0

HappyToHilfe !!! :) –

0
let buttonPosition = sender.convert(CGPoint.zero, to: self.tableView) 
let currentIndexPath = self.tableView.indexPathForRow(at: buttonPosition) 

das Probieren Sie es für mich gearbeitet :)

0

würde ich vorschlagen, diese Lichtlösung: add indexPath.row zu Tag button:

let addButton = UIButton(type: .custom) 
addButton.frame = CGRect(x: 0, y: 0, width: 44, height: 44) 
addButton.tag = indexPath.row 

Und in Button-Aktion:

@objc func addFruit(_ sender: UIButton) { 
    print(sender.tag) 
} 
0

Bitte aktualisieren Sie Ihren Code. Sie UIButton Sender in convert-Funktion übergeben Sie bitte die Tableview in ihnen

func getIndexPathByCgPoint(_ sender: UIButton) -> IndexPath? { 
    let point = sender.convert(sender.bounds.origin, to: tableview) 
    guard let indexPath = tableview.indexPathForRow(at: point) else { 
     return nil 
    } 
    return indexPath 
} 

Aber im Falle der Abschnittsheader es Fehlanzeige übergeben.

Verwandte Themen