2015-11-03 20 views
9

W moim UITableViewCell Mam przycisk. I chcę dodać do niego akcję, przekazując wiele parametrów w metodzie cellForRowAtIndexPath.Przekaż wiele parametrów, aby dodaćTarget

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("CartCell", forIndexPath: 
     indexPath) as! CartTableViewCell 
    cell.buyButton.addTarget(self, action: self.buyButton(indexPath, 2, 3 ,4 , 5, 6), forControlEvents: .TouchUpInside) 
} 
+1

Nie, nie mogę tego zrobić. Akcja nie jest zamknięciem, jest selektorem, a selektor musi przyjmować 0 lub 1 argumentów, będąc przyciskiem nadawcy. Zamiast dodawać akcję do przycisku w 'cellForRowAtIndexPath', należy zdefiniować protokół i ustawić kontroler widoku jako delegowane komórki. – Paulw11

+0

możesz pokazać przykład, proszę – Arti

Odpowiedz

31

Może można zrobić coś takiego

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

    let cell = tableView.dequeueReusableCellWithIdentifier("CartCell", forIndexPath:indexPath) as! CartTableViewCell 
    cell.buyButton.tag = (indexPath.section*100)+indexPath.row 
    cell.buyButton.addTarget(self, action: "btnBuy_Click:", forControlEvents: .TouchUpInside) 
} 

func btnBuy_Click(sender: UIButton) { 
     //Perform actions here 
    let section = sender.tag/100 
    let row = sender.tag % 100 
    let indexPath = NSIndexPath(forRow: row, inSection: section) 
    self.buyButton(indexPath, 2, 3 ,4 , 5, 6) 
} 

Tworzenie wartości znacznika według you'r wymogu i maintaint to integralność zbyt.

+0

To jest niedorzeczne włamanie. Działa, ale jest super hacky – Michael

+0

Znakomity pomysł i dziękuję :), ale całkowicie błędny, gdy mam 100 sekcji i 100 wierszy, a następnie, jeśli wybiorę 100-ty wiersz na 100. sekcji, wówczas wybrana sekcja staje się ZERO, a wiersz staje się 100. –

+0

Swift3 latest: http: // stackoverflow.com/questions/39617873 – Fattie

1

Można użyć właściwości tag na UIButtons na titleLabel i UIImageView dodać dodatkowe parametry

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
let cell = tableView.dequeueReusableCellWithIdentifier("CartCell", forIndexPath:indexPath) as! CartTableViewCell 
cell.buyButton.tag = (indexPath.section*100)+indexPath.row 
cell.buyButton.imageView.tag = 2 
cell.buyButton.titleLabel.tag = 3 
cell.buyButton.addTarget(self, action: "btnBuy_Click:", forControlEvents: .TouchUpInside) 
} 
2

proste!

1: Podklasa UIButton:

class IndexPathCellButton: UIButton { 
    var indexPath:NSIndexPath? 
} 

2: Ustaw wartość:

... 
cell.indexPathButton.addTarget(self, action: #selector(LocationSearchViewController.cellOptionButtonClick(_:)), forControlEvents: .TouchUpInside) 
cell.indexPathButton.indexPath = indexPath // Your value 
... 

3: odzyskać wartość:

@objc private func cellOptionButtonClick(sender: IndexPathCellButton) { 
    print(sender.indexPath) 
} 
5

Chyba powinniśmy architekt kod dobrze. Hacki sprawią, że twój kod będzie trudny do zrozumienia i skomplikowany. Oto kilka sugestii.

Dodać do klasy przycisk niestandardowy

class CustomButton:UIButton { 
var name:String = "" 
var object:MyObjectClassType? 

convenience init(name: String, object: MyObjectClassType) { 
    self.init(frame:CGRectZero) 
    self.name =name 
    self.object = object! 
}} 

teraz dodać cel do przycisku

let btn = your custom button 
btn.name = “Your name” 
btn.object = any object 
btn.addTarget(self, action: #selector(myMethod(_:)), forControlEvents:.TouchUpInside) 

Teraz po prostu uzyskać wartości w wywołaniu metody

@IBAction func myMethod(sender:CustomButton) { 
    print(sender.name) 
} 
+0

To schludne rozwiązanie, myślisz, że możesz to osiągnąć przez IB? – OhadM

+0

@OhadM będzie to ten sam przepływ ... z wyjątkiem tego, że połączony typ klasy UIButton w storybooku może być zmieniony na CustomButton. Metody init()/init? (Koder aDecoder: NSCoder) i awakeFromNib() zostaną wywołane na CustomButton klasa przed załadowaniem, ale zawsze możesz ustawić zmienne, gdy masz już gotowe wartości. Podobnie jak w tym przypadku przed tabelą zobacz delegowane połączenia – sheetal

+0

Brzmi jak dobry pomysł, ale wciąż brakuje mi kilku części, jeśli utworzymy niestandardowy przycisk, tak jak powiedziałeś , będziemy musieli ustawić nazwę i właściwości obiektu przed faktycznym dotknięciem? Co jeśli przycisk znajduje się w komórce i używam łańcucha odpowiedzi, aby otrzymać akcję wewnątrz VC, w jaki sposób możemy to osiągnąć za pomocą twojego pomysłu? W jaki sposób ustawić właściwości w tym przypadku użycia? Czy jest szansa, że ​​możesz edytować odpowiedź i dodać wycinek kodu lub przykład? Dzięki :) – OhadM

8

Jeśli trzeba przejść string po prostu użyj accessibilityHint of UIButton.

Znacznik może przechowywać tylko Int, więc jeśli ktoś chce przekazać dane ciągu, może z niego korzystać. Nie jest to jednak właściwy sposób przekazywania danych!

przykład:

button.accessibilityHint = "your string data" 
button.addTarget(self, action: Selector(("buttonTapped")), for: UIControlEvents.touchUpInside) 

func buttonTapped (sender: UIButton) { 
    let section = sender.accessibilityHint 
} 
+0

Kreatywny hack, sprawił, że się uśmiechnęłam. Dzięki – SQLiteNoob

+0

Nie, nie korzystaj z podpowiedzi dotyczącej ułatwień dostępu. To jest używane przez niewidomych użytkowników, aby dowiedzieć się, które widoki to VoiceOver. ** możesz ** używać identyfikatora dostępności. To jest używane tylko przez Twoją aplikację. (Niektóre struktury testowe, takie jak KIF, mogą używać identyfikatora ułatwień dostępu w celu znalezienia pól do celów testowych, ale jest to nietypowy przypadek. –

Powiązane problemy