2012-05-16 10 views
12

UII trzeba kopiować, kontroler samodzielne lub self.view, próbowałem:Clone lub Kopiuj UIViewController lub UIView

UIView* viewOfSelf =[self.view copy]; 
UIViewController* controller = [self copy]; 

UIView* viewOfSelf =[self.view mutableCopy]; 
UIViewController* controller = [self mutableCopy]; 

Błąd jest:

-[UIViewController mutableCopyWithZone:]: unrecognized selector sent to instance 0xb803490 
    -[UIView copyWithZone:]: unrecognized selector sent to instance 0x6e0acb0 
+0

jaka jest klasa "ja"? 'MyViewController'? Wydaje mi się, że nie ma żadnej zmiennej kopii "UIView" i "UIViewController" – Raptor

Odpowiedz

30

Wykorzystanie -

NSData *tempArchiveView = [NSKeyedArchiver archivedDataWithRootObject:self.view]; 
UIView *viewOfSelf = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveView]; 

Podobnie -

NSData *tempArchiveViewController = [NSKeyedArchiver archivedDataWithRootObject:self]; 
UIViewController *controller = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveViewController]; 
+2

Nie otrzymuje wszystkich informacji, takich jak niestandardowe gesty itp. – jjxtra

+0

Hmm nie dostałem mojego UIImageView miałem jako wyeksponowanie widoku, który klonowałem. –

5

Do obiektu będzie copyable musi on implementuj protokół NSCopying, którego klasa UIView ani klasa UIViewController nie.

Jeśli chcesz skopiować widok, jestem pewien, że robisz coś nie tak. Kopiowanie powinno być zastąpione przez wielokrotnego użytku UIView podobnie jak w UITableView przy użyciu metody dequeueReusableCellWithIdentifier:.

Kopiowanie kontrolera widoku jest zdecydowanie szablonem. Jeśli chcesz mieć dokładną kopię kontrolera widoku, który już masz - utwórz jego nową instancję z tymi samymi parametrami, co bieżący.

+1

. Chociaż odpowiedź Rishiego również zadziałała, ale tworzenie nowych instancji okazało się bardziej niezawodnym rozwiązaniem dla mojego problemu. Dzięki! – Myxtic

4

Niestety ja jeszcze nie może komentować, ale rozwiązanie Rishi zawiera jeden problem: to nie kopiuje NSLayoutConstraint s. Więc jeśli któryś z twoich poglądów korzysta z autolayout, nie zostaną one skopiowane. Piszę mini-lib, aby rozwiązać ten problem i po jego zakończeniu opublikuję go na githubie. Niestety, nie znalazłem nigdzie gotowego rozwiązania.

// Edit

Niestety, co napisałem wcześniej nie było całkowicie poprawne. Zrobiłem trochę więcej badań i okazało się, że domyślnie NSLayoutConstraint s w zarchiwizowanym widoku NIE są zapisywane. Ale możesz określić, czy chcesz zarchiwizować ograniczenie, ustawiając jego właściwość shouldBeArchived na YES. Następnie, nawet po tym fałszywym copy, zachowujesz odpowiednie ograniczenia w skopiowanym widoku.