Mam kontroler widoku z widokiem tabeli i oddzielną końcówką dla szablonu komórki tabeli. Szablon komórki zawiera kilka przycisków. Chcę uzyskać dostęp do przycisku kliknięcia wraz z indeksem komórki klikniętej wewnątrz kontrolera widoku, w którym zdefiniowałem widok tabeli.
Więc mam ViewController.h
i ViewController.m
gdzie mam UITableView
i TableTemplate.h
, TableTemplate.m
i TableTemplate.xib
gdzie mam stalówka zdefiniowane. Chcę, aby zdarzenie kliknięcia przycisku z indeksem komórki w ViewController.m
.
Jakaś pomoc, jak mogę to zrobić?
źródło
Delegaci są do zrobienia.
Jak widać w przypadku innych odpowiedzi, korzystanie z widoków może być nieaktualne. Kto wie, że jutro może być inne opakowanie i być może trzeba będzie go użyć
cell superview]superview]superview]superview]
. A jeśli użyjesz tagów, otrzymasz n liczbę warunków if else do identyfikacji komórki. Aby uniknąć tego wszystkiego, ustaw delegatów. (W ten sposób utworzysz klasę komórek wielokrotnego użytku. Możesz użyć tej samej klasy komórki jako klasy bazowej, a wszystko, co musisz zrobić, to zaimplementować metody delegatów.)Najpierw potrzebujemy interfejsu (protokołu), który będzie używany przez komórkę do komunikowania (delegata) kliknięć przycisków. ( Możesz utworzyć oddzielny plik .h dla protokołu i dołączyć go zarówno do kontrolera widoku tabeli, jak i niestandardowych klas komórek LUB po prostu dodaj go do niestandardowej klasy komórki, która i tak zostanie uwzględniona w kontrolerze widoku tabeli )
Dołącz ten protokół do niestandardowego kontrolera widoku komórki i tabeli. I upewnij się, że kontroler widoku tabeli potwierdza ten protokół.
W komórce niestandardowej utwórz dwie właściwości:
W funkcji
UIButton
delegata IBAction kliknij: (To samo można zrobić dla dowolnej akcji w niestandardowej klasie komórki, która musi zostać oddelegowana z powrotem do kontrolera widoku )W kontrolerze widoku tabeli
cellForRowAtIndexPath
po usunięciu z kolejki komórki ustaw powyższe właściwości.I zaimplementuj delegata w kontrolerze widoku tabeli:
Byłoby to idealne podejście do uzyskania niestandardowych akcji przycisków komórki w kontrolerze widoku tabeli.
źródło
Zamiast bawić się tagami, przyjąłem inne podejście. Wykonano delegata dla mojej podklasy UITableViewCell (OptionButtonsCell) i dodano zmienną indexPath. Z mojego przycisku w storyboardzie połączyłem @IBAction z OptionButtonsCell i tam wysyłam metodę delegata z właściwą indexPath do wszystkich zainteresowanych. W komórce na ścieżkę indeksu ustawiam aktualną ścieżkę indexPath i działa :)
Niech kod mówi sam za siebie:
Swift 3 Xcode 8
OptionButtonsTableViewCell.swift
MyTableViewController.swift
źródło
class MyTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, OptionButtonsDelegate
pojawia się błąd w tej linii: // błąd: Nadmiarowa zgodność 'MyTableViewController' z protokołem 'UITableViewDataSource'To powinno pomóc: -
W tym przypadku nadawca to instancja UIButton, która wysyła zdarzenie. myTableView to instancja UITableView, z którą masz do czynienia.
Po prostu uzyskaj prawidłowe odwołanie do komórki i cała praca zostanie wykonana.
Może być konieczne usunięcie przycisków z contentView komórki i dodanie ich bezpośrednio do instancji UITableViewCell jako podwidoku.
Lub
Możesz sformułować schemat nazewnictwa tagów dla różnych UIButtons w cell.contentView. Używając tego tagu, możesz później poznać potrzebne informacje o wierszu i sekcji.
źródło
Poniższy kod może ci pomóc.
Wziąłem
UITableView
z niestandardową prototypową klasą komórek o nazwieUITableViewCell
wewnątrzUIViewController
.Tak mam
ViewController.h
,ViewController.m
iTableViewCell.h
,TableViewCell.m
Oto kod:
ViewController.h
ViewController.m
Niestandardowa klasa komórek:
i
Uwaga : tutaj zrobiłem wszystko
UIControls
przy użyciu Storyboard.Mam nadzieję, że to ci pomoże ... !!!
źródło
Powód, dla którego lubię poniższą technikę, ponieważ pomaga mi również zidentyfikować sekcję tabeli.
Dodaj przycisk w komórce cellForRowAtIndexPath:
Zadanie:
Mam nadzieję, że ta pomoc.
źródło
Użyj szybkich zamknięć:
źródło
Kod Taruna nie działa na iOS7, ponieważ zmieniła się struktura UITableViewCell i zamiast tego otrzymywałby „UITableViewCellScrollView”.
Ten post Pobieranie UITableViewCell z superviewem w iOS 7 ma dobre rozwiązanie, tworząc pętlę w celu znalezienia prawidłowego widoku nadrzędnego, niezależnie od wszelkich przyszłych zmian w strukturze. Sprowadza się do stworzenia pętli:
Odsyłacz zawiera kod rozwiązania wielokrotnego użytku, ale to powinno działać.
źródło
Swift 2.2
Musisz dodać cel dla tego przycisku.
FunctionName: połączono // na przykład
Oczywiście musisz ustawić tag tego przycisku, ponieważ go używasz.
Możesz to osiągnąć, tworząc podklasę UITableViewCell. Użyj go w kreatorze interfejsów, upuść przycisk na tej komórce, podłącz go przez gniazdko i gotowe.
Aby uzyskać tag w połączonej funkcji:
źródło
Swift 3 z zamknięciem
Fajnym rozwiązaniem jest użycie zamknięcia w niestandardowym UITableViewCell do wywołania zwrotnego do viewController dla akcji.
W komórce:
Kontroler w widoku: delegat widoku tabeli
źródło
Najłatwiej jest utworzyć podklasę przycisku wewnątrz komórki (Swift 3):
W twojej klasie komórkowej:
W źródle danych widoku tabeli lub widoku kolekcji podczas usuwania z kolejki komórki podaj przyciskowi ścieżkę indeksu:
Możesz więc po prostu umieścić ten kod w kontrolerze widoku tabeli:
I nie zapomnij ustawić klasy przycisku w swoim Interface Builder i połączyć go z
handleTapOnCellInfoButton
funkcją!edytowano:
Korzystanie z iniekcji zależności. Aby skonfigurować wywołanie zamknięcia:
i wstrzyknij zamknięcie w metodzie willDisplay delegata widoku kolekcji:
źródło
To dla mnie praca.
źródło
źródło
dla swift 4:
źródło
Jeśli chcesz przekazać wartość parametru z komórki do UIViewController przy użyciu zamknięcia, to
źródło
@Mani odpowiedź jest dobra, jednak tagi widoków wewnątrz contentView komórki często są używane do innych celów. Możesz zamiast tego użyć tagu cell (lub tagu contentView komórki):
1) W swojej
cellForRowAtIndexPath:
metodzie przypisz tag komórki jako indeks:2) Dodaj cel i akcję dla swojego przycisku, jak poniżej:
3) Utwórz metodę, która zwraca wiersz nadawcy (dzięki @Stenio Ferreira):
4) Działania kodu oparte na indeksie:
źródło
CustomTableCell.h jest UITableViewCell:
MyVC.m po imporcie:
Wewnątrz „cellForRowAtIndexPath” w MyVC.m:
MyVC.m:
źródło
źródło