Korzystanie ze Swift 1.1 i Xcode 6.2.
Mam tablicę UIStoryboard zawierającą pojedynczą, niestandardową UIViewController
podklasę. Na nim mam @IBOutlet
połączenie typu UIView
z tego kontrolera do UIView
podklasy w scenorysie. Mam też podobne możliwości udostępniania podglądów tego widoku. Patrz rysunek A.
Ale w czasie wykonywania te właściwości są zerowe (Rysunek B). Chociaż zapewniłem, że podłączyłem gniazda w Interface Builder.
Myśli :
- Czy to możliwe, że ponieważ używam podklasy podklasy, coś zepsuło inicjalizację? Nie zastępuję żadnych inicjatorów
awakeFromNib:
nie został wezwany z jakiegoś powodu- Może nie łączy się z podglądami podrzędnymi
Rzeczy, których próbowałem:
- Dokładne dopasowanie
@IBOutlet
i typy elementów scenorysu (zamiastUIView
) - Usunięcie nieruchomości i lokalu oraz ponowne ich dodanie
Rysunek A *
Rysunek B.
* Ukryty kod w Figure A
to:
@IBOutlet private var annotationOptionsView: UIView!
@IBOutlet private var arrivingLeavingSwitch: UISegmentedControl!
Dziękuję Ci.
clearView
Spodziewam się, że będzie zero. To jest coś, czego jeszcze nie dokonałem. Zobacz także przypis do rysunku A. @ShaanSingh Powinno! ponieważ połączenia ze scenorysów są (powinny być) ustawiane w czasie wykonywania i nie powinny być zerowe.let vc = UIStoryboard(name: "LocationPickerModal", bundle: nil) .instantiateViewControllerWithIdentifier("LocationPickerModalViewController") as LocationPickerModalViewController
Odpowiedzi:
Zwykle dzieje się tak, ponieważ kontroler widoku nie załadował jeszcze swojej hierarchii widoku. Kontroler widoku ładuje swoją hierarchię widoków tylko wtedy, gdy coś wysyła do niego
view
wiadomość. System robi to, gdy nadejdzie czas, aby faktycznie umieścić hierarchię widoków na ekranie, co dzieje się po takich czynnościach jakprepareForSegue:sender:
iviewWillAppear:
powrocie .Ponieważ Twój VC nie załadował jeszcze swojej hierarchii widoków, Twoje punkty sprzedaży są nadal zerowe.
Możesz zmusić VC do załadowania hierarchii widoków, mówiąc
_ = self.view
.źródło
viewWillAppear:
po raz pierwszy robię coś z tym gniazdem. Dostęp do widoku nic mi nie daje. Wciąż zero.UIViewcontroller.loadViewIfNeeded()
jest tutaj właściwą metodą.Czy próbowałeś uruchomić produkt> Wyczyść. Rozwiązałem dla mnie bardzo podobny problem.
źródło
DerivedData
folderu projektu.Czy utworzyłeś wystąpienie kontrolera widoku z Storyboard lub NIB, czy też utworzyłeś go bezpośrednio za pomocą inicjatora?
Jeśli utworzyłeś instancję klasy bezpośrednio z inicjatorem, gniazda nie zostaną połączone. Interface Builder tworzy niestandardowe wystąpienia twoich klas i koduje je w NIB i Storyboard w celu wielokrotnego dekodowania, nie definiuje samych klas. Jeśli to był twój problem, wystarczy zmienić kod, w którym tworzysz kontroler, aby zamiast tego użyć metod na UIStoryboard lub UINib.
źródło
UIStoryboard
instancję i wzywaminstantiateViewControllerWithIdentifier
ją.Storyboard nie rozpoznawał żadnych dalszych elementów interfejsu użytkownika, które do niego dodałem. W czasie wykonywania wszystkie odwołania były zerowe. Więc wyczyściłem folder z danymi pochodnymi, a następnie te połączenia znów zadziałały.
źródło
viewDidLoad()
wszystkich połączeniach były wykonane, ale wviewWillAppear()
prawie wszystkich byłynil
(czasami jedno lub dwa były nadal połączone). Próbowałem wszystkiego i ostatecznie usunąłem folder danych pochodnych, odbudowałem i wszystko było dobrze.Przydarzyło mi się to w przypadku mojej niestandardowej komórki widoku kolekcji. Okazuje się, że musiałem zamienić metodę registerClassforReuseIdentifier na registerNib. To naprawiło to dla mnie.
źródło
Stało się to w moim przypadku, ponieważ przypadkowo utworzyłem instancję mojego kontrolera widoku bezpośrednio, zamiast tworzyć instancję za pośrednictwem scenorysu. Jeśli utworzysz instancję bezpośrednio przez,
MyViewController()
gniazda nie zostaną połączone.źródło
W moim przypadku stało się tak, ponieważ
loadView
nadpisałem metodę w mojej podklasie ViewController, ale zapomniałem dodać[super loadView]
Kiedy zastępujesz
loadView
metodę, Twoim obowiązkiem jest zainicjowanie podglądów podrzędnych. Ponieważ to nadpisujesz, widoki z kreatora interfejsów nie mają szansy na konwersję na obiekty kakaowe, a zatem gniazda pozostają zerowe.Jeśli zaimplementujesz loadView w podklasie kontrolera widoku, to Twoim obowiązkiem jest załadowanie elementów interfejsu użytkownika z storyboard / xib do kodu.
Albo po prostu zadzwoń
Aby superklasa miała szansę załadować storyboard / xib do kodu.
źródło
Możesz wywołać
controller.view
wymuszenie załadowania widoku w celu zainicjowania IBOutlets, a następnie będziesz mógł przypisać wartości.źródło
Jeśli utworzysz wystąpienie
view controller
programu. Następnie spróbuj utworzyć go jak poniżejzamiast bezpośrednio
To zadziałało dla mnie.
źródło
W moim przypadku miało to miejsce, gdy przypadkowo zadeklarowałem klasę mojego kontrolera widoku jako
(tj. jako
UINavigationController
nie aUIViewController
).Xcode nie odebrać na tej pomyłki, klasa wydaje budować grzywny oraz funkcji sterowania, takie jak
viewDidLoad
,viewWillAppear
itp wszystko działa poprawnie. Ale żaden zIBOutlet
jest połączone.Zmiana deklaracji na
naprawiłem to całkowicie.
źródło
Ostatnio napotykam ten problem! Oto moja myśl. Problem nie dotyczy Twojej storyboardu ani żadnego problemu z łączem. Chodzi o to, jak inicjować ViewController. Zwłaszcza jeśli używasz Swift. (Kiedy tworzysz plik klasy, w edytorze nie ma prawie nic)
Po prostu używając
init()
from super class nie możesz zainicjować niczego, z czym pracowałeś z storyboardem. Więc to, co musisz zrobić, to zmienić inicjalizację ViewController. Zamieńlet XXViewController = XXViewController()
przezlet XXViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("XXViewController") as! XXViewController
To mówi programowi, aby przejść do storyboardu, znaleźć XXViewController i zainicjować wszystkoIBOutlet
w swojej serii ujęć.Mam nadzieję, że ta pomoc ~ GL
źródło
2019, JEDNA MOŻLIWOŚĆ NA TEN STRASZNY PROBLEM:
Załóżmy, że być może masz widok kontenera, który pokazuje jakiś rodzaj zegara. Więc masz
klasa Zegar: UIViewController
W rzeczywistości używasz go w wielu miejscach w aplikacji .
Na ekranie głównym, na ekranie szczegółów, na ekranie edycji.
Masz skomplikowaną, nowoczesną aplikację podobną do snapchata.
W rzeczywistości
Clock
może być ładowany więcej niż raz w tym samym czasie gdzieś na tym samym ekranie . (Może w niektórych przypadkach jest ukryty).Zaczynasz pracować nad jednym wystąpieniem
Clock
jednego z wielu scenariuszy.W tej serii ujęć dodajesz etykietę NewLabel.
Oczywiście gniazdko dodajesz w kodzie. Wszystko powinno działać. Wszystkie inne gniazdka działają doskonale.
Ty na pewno związane wylot.
Jednak aplikacja ulega awarii z wartością NewLabel jako zero.
Xcode wyraźnie mówi, że „zapomniałeś podłączyć gniazdka”.
Powód jest taki .......... masz "NewLabel" tylko na jednym z zastosowań Zegara w scenorysie!
Awaria faktycznie pochodzi >>> z innego miejsca <<<< używasz Zegara !!!!
Xcode nie informuje, że awaria pochodzi z innego miejsca, a nie z miejsca, w którym pracujesz!
Awaria w rzeczywistości nie pochodzi z miejsca, w którym pracujesz - pochodzi z innego storyboardu, w którym nie ma elementu „NewLabel” w tym storyboardzie !!!
Denerwujący.
źródło
Dla Swift 3.
źródło
Najpierw musisz załadować hierarchię widoków, aby utworzyć wystąpienie gniazd w serii ujęć. W tym celu możesz ręcznie wywołać metody loadView lub loadViewIfNeeded.
źródło
W moim przypadku aplikacja nagle zaczęła się zawieszać. Debugowanie go ujawniło, że wszystkie punkty sprzedaży nadal działały
nil
w czasieviewDidLoad()
.Moja aplikacja nadal używa końcówek (nie scenorysów) dla większości kontrolerów widoku. Wszystko było na swoim miejscu, wszystkie gniazdka prawidłowo okablowane. Sprawdziłem dwukrotnie.
Zwykle tworzymy wystąpienia naszych kontrolerów widoku jako
... które z jakiegoś powodu wydaje się działać tak długo, jak .xib nazywa się tak samo jak klasa widoku kontrolera (nie wiem, jak to działa, choć. Jesteśmy nie dzwoni
init(nibName:bundle:)
z zerowymi argumentów, lub nadrzędnymiinit()
to zrobić naself
like it jest zwykle sugerowane ...).Więc spróbowałem wyraźnie zadzwonić
... tylko do powitania z błędem wyjątku w czasie wykonywania:
I wtedy to zobaczyłem:
Pole wyboru „Członkostwo docelowe” w pliku .xib nie zostało zaznaczone.
Musiało się to wydarzyć podczas rozwiązywania jednego z częstych konfliktów scalania dotyczących pliku projektu Xcode.
Apple zdecydowanie musi wymyślić format pliku projektu, który byłby bardziej przyjazny dla SCM.
źródło
W 100% działające rozwiązanie do tworzenia ViewControllerów z XIB bez StoryBoards
7.1.
7.2.
7.3.
źródło
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)
i wywołać krok 7.2self
bezpośrednio w klasie CustomViewController.Sprawdź połączenie IBOutlet, jeśli jest połączone z właścicielem pliku lub widokiem. Mogą być błędy.
źródło
Inny przypadek:
Twoje wyloty nie zostaną ustawione, dopóki widok kontrolera widoku nie zostanie faktycznie utworzony, co w twoim przypadku prawdopodobnie dzieje się wkrótce po initWithNibName: bundle: - w którym to momencie nadal będą zerowe. Każda konfiguracja, którą wykonujesz, która obejmuje te gniazda, powinna być wykonywana w metodzie -viewDidLoad kontrolera widoku.
źródło
U mnie miałem ten sam błąd na zlokalizowanej planszy scenorysu, element został dodany w jednym locale, a nie w innym, więc miałem zerowe odniesienie do tego elementu po przełączeniu na brakujące ustawienie regionalne, musiałem usunąć (nadmiarową) lokalizację dla ten scenorys przy użyciu https://stackoverflow.com/a/42256341/1356559 .
źródło
Dla mnie to się zawiesiło, ponieważ
containerView
było zero.Oto mój kod z Crash .
Brakująca rzecz nazywała się
super.loadView()
. Więc dodanie tego rozwiązało problem.Naprawiono kod :
źródło
Miałem podobny problem, gdy wcześniej dodałem register (_: forCellReuseIdentifier :) dla niestandardowej komórki po tym, jak już zdefiniowałem identyfikator w scenorysie. Miał ten kod w funkcji viewDidLoad (). Po usunięciu działało dobrze.
źródło
Kolejny przypadek, z którym właśnie się spotkałem. Zmieniłem nazwę mojej klasy dla UIViewController, ale zapomniałem zmienić nazwę pliku .xib, w którym został zbudowany interfejs.
Kiedy to złapałem i sprawiłem, że nazwy plików odzwierciedlały nazwę klasy, wszystko było dobrze!
Mam nadzieję, że to komuś pomoże.
źródło
Mam jeszcze jednego ...
Jeśli masz klasę niestandardową dla UITableViewCell, ale zapomnisz określić Custom w Style komórki.
źródło
Możesz sprawdzić, czy widok jest załadowany.
źródło
.h
i.m
wyświetl pliki kontroleraźródło
Przypadkowo podklasowałem mój kontroler widoku z
AVPlayerViewController
zamiastUIViewController
. Odtworzenie tego doUIViewController
normalnego stanu. To powinno pomóc.źródło
Miałem ten sam problem po skopiowaniu klasy (połączonej z xib), aby ponownie użyć jej z inną klasą viewcontroller (połączoną ze scenorysem). Zapomniałem usunąć
i
metody.
Po ich usunięciu moje gniazdka zaczęły działać.
źródło
Widzę, że używasz
ViewController
!? wViewController
klasie Państwo musi użyć-viewDidLoad
, nie-awakeFromNib
,-awakeFromNib
użyj dlaUIView
klasyźródło
Sprawdź, czy nie brakuje żadnych gniazdek lub są one odłączone.
źródło
Jeśli masz dwa
main.storyboards
i wprowadzasz zmiany w niewłaściwym, może się to zdarzyć. Może się to zdarzyć za każdym razem, gdy podłączysz gniazdko z niezainicjowanegostoryboard
.źródło