Pytanie Pobierz IndexPath z podklasy UITableViewCell w Swift


Mam zwyczaj UITableViewCell podklasa i związany z nią Xib. mam UILabel i a UIButton w tej komórce i podłączyłem touch up wewnątrz działania przycisku do podklasy.

Potrzebuję tego, kiedy ten przycisk w komórce zostanie dotknięty, aby uzyskać ścieżkę indeksu komórki, która ma ten przycisk. A może wysłać go z powrotem do kontrolera widoku przez delegata lub coś takiego.

Odkąd jestem w środku UITableViewCell podklasa, nie mogę użyć takiego rozwiązania to ponieważ nie mam odniesienia do tableview z wewnątrz podklasy komórki. Po dalszych badaniach znalazłem inne rozwiązanie i wdrożyłem go w Swift w ten sposób.

import UIKit

class ContactCell: UITableViewCell {

    @IBOutlet weak var nameLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        selectionStyle = .None
    }

    @IBAction func callButtonPressed(sender: UIButton) {
        let indexPath = (self.superview as UITableView).indexPathForCell(self)
        println("indexPath?.row")
    }

}

Ale kiedy dotknę przycisku, zawiesza się z informacją o błędzie Szybka dynamiczna obsada nie powiodła się.

Masz pojęcie, co jest nie tak z moim kodem?

Lub jestem otwarty na wszelkie inne sugestie, które pozwolą mi osiągnąć pożądany rezultat w jakikolwiek inny sposób.

Dziękuję Ci.


18
2017-09-16 11:21


pochodzenie


Wygląda na to, że potrzebujesz delegata: stackoverflow.com/questions/24099230/delegates-in-swift - ullstrm
Jaki jest powód, dla którego znasz pokrewną stronę indexPath? println("indexPath?.row") oczywiście nie jest prawdziwym powodem. Jaki jest model za tym wszystkim? - Imanou Petit
@POB Powodem jest, że wyjąłem metody źródła danych tableview i umieściłem je w oddzielnej klasie wielokrotnego użytku, jak opisano w to artykuł. Moja komórka niestandardowa ma przycisk i teraz potrzebuję uzyskać ścieżkę indeksu komórki, której przycisk jest naciśnięty. - Isuru
@Isuru: Kilka tygodni temu odpowiedziałem na dość podobne pytanie tutaj ale nie sądzę już, że to dobry projekt aplikacji. Myślę, że to, czego chcesz, to indeks w twoim źródle danych (tablicy), a nie ścieżce indeksu komórki (ten sam wynik, ale znacznie lepszy projekt aplikacji z pierwszym). Powinniśmy budować nasze modele na naszych źródłach danych i nie polegać leniwie na ścieżkach indeksu komórek. - Imanou Petit
@POB Masz rację. Ja też to sobie uświadomiłem, ponieważ to, co faktycznie chciałem zrobić, to coś z własnością obiektu znajdującego się w tej komórce, a nie bezpośrednio ścieżkę indeksu. Zamienię delegata, aby zwrócił indeks. Dzięki :) - Isuru


Odpowiedzi:


Wygląda na to, że potrzebujesz delegata:

Delegaci w szybkim tempie?

Następnie wystarczy przekazać komórkę jako parametr delegatowi, a następnie można to łatwo zrobić tableView.indexPathForCell(cellFromDelegateMethod)


20
2017-09-16 11:29



Udało mi się to osiągnąć za pomocą delegatów. Dziękuję Ci. - Isuru


UIButton.Type naprawdę nie ma członu superview, ale nadawca ma

var cell: UITableViewCell = sender.superview.superview as UITableViewCell


2
2018-01-20 13:00



Jest to świetny sposób, aby to zrobić, jeśli używasz widoku kolekcji osadzonego w widoku tabeli i chcesz włączyć interakcje dla przycisków w komórce widoku kolekcji, ale nadal możesz zezwolić na przeniesienie komórki widoku osadzania do właściwych elementów widoku tabeli. - Tom


Hej możesz użyć "Tag" przycisku również. Wewnątrz metody cellForRowAt delegata tabeli możesz oznaczyć przycisk za pomocą Indexpath.row. oto przykład, co próbowałem powiedzieć.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// get ur cell nib .As it has a button
cell.startOrConntinuBtn.addTarget(self, action: #selector(sumbitOrContinue), for: .touchUpInside) 

cell.startOrConntinuBtn.tag = indexPath.row }

oraz w metodzie dotykowej "sumbitOrContinue" -

 func sumbitOrContinue(sender: UIButton!) { 
let tag = sender.tag
// do what you want to do like this example

let detail = self.detailList[tag]
let vc  = self.storyboard?.instantiateViewController(withIdentifier: "mockExamInt") as! MockWindowVc
vc.detailId = detail.id
self.navigationController?.pushViewController(vc, animated: true)}

2
2018-01-24 05:27