it-swarm.com.de

Wie kann ich mit dem Button-Tag auf den Inhalt einer benutzerdefinierten Zelle in Swift zugreifen?

Ich habe eine App, die eine benutzerdefinierte Schaltfläche in einer benutzerdefinierten Zelle hat. Wenn Sie die Zelle auswählen, wird eine Detailansicht angezeigt, die perfekt ist. Wenn ich eine Schaltfläche in einer Zelle auswähle, druckt der folgende Code den Zellindex in die Konsole. 

Ich muss auf den Inhalt der ausgewählten Zelle zugreifen (mithilfe der Schaltfläche) und sie zu einem Array oder Wörterbuch hinzufügen. Ich bin neu bei diesem Versuch, herauszufinden, wie auf den Inhalt der Zelle zugegriffen werden kann. Ich habe versucht, didselectrowatindexpath zu verwenden, aber ich weiß nicht, wie ich den Index zwingen soll, der des Tags zu sein ... 

Wenn also in jeder Zelle 3 Zellen mit 'Dog', 'Cat', 'Bird' als cell.repeatLabel.text vorhanden sind und ich die Schaltflächen in den Zeilen 1 und 3 (Index 0 und 2) auswähle, sollte dies der Fall sein Fügen Sie 'Hund' und 'Vogel' zum Array/Wörterbuch hinzu.

    // MARK: - Table View

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return postsCollection.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell: CustomCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell

    // Configure the cell...
    var currentRepeat = postsCollection[indexPath.row]
    cell.repeatLabel?.text = currentRepeat.product
    cell.repeatCount?.text = "Repeat: " + String(currentRepeat.currentrepeat) + " of " + String(currentRepeat.totalrepeat)

    cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton

    cell.checkButton.tag = indexPath.row;

    cell.checkButton.addTarget(self, action: Selector("selectItem:"), forControlEvents: UIControlEvents.TouchUpInside)


    return cell

}

func selectItem(sender:UIButton){

    println("Selected item in row \(sender.tag)")

 }
18
Steve Rowe

OPTION 1. Umgang mit delegation

Die richtige Art und Weise, Ereignisse zu behandeln, die aus den Unteransichten Ihrer Zelle ausgelöst wurden, ist die Verwendung von delegation.

So können Sie den Schritten folgen:

1. Schreiben Sie oberhalb Ihrer Klassendefinition ein Protokoll mit einer Einzelinstanzmethode in Ihrer benutzerdefinierten Zelle:

protocol CustomCellDelegate {
    func cellButtonTapped(cell: CustomCell)
} 

2. Deklarieren Sie in Ihrer Klassendefinition eine Delegatvariable und rufen Sie die Protokollmethode für den Delegaten auf: 

var delegate: CustomCellDelegate?

@IBAction func buttonTapped(sender: AnyObject) {
    delegate?.cellButtonTapped(self)
}

3. Entspricht dem CustomCellDelegate in der Klasse, in der sich Ihre Tabellenansicht befindet: 

 class ViewController: CustomCellDelegate

4. Legen Sie den Delegierten Ihrer Zelle fest

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomCell
    cell.delegate = self

    return cell
}

5. Implementieren Sie die erforderliche Methode in Ihrer View-Controller-Klasse. 

EDIT: Definiere zuerst ein leeres Array und modifiziere es dann so:

private var selectedItems = [String]()

func cellButtonTapped(cell: CustomCell) {
    let indexPath = self.tableView.indexPathForRowAtPoint(cell.center)!
    let selectedItem = items[indexPath.row]

    if let selectedItemIndex = find(selectedItems, selectedItem) {
        selectedItems.removeAtIndex(selectedItemIndex)
    } else {
        selectedItems.append(selectedItem)
    }
}

dabei ist items ein in meinem View-Controller definiertes Array: 

private let items = ["Dog", "Cat", "Elephant", "Fox", "Ant", "Dolphin", "Donkey", "Horse", "Frog", "Cow", "Goose", "Turtle", "Sheep"] 

OPTION 2. Handhabung mit closures

Ich habe mich entschlossen zurück zu kommen und Ihnen einen anderen Weg zu zeigen, wie man mit solchen Situationen umgehen kann. Die Verwendung eines Abschlusses führt in diesem Fall zu weniger Code und Sie erreichen Ihr Ziel.

1. Deklariere eine schließende Variable in deiner Zellklasse:

var tapped: ((CustomCell) -> Void)?

2. Rufen Sie den Verschluss in Ihrem Button-Handler auf.

@IBAction func buttonTapped(sender: AnyObject) {
    tapped?(self)
}

3. In tableView(_:cellForRowAtIndexPath:) in der enthaltenden View Controller-Klasse:

let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell       
cell.tapped = { [unowned self] (selectedCell) -> Void in
    let path = tableView.indexPathForRowAtPoint(selectedCell.center)!
    let selectedItem = self.items[path.row]

    println("the selected item is \(selectedItem)")
}
62
Vasil Garov

Da Sie einen Abschnitt in der Tabellenansicht haben, können Sie das Zellenobjekt wie folgt erhalten.

let indexPath = NSIndexPath(forRow: tag, inSection: 0)
let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomCell!

wo wird das Tag vom Button-Tag angezeigt?.

10
Amit89

Swift 3 Ich bekomme nur eine Lösung für die Zugriffszelle in der @IBAction-Funktion, indem ich den Button-Tag im Überblick nehme.

let cell = sender.superview?.superview as! ProductCell
var intQty = Int(cell.txtQty.text!);
intQty = intQty! + 1
let  strQty = String(describing: intQty!);
cell.txtQty.text = strQty

Ich habe Option 1 der Antwort von Vasil Garov für Swift 3 aktualisiert.

1. Erstellen Sie ein Protokoll für Ihre CustomCell:

protocol CustomCellDelegate {
    func cellButtonTapped(cell: CustomCell)
} 

2. Für deine TableViewCell deklariere eine delegate Variable und rufe die Protokollmethode darauf auf: 

var delegate: CustomCellDelegate?

@IBAction func buttonTapped(sender: AnyObject) {
    delegate?.cellButtonTapped(self)
}

3. Entspricht der CustomCellDelegate in der Klasse, in der sich Ihre tableView befindet: 

 class ViewController: CustomCellDelegate

4. Setze delegate deiner Zelle

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)  as CustomCell
    cell.delegate = self

    return cell
}

5. Implementiere die benötigte Methode in deiner ViewController

1
Herr der Töne
@IBAction func buttonTap(sender: UIButton) {
        let button = sender as UIButton
        let indexPath = self.tableView.indexPathForRowAtPoint(sender.center)!
}
1
Cao Yong

XCODE 8: Wichtiger Hinweis

Vergessen Sie nicht, die Tags auf einen anderen Wert als 0 zu setzen.

Wenn Sie versuchen, ein Objekt mit tag = 0 umzuwandeln, funktioniert es möglicherweise, in einigen ungewöhnlichen Fällen jedoch nicht. 

Das Update besteht darin, die Tags auf unterschiedliche Werte zu setzen. Ich hoffe es hilft jemandem.

0
MLBDG

Basierend auf Caos Antwort ist hier eine Lösung für die Handhabung von Schaltflächen in einer Sammlungsansichtzelle.

    @IBAction func actionButton(sender: UIButton) {
        let point = collectionView.convertPoint(sender.center, fromView: sender.superview)
        let indexPath = collectionView.indexPathForItemAtPoint(point)
}

Beachten Sie, dass der Funktionsaufruf convertPoint () die Koordinaten der Schaltflächenpunkte im Bereich der Sammlungsansicht übersetzt. Ohne verweist indexPath immer auf dieselbe Zellennummer 0

0
CyrIng