Swift - jak stworzyć własny viewForHeaderInSection przy użyciu pliku XIB?
Mogę stworzyć prosty niestandardowy viewForHeaderInSection programowo, jak poniżej. Ale chcę zrobić znacznie bardziej złożone rzeczy, być może połączyć się z inną klasą i dotrzeć do ich właściwości, takich jak komórka tableView. Chcę tylko zobaczyć, co robię.
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { if(section == 0) { let view = UIView()// The width will be the same as the cell, and the height should be set in tableView:heightForRowAtIndexPath:
let label = UILabel()
let button = UIButton(type: UIButtonType.System) label.text="My Details"
button.setTitle("Test Title", forState: .Normal)
// button.addTarget(self, action: Selector("visibleRow:"), forControlEvents:.TouchUpInside) view.addSubview(label)
view.addSubview(button) label.translatesAutoresizingMaskIntoConstraints = false
button.translatesAutoresizingMaskIntoConstraints = false let views = ["label": label, "button": button, "view": view] let horizontallayoutContraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|-10-[label]-60-[button]-|", options: .AlignAllCenterY, metrics: nil, views: views)
view.addConstraints(horizontallayoutContraints) let verticalLayoutContraint = NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: 0)
view.addConstraint(verticalLayoutContraint) return view
} return nil
}
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 50
}
Czy jest ktoś, kto może wyjaśnić, jak mogę utworzyć niestandardowy widok nagłówka tableView przy użyciu xib? Natknąłem się na stare tematy Obj-C, ale jestem nowy w języku Swift. Byłoby wspaniale, gdyby ktokolwiek mógł wyjaśnić te same szczegóły.
1.issue:
Przycisk @IBAction nie łączy się z moim ViewController.
(Naprawiony
)
Rozwiązany z właścicielem pliku, klasą bazową ViewController (kliknięto menu konspektu po lewej stronie).
2.issue:
problem z wysokością nagłówka
(naprawiony
)
Postanowiłem dodać
headerView.clipsToBounds = true
w metodzie
viewForHeaderInSection
:.
Ostrzeżenia o ograniczeniach
ta odpowiedź rozwiązała moje problemy
https://coderoad.ru/11664115/
:
Kiedy dodałem ImageView nawet to samo ograniczenie wysokości przy użyciu tej metody w viewController, przepływa przez wiersze tableView,
podobny do obrazu
https://i.stack.imgur.com/yoYQ6.png
.
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 120
}
Jeśli używam automaticAdjustsScrollViewInsets w viewDidLoad, to w tym przypadku obraz przepływa pod navigationBar. - naprawiony-
self.automaticallyAdjustsScrollViewInsets = false
3.issue:
jeśli przycisk jest ukryty
(naprawiony
)
@IBAction func didTapButton(sender: AnyObject) {
print("tapped") if let upView = sender.superview {
if let headerView = upView?.superview as? CustomHeader {
print("in section \(headerView.sectionNumber)")
} }
}
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
4 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
[/*]
[*]
W w kontrolerze widoku zarejestruj NIB. W wersji Swift 3 i nowszych:
[/*]
[*]
W usuń z kolejki widok wielokrotnego użytku, używając tego samego identyfikatora, który został określony w poprzednim kroku. Po wykonaniu tej czynności możesz teraz korzystać z gniazda, nie musisz nic robić z programowo utworzonymi ograniczeniami itp. Jedyne, co musisz zrobić (aby protokół działał dla przycisku), to określić jego delegata. Na przykład w Swift 3:
[/*]
[*]
Oczywiście, jeśli zamierzasz określić kontroler widoku jako dla przycisku w widoku tytułowym, musisz dostosować się do tego protokołu:
[/*]
[/list]
To wszystko wydaje się zagmatwane, gdy wymieniam wszystkie niezbędne kroki, ale jest to całkiem proste, jeśli zrobiłeś to raz lub dwa razy. Myślę, że jest to łatwiejsze niż programowe tworzenie widoku nagłówka.
W
odpowiedz mat
https://stackoverflow.com/a/50087040/1271826
protesty:
Problem polega na tym, że nie można magicznie zmienić na końcu w , po prostu zadeklarując go jako taki w inspektorze tożsamości.
To po prostu nie jest w porządku. Jeśli korzystasz z powyższego podejścia opartego na NIB, to klasa, która jest tworzona dla widoku głównego tego widoku nagłówka, to
jest
podklasy , a nie . Tworzy instancję dowolnej klasy, którą określisz dla klasy bazowej dla widoku głównego NIB.
Jednak prawdą jest, że niektóre właściwości tej klasy (zwłaszcza https://developer.apple.com/do ... ntview) nie są używane w tym podejściu opartym na NIB. To naprawdę powinna być opcjonalna właściwość, na przykład
i
https://developer.apple.com/do ... label i https://developer.apple.com/do ... label
(lub lepiej, powinny dodać odpowiednią obsługę w IB). Zgadzam się, że to zły projekt ze strony Apple, ale wydaje mi się, że jest to niechlujny, dziwaczny szczegół, ale drobny problem, biorąc pod uwagę wszystkie problemy w widokach tabel. Na przykład, to niesamowite, że po tych wszystkich latach nadal nie możemy w ogóle tworzyć prototypowych nagłówków i stopek w scenorysach i musimy polegać na tych NIB i ogólnie metodach rejestracji klas.
Ale wnioskowanie, że nie możesz użyć https://developer.apple.com/do ... ister, metoda API, która jest aktywnie używana od iOS 6. nie wyrzucajmy dziecka razem z wodą do kąpieli.
Cm.
poprzednia edycja
https://stackoverflow.com/revisions/36931047/3
Zobacz tę odpowiedź dla wersji Swift 2.
Anonimowy użytkownik
Potwierdzenie od:
Problem polega na tym, że nie można w magiczny sposób zamienić UIView na końcówce w UITableViewHeaderFooterView, po prostu deklarując go jako taki w inspektorze tożsamości. UITableViewHeaderFooterView ma ważne funkcje, które są kluczem do prawidłowego działania, oraz prosty UIView, bez względu na to, jak lubisz
rozgrywa się
, oni nie są.
Jaka jest więc prawidłowa odpowiedź na to pytanie? Nie
nie mozliwe
odpowiedź. Apple zrobiło tutaj wielką głupotę. Udostępnili metodę, która pozwala zarejestrować pióro jako źródło UITableViewHeaderFooterView, ale
w bibliotece obiektów nie ma UITableViewHeaderFooterView
... Dlatego ta metoda
nieprzydatny
.
Niemożliwy
Zaprojektuj UITableViewHeaderFooterView poprawnie we wskazówce.
To ogromny błąd w Xcode. Zgłosiłem błąd w tej sprawie
w 2013
rok, a on nadal tam siedzi otwarty. Rok po roku uzupełniam błąd, a Apple naciska, mówiąc: „Nie jest jeszcze ustalone, jak i kiedy ten problem zostanie rozwiązany”. Dlatego przyznają się do błędu, ale nic nie robią.
Jednak co ty
czy możesz
należy utworzyć normalny UIView na końcówce, a następnie w kodzie (w implementacji ) załadować widok ręcznie z końcówki i umieścić go w w nagłówku widok.
Na przykład przypuśćmy, że chcemy zaprojektować nasz nagłówek w końcówce i mamy w nagłówku etykietę, którą chcemy podłączyć do gniazda . Następnie potrzebujemy zarówno niestandardowej klasy nagłówka, jak i niestandardowej klasy widoku:
Rejestrujemy się
klasa
nasz widok nagłówka, a nie pióro:
Jako plik
xib
, deklarujemy, że nasz widok to MyHeaderViewContent -
nie
MyHeaderView.
W wyciągamy widok z końcówki, wstawiamy go do nagłówka i ustawiamy link do niego:
To straszne i denerwujące, ale to najlepsza rzecz, jaką możesz zrobić.
Anonimowy użytkownik
Potwierdzenie od:
W każdym razie jedyną rzeczą, której tu brakuje, jest usunięcie wszystkich podglądów podrzędnych z UITableViewHeaderFooterView.contentView przed dodaniem nowych widoków. Spowoduje to zresetowanie ponownie użytej komórki do jej pierwotnego stanu i uniknięcie wycieków pamięci.
Anonimowy użytkownik
Potwierdzenie od:
Zarejestruj pióro w ten sam sposób, w jaki rejestrujesz komórkę widoku tabeli. Nazwa wskazówki i identyfikator ponownego wykorzystania muszą być zgodne z nazwami plików. (Xib nie ma identyfikatora ponownego wykorzystania).
Usuń z kolejki i użyj podobnego do komórki. Identyfikator to nazwa pliku.
Nie zapomnij o wysokości nagłówka.