2013-03-14 16 views
5

(zrzut ekranu poniżej pomaga wyjaśnić, co próbuję zrobić)Jak mogę klonować/duplikować UIView na iOS?

Ideą jest to, że mam UIView, z różnymi UI elementów wewnątrz, na przykład, powiedzmy, że mam UIView, a wewnątrz nie my mieć UILabel.

Teraz chcę zduplikować UIView (z etykietą w środku), ale po tym, być może muszę dokonać zmiany etykiety, np. zmień właściwość tekstu.

Powodem, dla którego potrzebuję czegoś takiego, jest to, że mogę uporządkować UIView, wszystko, czego potrzebuję, wygląda ładnie, ale w rzeczywistości ma inne dane z różnymi kopiami.

Nie jestem pewien, czy to najlepsze podejście, ale jest to jedyne, z którym mogłem wymyślić. Jeśli ktoś ma jakieś pomysły, jak to zrobić, lub jakieś pomysły na lepsze podejście, naprawdę to doceniam. Dużo! Screenshot to make it easier to understand

Odpowiedz

6

Jest to bardzo naturalna i przydatna rzecz do zrobienia. To, czego szukasz, to kontroler widoku kontenera. Umieść swoją "komórkę" wielokrotnego użytku we własnym kontrolerze widoku i własnym pliku końcówki. Następnie w kontrolerze nadrzędnego rodzica, użyj addChildViewController:, aby dodać tyle z nich, ile chcesz, i skonfiguruj każdy z nich. Każdy z nich może mieć własne IBOutlety, których można użyć do modyfikowania zawartości.

Jest to bardzo podobne do wzorca używanego przez UITableView i UITableViewCell (nie używa ono "kontrolek widoku potomnego", ale używa tego wzorca).

Aby uzyskać szczegółowe informacje, patrz "Creating Custom Container View Controllers" w Podręczniku programowania kontrolera View systemu iOS.

Należy zauważyć, że Storyboard zawiera "Widok kontenera" jako opcję w szablonach obiektów, aby było jeszcze łatwiej.

Jeśli chcesz uzyskać dostęp na niższym poziomie, możesz to zrobić ręcznie przy użyciu UINib, aby załadować plik nib i podłączyć jego gniazda (i tak to robiliśmy przed iOS 5), ale dzisiaj użyłbym kontrolki widoku dziecka.

+0

To genialne! Myślę, że to jest rozwiązanie! : D –

+1

Z perspektywy projektowania, jeśli jest to komórka z etykietą, posiadanie osobnego kontrolera widoku dla niej brzmi prawie jak przesada (prawdopodobnie dlatego UITableView tego nie robi) –

+1

Myślę, że dla produktu końcowego rozwijam się, będzie trochę więcej niż "UILabel". Być może będę potrzebował ich kilku i "UIImage", może jednej lub dwóch rzeczy. –

7

Osobiście uważam, że najlepszą odpowiedzią jest utworzenie każdego widoku osobno i skonfigurowanie go w razie potrzeby. Można utworzyć metodę, która po prostu konfiguruje nowe interfejsy UIView, aby wyglądały tak samo i przekazywały każdy widok za jego pośrednictwem.

Jednakże, jeśli naprawdę trzeba skopiować UIView, można je archiwizować, a następnie Zdezarchiwizuj go:

id copyOfView = 
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]]; 
UIView *myView = (UIView *)copyOfView; 
[self.view addSubview:myView]; 

Jeśli masz kilka z nich, upewnij się, że używasz instrumentów czasu profilera sprawdzić efektywność rysunku.

+0

Dzięki za to! Wydaje się to całkiem fajnym sposobem na zrobienie tego, więc żeby było jasne, co mówisz, to tworzę (i skonfiguruję) mój widok, zarchiwizuję go, a potem go zarchiwizuję? Czy mógłbyś też powiązać mnie z zasobem lub pomóc mi z jakimś kodem, jeśli chodzi o archiwizowanie widoku? –

+0

Powyższy kod wykonuje zarówno archiwum, jak i archiwum. Zwróć uwagę na użycie "NSKeyedArchiver" i "NSKeyedUnarchiver" w tej samej linii. Jest to kanoniczny sposób na wykonanie głębokiej kopii dowolnego archiwizowanego obiektu. –

+0

Ahh Widzę, tak, teraz ma to dużo więcej sensu! –

0

Jeśli masz tylko jedną etykietę w środku, oczywistym rozwiązaniem jest posiadanie niestandardowej podklasy UIView z tą etykietą dodaną jako podgląd. Za każdym razem, gdy potrzebujesz nowego widoku, tworzysz instancję niestandardowej podklasy i ustawiasz tekst etykiety. Jeśli masz wiele rzeczy do ustawienia, niektóre z nich są wspólne dla wszystkich twoich niestandardowych widoków podklas, możesz użyć prototypowego wzorca projektowego, to całkiem proste do wdrożenia.

+0

Ahh cool! Tak, to brzmi jak świetny sposób robienia tego. Nie myślałem o tym (wciąż nowość w całym systemie iOS) Myślę, że spróbuję. –

Powiązane problemy