Mam klasę o nazwie, MyClass
która jest podklasą UIView
, którą chcę zainicjować z XIB
plikiem. Nie jestem pewien, jak zainicjować tę klasę za pomocą pliku xib o nazwieView.xib
class MyClass: UIView {
// what should I do here?
//init(coder aDecoder: NSCoder) {} ??
}
Odpowiedzi:
Przetestowałem ten kod i działa świetnie:
Zainicjuj widok i użyj go jak poniżej:
LUB
AKTUALIZACJA Swift> = 3.x i Swift> = 4.x
źródło
var view = MyClass.instanceFromNib()
&self.view.addSubview(view)
w przeciwieństwie dovar view = MyClass.instanceFromNib
&self.view.addSubview(view())
. Tylko mała sugestia, aby poprawić odpowiedź :)Rozwiązanie Sama jest już świetne, mimo że nie bierze pod uwagę różnych pakietów (na ratunek przychodzi NSBundle: forClass) i wymaga ręcznego ładowania, czyli wpisywania kodu.
Jeśli chcesz mieć pełne wsparcie dla swoich gniazd Xib, różnych pakietów (używaj w frameworkach!) I uzyskaj ładny podgląd w Storyboard, spróbuj tego:
Użyj swojego xib jak zwykle, tj. Połącz Outlety z File Owner i ustaw klasę File Owner na własną klasę.
Użycie: Po prostu podklasuj własną klasę View z NibLoadingView i ustaw nazwę klasy na Właściciel pliku w pliku Xib
Nie jest już wymagany żaden dodatkowy kod.
Kredyty, w przypadku których należy się kredyt: rozwidlono to z niewielkimi zmianami z DenHeadless na GH. Moje streszczenie: https://gist.github.com/winkelsdorf/16c481f274134718946328b6e2c9a4d8
źródło
nibSetup
zinit?(coder:)
spowoduje nieskończoną rekursję, jeśli zostanie osadzonyNibLoadingView
w XIB..clearColor()
- po załadowaniu go z Storyboard. Ale powinno działać, jeśli zrobisz to za pomocą kodu po utworzeniu wystąpienia. W każdym razie, jak powiedziano, jeszcze bardziej eleganckim podejściem jest podejście oparte na protokole. Tak więc, oto link dla Ciebie: github.com/AliSoftware/Reusable . Używam teraz podobnego podejścia w odniesieniu do UITableViewCells (które zaimplementowałem, zanim odkryłem ten naprawdę przydatny projekt). hth!Począwszy od Swift 2.0, możesz dodać rozszerzenie protokołu. Moim zdaniem jest to lepsze podejście, ponieważ typ zwracany jest
Self
raczej niżUIView
, więc obiekt wywołujący nie musi rzutować na klasę widoku.źródło
var myView = nib.instantiate... as! myViewType
Swift 3
(XCode 8.0 beta 6) bez problemów opublikowałem . Wpisano literówkęSwift 2
. Dlaczego miałaby to być kolejna odpowiedź, skoro ta odpowiedź jest dobra, a użytkownicy prawdopodobnie polubią wyszukiwanie, jakie zmiany będą miały miejsce, gdy będą używać XC8I to jest odpowiedź Frederika na Swift 3.0
źródło
Uniwersalny sposób wczytywania widoku z XIB:
Przykład:
Realizacja:
źródło
Odpowiedź Swift 3: W moim przypadku chciałem mieć gniazdko w mojej klasie niestandardowej, które mógłbym zmodyfikować:
W pliku xib upewnij się, że pole klasy niestandardowej to MyClassView. Nie zawracaj sobie głowy właścicielem pliku.
Upewnij się również, że podłączasz gniazdko w MyClassView do etykiety:
Aby go utworzyć:
źródło
Szybki 4
Tutaj w moim przypadku muszę przekazać dane do tego niestandardowego widoku, więc tworzę funkcję statyczną, aby utworzyć wystąpienie widoku.
Utwórz rozszerzenie UIView
Utwórz MyCustomView
Ustaw klasę niestandardową na MyCustomView w pliku xib. W razie potrzeby podłącz gniazdko w zwykły sposób.
Utwórz instancję widoku
źródło
źródło