Mam problem z klasą Swift. Mam szybki plik dla klas UITableViewController i UITableViewCell. Moim problemem jest klasa UITableViewCell i gniazda. Ta klasa ma błąd Klasa „HomeCell” nie ma inicjatorów i nie rozumiem tego problemu.
Dziękuję za twoje odpowiedzi.
import Foundation
import UIKit
class HomeTable: UITableViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet var tableViex: UITableView!
var items: [(String, String, String)] = [
("Test", "123", "1.jpeg"),
("Test2", "236", "2.jpeg"),
("Test3", "678", "3.jpeg")
]
override func viewDidLoad() {
super.viewDidLoad()
var nib = UINib(nibName: "HomeCell", bundle: nil)
tableView.registerNib(nib, forCellReuseIdentifier: "bookCell")
}
// Number row
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.items.count
}
// Style Cell
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("bookCell") as UITableViewCell
// Style here
return cell
}
// Select row
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// Select
}
}
// PROBLEM HERE
class HomeCell : UITableViewCell {
@IBOutlet var imgBook: UIImageView
@IBOutlet var titleBook: UILabel
@IBOutlet var pageBook: UILabel
func loadItem(#title: String, page: String, image:String) {
titleBook.text = title
pageBook.text = page
imgBook.image = UIImage(named: image)
}
}
ios
uitableview
swift
Kevin Py
źródło
źródło
Odpowiedzi:
Musisz użyć niejawnie nieopakowanych opcji, aby Swift mógł poradzić sobie z zależnościami kołowymi (w tym przypadku nadrzędnym <-> potomkiem składników interfejsu użytkownika) podczas fazy inicjalizacji.
Przeczytaj ten dokument , wszystko ładnie wyjaśnią.
źródło
var myBool: Bool
.Szybka poprawka - upewnij się, że wszystkie zmienne, które nie zostaną zainicjowane podczas ich tworzenia (np.
var num : Int?
Vsvar num = 5
), mają albo a?
lub!
.Długa odpowiedź (zalecane) - przeczytaj dokument zgodnie z sugestią mprivat ...
źródło
?
oznacza, że może być zero, ale jeśli tak, to nie ma problemu z przejściem do przodu i nic nie robieniem.!
oznacza, że jeśli po rozpakowaniu było zero, to awaria - oba spełniają wymóg inicjacji - informując kompilator: Wiem / chcę, aby zaczął się od zera.var
ilet
na wyświetlanie kontrolera i szukać brakujących!
s i?
sTo jest z dokumentu Apple
Pojawia się komunikat o błędzie Klasa „HomeCell” nie ma inicjatorów, ponieważ zmienne są w nieokreślonym stanie. Albo tworzysz inicjalizatory, albo czynisz je opcjonalnymi typami, używając! czy?
źródło
Moja odpowiedź dotyczy błędu w ogóle, a nie dokładnego kodu PO. Żadna odpowiedź nie wspomniała o tej notatce, więc pomyślałem, że ją dodam.
Poniższy kod również wygeneruje ten sam błąd:
Inni wspominali, że albo tworzysz inicjatory, albo tworzysz z nich opcjonalne typy, używając! czy? który jest poprawny. Jeśli jednak masz opcjonalny element członkowski / właściwość, ten opcjonalny powinien być modyfikowalny, tj
var
. Jeśli zrobisz,let
to nigdy nie będzie będzie w stanie wyjść z tegonil
stanu. To źle!Prawidłowy sposób pisania to:
Opcja 1
Lub możesz napisać to jako:
Opcja 2
lub domyślnie przyjmuje dowolną wartość (w tym
nil
trochę głupią)Opcja 3
Jeśli jesteś ciekawy, dlaczego
let
(w przeciwieństwie dovar
) nie został zainicjowany,nil
przeczytaj tutaj i tutajźródło
nil
jest bardzo złe. Ustawianievar
TOnil
jest inna sprawa.W moim przypadku zadeklarowałem coś
Bool
takiego:tzn. zadeklarowałem to bez rozpakowywania, więc oto jak rozwiązałem błąd ( brak inicjatora ):
źródło
Nie jest to konkretna odpowiedź na twoje pytanie, ale dostałem ten błąd, gdy nie ustawiłem wartości początkowej dla wyliczenia, deklarując go jako właściwość. Przypisałem wartość początkową do wyliczenia, aby rozwiązać ten błąd. Publikowanie tutaj, ponieważ może to komuś pomóc.
źródło
po prostu podaj blok inicjujący dla klasy HomeCell
w moim przypadku to praca
źródło