Pytanie IBOutlet jest zerowe, ale jest połączone w storyboard, Swift


Używanie Swift 1.1 i Xcode 6.2.

Mam tablicę UIStoryboard zawierającą pojedynczy, niestandardowy UIViewController podklasa. Na nim mam @IBOutlet połączenie typu UIView od tego kontrolera do UIView  podklasa na scenorysie. Mam też podobne punkty sprzedaży dla subviews tego widoku. Patrz rysunek A.

Ale w czasie wykonywania te właściwości są zerowe (rysunek B). Mimo że upewniłem się, że połączyłem gniazda w programie Interface Builder.

Myśli:

  • Czy jest możliwe, że ponieważ używam podklasy podklasy coś mes mesy up z inicjalizacją? Nie nadpisuję żadnych inicjalizatorów
  • awakeFromNib: nie jest wywoływany z jakiegoś powodu
  • Może to nie łączy się z subviewsami na temat subviews

Rzeczy, których próbowałem:

  • Pasujący @IBOutlet i dokładnie typy pozycji w albumie (zamiast UIView)
  • Usunięcie właściwości i wylotu oraz ponowne ich dodanie

Figure A

Rysunek A *

Figure B

Rysunek B

* Zakryty kod w Figure A jest:

@IBOutlet private var annotationOptionsView: UIView!
@IBOutlet private var arrivingLeavingSwitch: UISegmentedControl!

Dziękuję Ci.


76
2018-03-28 19:09


pochodzenie


Dlaczego nie zmienić! do ? - Shaan Singh
clearView jest zerowe, ponieważ nie jest powiązane z scenorysami (patrz kółko po lewej stronie kodu z dziurą, które wskazuje, że nie jest połączone), na zrzucie ekranu nie widzę deklaracji adnotacjiOptionView. - Javier Flores Font
@JavierFloresFont: clearView Oczekuję, że będę zerowy. To jest coś, co muszę jeszcze zmienić. Zobacz także przypis na rysunku A. @ShaanSingh Powinno być! ponieważ połączenia ze scenorysów są (powinny być) ustawione w czasie wykonywania i nie powinny być zerowe. - Stefan Arambasich
Jak ładuje się ten kontroler widoku? Pokaż nam kod, który o to prosi, lub opisz, która z nich się łączy. - rob mayoff
Otrzymuje odpowiedni storyboard: let vc = UIStoryboard(name: "LocationPickerModal", bundle: nil) .instantiateViewControllerWithIdentifier("LocationPickerModalViewController") as LocationPickerModalViewController - Stefan Arambasich


Odpowiedzi:


Zazwyczaj dzieje się tak, ponieważ kontroler przeglądania nie załadował jeszcze swojej hierarchii widoku. Kontroler widoku ładuje swoją hierarchię widoku tylko wtedy, gdy coś ją przesyła view wiadomość. System robi to, gdy nadszedł czas, aby rzeczywiście umieścić hierarchię widoku na ekranie, co dzieje się po takich rzeczach jak prepareForSegue:sender: i viewWillAppear: wrócili.

Ponieważ Twój VC nie załadował jeszcze swojej hierarchii widoków, twoje punkty sprzedaży są wciąż zerowe.

Możesz zmusić VC do załadowania hierarchii widoku, mówiąc self.view.


102
2018-03-28 20:41



Dzieje się tak, gdy viewWillAppear: jest nazywane, po raz pierwszy robię cokolwiek z tym gniazdkiem. Dostęp do widoku nic dla mnie nie robi. Wciąż zero. - Stefan Arambasich
Dzięki! To też zadziałało dla mnie. var v = viewcontroller.view; zmuszony do załadowania hierarchii widoku. Niezła sztuczka! ;) - Yordi Uytersprot
@ YordiUytersprot, gdzie by umieścić tę linię? - Async-
Cóż, jeśli tworzysz instancję viewcontroller: niech vc = self.storyboard? .InstantianteViewControllerWithIdentifier ("StoryboardIDfromVC") jako? CustomVC; let view = vc.view; // W tej chwili możesz uzyskać dostęp do IBOutlets z CustomVC tutaj .. vc.customTextField.text = "Lalala"; Mam nadzieję, że to pomoże! :) - Yordi Uytersprot
Tak często wpadam na ten temat i zawsze jest tak samo. I zawsze zastanawiam się przez pierwsze pięć minut ... ;-) - cybergen


Czy próbowałeś uruchomić Produkt> Wyczyść. Rozwiązałem dla mnie bardzo podobny problem.


25
2018-04-06 01:23



Zrobiłem. Przepraszam, ma oznaczać moją odpowiedź. Zaczęło działać dopiero po usunięciu DerivedData folder dla projektu. - Stefan Arambasich
Tylko dwa z moich sklepów w środku mojej hierarchii widoków były zerowe. Product -> Clean pracował dla mnie! - Rikco
Cieszę się, że mogłem pomóc - ThottChief
Dziękujemy, zadziałało, I użytkownik Produkt -> Czysty folder kompilacji ... - Ivan
obj c, samo sprzątanie projektu działało dla mnie ... nie mogę uwierzyć, że spędziłem ponad godzinę i nawet nie myślałem o czyszczeniu projektu: / ale dziękuję !! - greenhouse


Czy utworzyłeś swój kontroler widoku z Storyboard lub NIB, czy zrobiłeś go bezpośrednio przez inicjalizator?

Jeśli instancja zostanie utworzona bezpośrednio za pomocą inicjalizatora, wyjścia nie zostaną połączone. Program Interface Builder tworzy niestandardowe instancje klas i koduje te wystąpienia w NIB i Storyboard w celu powtarzalnego dekodowania, nie definiuje samych klas. Jeśli to był twój problem, po prostu musisz zmienić kod, w którym tworzysz swój kontroler, aby zamiast tego używać metod z UIStoryboard lub UINib.


14
2018-03-28 21:49



Tworzę UIStoryboard wystąpienie i wywołanie instantiateViewControllerWithIdentifier na tym. - Stefan Arambasich


W scenorysie nie rozpoznano żadnych innych rzeczy, które do niego dodałem. W czasie wykonywania wszystkie odwołania były zerowe. Więc wyczyściłem mój katalog danych pochodnych, a następnie te połączenia działały ponownie.


12
2018-03-29 02:04



To jest odpowiedź. Walczyłem z tym przez jakiś czas, czyściłem folder budowy i wszystko. W moim przypadku w viewDidLoad()wszystkie połączenia zostały wykonane, ale w viewWillAppear() prawie wszystkie z nich były nil (czasami jeden lub dwa były nadal połączone). Próbowałem wszystkiego i ostatecznie usunąłem katalog danych pochodnych, przebudowałem i wszystko było dobrze. - ruttopia
Nawet po 3 latach Xcode 9.2 nadal ma ten sam cholerny błąd. Dziękuję bardzo. - Kemal Can Kaynak


W moim przypadku stało się tak, ponieważ przesłoniłem loadView metoda w mojej podklasie ViewController, ale zapomniałem dodać [super loadView]

-(void)loadView {
// blank
}

Gdy nadpisujesz loadView Metoda, Twoim obowiązkiem jest zainicjować swoje subviews. Ponieważ go przesłonisz, widoki z budowniczego interfejsu nie mają szansy na konwersję na obiekty kakao, a zatem liczba punktów pozostaje zerowa.

Jeśli zaimplementujesz loadView w podklasie kontrolera widoku, to twoja odpowiedzialność załaduje elementy interfejsu użytkownika z storyboard / xib do kodu.

Lub po prostu zadzwoń

[super loadView];

Tak więc superklasa ma szansę załadować storyboard / xib do kodu.


10
2018-01-13 09:38





To działo się ze mną z moją niestandardową komórką widoku kolekcji. Okazuje się, że musiałem zastąpić moją metodę registerClassforReuseIdentifier z registerNib. To naprawiło to dla mnie.


8
2017-11-26 22:16



Masz rację. Przeczytałem szczegółowo zawartość licznika ARC w języku programowania Swift. Nie mogę znaleźć przyczyny, dla której słaba właściwość IBO nadal będzie zerowa. Nareszcie szukam google dla "@IBOutlet swift zero" i znajdź odpowiedź w SO. Następnie zaznaczyłem liniowy szablon Xcode dodany "self.collectionView! .RegisterClass" w viewDidLoad. Wtedy to działa. Ratujesz moje życie. - charles.cc.hsu


Możesz zadzwonić controller.view aby wymusić załadowanie widoku w celu zainicjowania IBOutletów, wtedy będzie można przypisać wartości.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "identifier") {
        let controller = segue.destinationViewController as! YourController
        let _ = controller.view //force to load the view to initialize the IBOutlets

        controller.your_IBOutlet_property = xxx
        ...
        controller.delegate = self
    }
}

6
2017-08-08 03:12





U mnie wystąpiło to, gdy przypadkowo zadeklarowałem swoją klasę kontrolera widoku jako

class XYZViewController: UINavigationController {
}

(tj. jako UINavigationController ani UIViewController).

Xcode nie odbiera tego błędu, klasa wydaje się dobrze budować i zastępować funkcje takie jak viewDidLoad, viewWillAppearitp. wszystkie działają poprawnie. Ale żaden z nich IBOutlets połącz się.

Zmiana deklaracji na

class XYZViewController: UIViewController {
}

naprawiłem to całkowicie.


6
2017-07-15 14:50



Wspaniały! Dzięki. W moim przypadku zapomniałem naprawić kod po usunięciu UINavigationController z Storyboard. - Vitaliy A


Stało się tak dla mnie, ponieważ przypadkowo utworzono mój kontroler widoku bezpośrednio, zamiast tworzyć go w scenorysie. Jeśli utworzysz instancję bezpośrednio przez MyViewController() wtedy gniazdka nie będą połączone.


5
2017-10-15 19:05