w iOS6 zauważyłem nowy widok kontenera, ale nie jestem pewien, jak uzyskać dostęp do jego kontrolera z widoku zawierającego.
Scenariusz:
Chcę uzyskać dostęp do etykiet w kontrolerze widoku Alert z kontrolera widoku, w którym znajduje się widok kontenera.
Jest między nimi podział, czy mogę tego użyć?
ios
objective-c
swift
uiviewcontroller
uicontainerview
Adam Waite
źródło
źródło
Odpowiedzi:
Tak, możesz użyć segue, aby uzyskać dostęp do kontrolera widoku potomnego (oraz jego widoku i widoków podrzędnych). Nadaj segue identyfikator (np.
alertview_embed
), Używając Inspektora atrybutów w Storyboard. Następnie poproś kontroler widoku nadrzędnego (ten zawierający widok kontenera) zaimplementuj następującą metodę:źródło
Możesz to zrobić po prostu
self.childViewControllers.lastObject
(zakładając, że masz tylko jedno dziecko, w przeciwnym razie użyjobjectAtIndex:
).źródło
childViewControllers
do szybkiego programowania
możesz tak pisać
źródło
prepareForSegue
Podejście działa, ale opiera się na magicznej ciąg identyfikatora segue. Może jest lepszy sposób.Jeśli znasz klasę VC, której szukasz, możesz to zrobić bardzo starannie za pomocą obliczonej właściwości:
To zależy od
childViewControllers
. Chociaż zgadzam się, że oparcie się na pierwszym może być kruche, nazwanie poszukiwanej klasy sprawia, że wydaje się to dość solidne.źródło
return childViewControllers.filter { $0 is CamperVanViewController }.first
w jednej linijcechildViewControllers.flatMap({ $0 as? CamperVanViewController }).first
co moim zdaniem jest trochę lepsze, ponieważ rzuca i pozbywa się zera.first(where:)
.childViewControllers.first(where: { $0 is CamperVanViewController })
Zaktualizowana odpowiedź dla Swift 3, wykorzystująca obliczoną właściwość:
Spowoduje to tylko iterację listy dzieci, aż do osiągnięcia pierwszego dopasowania.
źródło
self.childViewControllers
jest bardziej odpowiedni, gdy potrzebujesz kontroli od rodzica. Na przykład, jeśli kontroler podrzędny jest widokiem tabeli i chcesz go przeładować w sposób wymuszony lub zmienić właściwość za pomocą przycisku przycisku lub dowolnego innego zdarzenia w kontrolerze nadrzędnym, możesz to zrobić, uzyskując dostęp do instancji ChildViewController, a nie za pośrednictwem preparForSegue. Oba mają swoje zastosowania na różne sposoby.źródło
Istnieje inny sposób użycia instrukcji switch Swift na typ kontrolera widoku:
źródło
Używam Code jak:
źródło
Jeśli ktoś szuka Swift 3.0 ,
viewController1 , viewController2 itd. będą wówczas dostępne.
źródło
Za pomocą generic możesz robić słodkie rzeczy. Oto rozszerzenie Array:
Następnie możesz to zrobić w swoim viewController:
źródło
możesz tak pisać
źródło