Na złożonych ekranach (kontrolery widoku) zwykłem rozdzielać całość na mniejsze części (nazywam je widżetami). Te widżety składają się zasadniczo z pliku MyWidget.h
i MyWidget.m
pliku, a także MyWidget.xib
pliku, w którym elementem głównym jest element a, UIView
a klasa MyWidget jest właścicielem pliku UIView. W inicjalizacji tego widżetu wykonuję plik loadNibNamed
.
W moim kontrolerze widoku wykonuję następnie polecenie [[MyWidget alloc] init]
, które dodaję do widoku głównego kontrolera widoku jako widok podrzędny. Jak dotąd działa to doskonale.
Zastanawiam się teraz, jak zrobić to samo z storyboardem, ponieważ naprawdę nie mogę UIView
gdzieś zacząć przeciągać , zawsze muszę zacząć od tego UIViewController
, czego nie chcę.
Jeśli nie ma możliwości zrobienia tego za pomocą Storyboardu, czy mogę po prostu zrobić to w stary sposób, używając Storyboard dla moich głównych ekranów i segue, i użyć oddzielnego pliku .xib do zdefiniowania niestandardowych widoków?
źródło
xib
osobne pliki dla kontrolerów widoku, a nie w serii ujęć?Odpowiedzi:
Umieszczenie widżetu / widoku w oddzielnym pliku .xib działa i jest odpowiednie, zwłaszcza jeśli chcesz odwoływać się do tego samego widoku z wielu kontrolerów widoku.
Czasami jednak chcesz zobaczyć dodatkowy widok / widżet w tej samej serii ujęć i jest to możliwe. Oto jak to robisz:
Wybierz kontroler widoku w IB (kliknij czarny pasek poniżej widoku), a następnie przeciągnij UIView z biblioteki obiektów na czarny pasek:
Gdy widok znajduje się na czarnym pasku, jest tworzony jak każdy inny widok w IB, ale nie jest dodawany do hierarchii widoku, dopóki nie zrobisz tego w kodzie. W razie potrzeby zmień klasę widoku, aby pasowała do Twojej własnej podklasy:
Możesz podłączyć go do kontrolera widoku, tak jak podłączasz każdy inny widok:
Dodany widok pojawi się w konspekcie dokumentu i możesz tam również podłączyć akcje i odniesienia:
Problem, który pozostaje, polega na tym, że w rzeczywistości nie możesz zobaczyć widoku bez względu na to, ile razy spróbujesz kliknąć lub dwukrotnie kliknąć, co zniweczyłoby cały cel umieszczenia go w tej samej planszy. Na szczęście znam dwa sposoby obejścia tego problemu.
Pierwszym rozwiązaniem jest przeciągnięcie widoku z czarnego paska z powrotem do widoku kontrolera widoku, edytowanie go, a po zakończeniu przeciągnięcie z powrotem do czarnego paska. Jest to kłopotliwe, ale niezawodne.
Drugie obejście jest bardziej skomplikowane, ale wolę je, ponieważ pozwala mi zobaczyć wszystkie moje widoki w tym samym czasie:
Przeciągnij UITableView z biblioteki obiektów do nowo dodanego widoku.
Następnie przeciągnij UITableViewCell do tego UITableView.
Gdy to zrobisz, twój widok wyskakuje magicznie z boku, ale masz UITableView, którego nie chcesz. Możesz zmienić rozmiar tego na 0x0 lub możesz go usunąć, a Twój UIView (zwykle) nadal będzie widoczny.
Czasami widok wtórny będzie ponownie ukrywany w IB. Możesz powtórzyć powyższe kroki, jeśli usunąłeś UITableView lub jeśli UITableView nadal znajduje się w hierarchii, wystarczy kliknąć UITableViewCell, a widok pojawi się ponownie.
Druga metoda działa dla UIViews, ale nie tak dobrze dla UIToolbars i jest niemożliwa dla UIButtons, więc najczystszym rozwiązaniem, jakie znalazłem, gdy trzeba uwzględnić wiele różnych podglądów podrzędnych, jest dołączenie pojedynczego pomocniczego UIView do kontrolera widoku jako kontenera, który nigdy nie jest pokazywany, umieść tam wszystkie swoje widoki dodatkowe i użyj sztuczki UITableViewCell, aby wszystko było widoczne. Zmieniam rozmiar mojego atrapy UITableView na 0x0, aby uczynić go niewidocznym. Oto zrzut ekranu pokazujący, jak to wszystko wygląda razem:
źródło
Jeśli chcesz, aby twoje kontrolery widoku były inne (a nie na twojej tablicy scenariuszy), jest to całkiem prosty sposób:
1) Utwórz swoje
CustomViewController
adresy (abcdController
w kodzie, który próbowałem) z ich indywidualnymixib
adresami, jak zwykle.2) Dodaj
UIViewController
(lub cokolwiek było twoją superklasąCustomViewController
) do planszy.3) Ustaw CustomClass
CustomViewController
zamiast,UIViewController
jak pokazano tutaj:4) Na koniec
viewDidLoad
wczytaj niestandardowyxib
i gotowe.źródło
loadNibNamed
w tym przypadku ... XOMyślę, że możesz zrobić coś takiego, aby uzyskać wystąpienie określonego kontrolera widoku ze Storyboard i użyć widoku na nim.
Mam nadzieję że to pomoże
Dzięki Vijay
źródło