2015-09-02 12 views
5

Ich habe diese in cellForRowAtIndexPathsenden Row und Abschnitt durch Tag in Knopf Swift

cell.plusBut.tag = indexPath.row 
    cell.plusBut.addTarget(self, action: "plusHit:", forControlEvents: UIControlEvents.TouchUpInside) 

und diese Funktion außerhalb:

func plusHit(sender: UIButton!){ 
    buildings[sender.tag].something = somethingElse 
} 

Ist es möglich, die indexPath.rowund senden indexPath.section, oder eine Alternative?

Danke!

EDIT

Ich näherte es wie folgt aus:

My Custom Button-

class MyButton: UIButton{ 

    var myRow: Int = 0 
    var mySection: Int = 0 

} 

My Custom Handy

class NewsCell: UITableViewCell{ 

    @IBOutlet weak var greenLike: MyButton! 

In CellForRowAtIndexPath

cell.greenLike.myRow = indexPath.row 

Ich erhalte eine Fehlermeldung auf dieser Linie.

Antwort

4

Sie können eine Unterklasse von UIButton erstellen und einen zusätzlichen Eigenschaftsabschnitt darin erstellen. Und dann können Sie diese Klasse für die Zellenschaltfläche verwenden. Sie können das gleiche für die Zeile tun.

Hier sind einige Möglichkeiten, nach Subklassen UIButton

cell.plusBut.tag = indexPath.row 
cell.plusBut.section = indexPath.section 

Oder

cell.plusBut.row = indexPath.row 
cell.plusBut.section = indexPath.section 

Oder

cell.plusBut.indexPath = indexPath 

Wählen Sie, was Ihnen passt.

+0

Natürlich, liebe es! –

+0

Siehe meinen Fehler oben ... Nicht sicher, warum das passiert –

8

Ist es möglich, die indexPath.row und indexPath.section oder eine Alternative zu senden ??

Wenn Sie die Anzahl der möglichen Zeilen in einem Abschnitt begrenzen, können Sie die beiden zu einer einzigen Zahl kombinieren. Zum Beispiel, wenn Sie bereit sind zu sagen uns, dass es immer weniger als 1000 Zeilen in einem bestimmten Abschnitt sein wird, können Sie verwenden:

cell.plusBut.tag = (indexPath.section * 1000) + indexPath.row 

und dann mod und Division Operatoren erholen:

row = sender % 1000 
section = sender/1000 

Eine andere Möglichkeit besteht darin, die Superview der Schaltfläche (und Superview usw.) zu überprüfen, bis Sie die Zelle finden. Sobald Sie die Zelle haben, können Sie den Indexpfad für diese Zelle aus der Tabelle abrufen.

Eine dritte Option, vielleicht die beste, besteht darin, die Schaltfläche auf die Zelle und nicht auf ein anderes Objekt auszurichten. Die Zelle kann dann eine Aktion in dem Ansichtscontroller oder einem anderen Objekt auslösen, das sich selbst als Absender verwendet.

+0

Was für eine nette Lösung ... Ich habe versucht, etwas in dieser Richtung auch zu tun. Offensichtlich werden sowohl Abschnitt als auch Reihe als Ganzzahlen angenommen. –

+0

Tricky und korrekt. Upvoted! –

0

Ich schlage einen anderen Ansatz vor. Ich mag die Unterklassen-Lösung nicht, ich denke nicht, dass die Schaltfläche ihre Position kennen sollte. Warum nicht ein Wörterbuch verwenden Sie die Schaltfläche in die IndexPath

// First initialize the lookup table 
var buttonPositions = [UIButton: NSIndexPath]() 

// add each button to the lookup table 
let b = UIButton() 
let path = NSIndexPath(forItem: 1, inSection: 1) 


buttonPositions[b] = path 

// Looking it up works like this 
buttonPostions[activeButton]?.row 
0

Sie einen benutzerdefinierten Tag für eine UIButton über Erweiterung zuweisen zu übersetzen, werfen Sie einen Blick:

extension UIButton { 

private struct ButtonTag { 

    static var tagKey = "key" 

} 

var myTag : (Int , Int)? { 

    set { 
     if let value = newValue { 
      objc_setAssociatedObject(self, &ButtonTag.tagKey, value as! AnyObject, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 

    get { 
     return objc_getAssociatedObject(self, &ButtonTag.tagKey) as? (Int , Int) 
    } 
    } 
} 
2

Swift 2.x - Erweiterung mit Assoziierte Objekte

private struct AssociatedKeys { 
static var section = "section" 
static var row = "row" 
} 

extension UIButton { 
var section : Int { 
    get { 
     guard let number = objc_getAssociatedObject(self, &AssociatedKeys.section) as? Int else { 
      return -1 
     } 
     return number 
    } 

    set(value) { 
     objc_setAssociatedObject(self,&AssociatedKeys.section,Int(value),objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
    } 
} 
var row : Int { 
    get { 
     guard let number = objc_getAssociatedObject(self, &AssociatedKeys.row) as? Int else { 
      return -1 
     } 
     return number 
    } 

    set(value) { 
     objc_setAssociatedObject(self,&AssociatedKeys.row,Int(value),objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
    } 
} 
} 

Nutzung:

//set 
cell.contextMenuBtn.section = indexPath.section 
cell.contextMenuBtn.row = indexPath.row 
//read 
func showContextMenu (sender:UIButton) { 
    let track = dictionarySongs[sender.section][sender.row] 
    ... 
}