Próbuję utworzyć niestandardową komórkę widoku tabeli ze stalówki. Mówię o tym artykule tutaj . Mam dwa problemy.
Utworzyłem plik .xib z przeciągniętym na niego obiektem UITableViewCell. Utworzyłem podklasę UITableViewCell
i ustawiłem ją jako klasę komórki i Cell jako identyfikator wielokrotnego użytku.
import UIKit
class CustomOneCell: UITableViewCell {
@IBOutlet weak var middleLabel: UILabel!
@IBOutlet weak var leftLabel: UILabel!
@IBOutlet weak var rightLabel: UILabel!
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
W UITableViewController mam ten kod,
import UIKit
class ViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {
var items = ["Item 1", "Item2", "Item3", "Item4"]
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - UITableViewDataSource
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let identifier = "Cell"
var cell: CustomOneCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
if cell == nil {
tableView.registerNib(UINib(nibName: "CustomCellOne", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
}
return cell
}
}
Ten kod jest zgodny bez błędów, ale kiedy uruchamiam go w symulatorze, wygląda to tak.
W UITableViewController w scenorysie nie zrobiłem nic z komórką. Pusty identyfikator i brak podklasy. Próbowałem dodać identyfikator komórki do komórki prototypowej i uruchomiłem ją ponownie, ale otrzymałem ten sam wynik.
Innym błędem, z którym się spotkałem, jest próba zaimplementowania następującej metody w UITableViewController.
override func tableView(tableView: UITableView!, willDisplayCell cell: CustomOneCell!, forRowAtIndexPath indexPath: NSIndexPath!) {
cell.middleLabel.text = items[indexPath.row]
cell.leftLabel.text = items[indexPath.row]
cell.rightLabel.text = items[indexPath.row]
}
Jak pokazano w artykule wspomniałem Zmieniłem cell
formę typu parametru UITableViewCell
do CustomOneCell
którego jest moim podklasy UITableViewCell. Ale pojawia się następujący błąd,
Przesłanianie metody za pomocą selektora „tableView: willDisplayCell: forRowAtIndexPath:„ ma niezgodny typ ”(UITableView !, CustomOneCell !, NSIndexPath!) -> ()”
Czy ktoś ma pomysł, jak rozwiązać te błędy? Wydawało się, że działają dobrze w Objective-C.
Dziękuję Ci.
EDYCJA: Właśnie zauważyłem, że jeśli zmienię orientację symulatora na poziomą i wrócę do portretu, komórki się pojawią! Nadal nie mogłem dowiedzieć się, co się dzieje. Wrzuciłem tutaj projekt Xcode pokazujący problem, jeśli masz czas na szybkie spojrzenie.
źródło
Oto moje podejście przy użyciu Swift 2 i Xcode 7.3. W tym przykładzie użyje jednego ViewController do załadowania dwóch plików xib - jednego dla UITableView i jednego dla UITableCellView.
W tym przykładzie możesz upuścić UITableView bezpośrednio do pustego pliku TableNib .xib. Wewnątrz ustaw właściciela pliku na klasę ViewController i użyj gniazdka, aby odwołać się do tableView.
i
Teraz w kontrolerze widoku możesz delegować tableView w normalny sposób
Aby utworzyć komórkę niestandardową, ponownie upuść obiekt komórki widoku tabeli do pustego pliku TableCellNib .xib. Tym razem w pliku .xib komórki nie musisz określać „właściciela”, ale musisz określić klasę niestandardową i identyfikator, taki jak „TableCellId”
Utwórz podklasę z dowolnymi gniazdami, których potrzebujesz
Wreszcie ... z powrotem w kontrolerze widoku możesz załadować i wyświetlić całość w ten sposób
Kod pokazuje, jak można po prostu załadować i wyświetlić plik nib (tabelę), a po drugie, jak zarejestrować końcówkę do użytku w komórce.
Mam nadzieję że to pomoże!!!
źródło
let tableCellId = "myAwesomeCell"
. Dodałem kolejny obraz, aby ci pomóc.Szybki 4
Zarejestruj Nib
W TableView DataSource
źródło
Szczegółowe rozwiązanie ze zrzutami ekranu
MyCustomCell.xib
.UITableViewCell
jako katalog główny pliku xib i wszelkie inne komponenty wizualne, które chcesz.MyCustomCell
jako podklasąUITableViewCell
.ctrl+drag
utwórz wyjścia dla swoich komponentów wizualnych.UIViewController
aby używał własnej komórki.źródło
MyHeaderView.swift
dla niestandardowej komórki..swift
Na nagłówku widoku nie maidentifier
wTable View Cell
wAttribute Inspector
. więc ... wystąpił błąd czasu wykonywania..swift
i wtableView?.register(blahblah, forCellReuseIdentifier: "myCell")
? Myślałem, że jeden z nich nie jest konieczny, ale ... stwierdziłem, że oba są niezbędne..xib
dla komórki niestandardowej może zawierać wiele,UITableViewCell
więc….xib
nie wystarczy… znaleźć właściwą komórkę.Nie zarejestrowałeś swojej stalówki jak poniżej:
źródło
Inną metodą, która może zadziałać dla Ciebie (tak to robię) jest rejestracja klasy.
Załóżmy, że tworzysz niestandardowy tableView w następujący sposób:
Następnie możesz zarejestrować tę komórkę w dowolnym kontrolerze UITableViewController, w którym będziesz ją wyświetlać za pomocą „registerClass”:
I możesz to nazwać tak, jak można się spodziewać w komórce dla metody wiersza:
źródło
Aby naprawić błąd „Przesłanianie metody ... ma niezgodny typ ...” zmieniłem deklarację funkcji na
(było
-> UITableViewCell!
- z wykrzyknikiem na końcu)źródło
szybki 4.1.2
xib.
Utwórz ImageCell2.swift
Krok 1
krok 2 . Zgodnie z klasą Viewcontroller
źródło
Musiałem się upewnić, że podczas tworzenia gniazdka określam, że podłączam się do komórki, a nie do właściciela obiektu. Kiedy pojawi się menu, aby je nazwać, musisz je wybrać z menu rozwijanego „obiekt”. Oczywiście musisz również zadeklarować komórkę jako swoją klasę, a nie tylko „TableViewCellClass”. W przeciwnym razie klasa nie jest zgodna z kluczem.
źródło
Po prostu weź xib z klasą UITableViewCell . Ustaw interfejs użytkownika zgodnie z wymaganiami i przypisz IBOutlet. Użyj go w cellForRowAt () widoku tabeli w następujący sposób:
100% działa bez problemu (testowane)
źródło