Pytanie w sprawie copy, uiviewcontroller, uiview, objective-c, clone – Klonuj lub skopiuj UIViewController lub UIView

12

Potrzebuję kopii, samokontroli lub podglądu, próbowałem:

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
jaka jest klasaself ? MyViewController ? Myślę, że nie ma mutacyjnej kopiiUIView iUIViewController Raptor

Twoja odpowiedź

3   odpowiedź
5

NSCopying protokół, któryUIView klasa aniUIViewController klasa nie.

Jeśli chcesz skopiować widok, jestem pewien, że robisz coś złego. Kopiowanie należy zastąpić wielokrotnego użytkuUIView tak jak wUITableView za pomocądequeueReusableCellWithIdentifier: metoda.

Kopiowanie kontrolera widoku jest zdecydowanie przeciwstawne. Jeśli chcesz mieć dokładną kopię kontrolera widoku, który już masz - utwórz nową instancję tego samego parametru, który jest obecny.

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

Posługiwać się -

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

Podobnie -

NSData *tempArchiveViewController = [NSKeyedArchiver archivedDataWithRootObject:self];
UIViewController *controller = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveViewController];
Nie dostaje wszystkiego, takiego jak niestandardowe gesty itp. jjxtra
Hmm nie dostałem mojego UIImageView Miałem jako podglądzie widoku, który klonowałem. Carl Hine
4

ale rozwiązanie rysziego ma jeden problem: nie kopiuje sięNSLayoutConstraints. Więc jeśli któryś z twoich widoków korzysta z autolayout, nie zostaną one skopiowane. Piszę mini-bibliotekę, aby to rozwiązać i po zakończeniu opublikuję ją w githubie. Niestety, nie znalazłem nigdzie gotowego rozwiązania.

//Edytować

Niestety, to, co napisałem wcześniej, nie było całkowicie poprawne. Zrobiłem więcej badań i okazało się, że domyślnieNSLayoutConstraints w zarchiwizowanym widoku NIE są zapisywane. Ale możesz określić, czy chcesz zarchiwizować ograniczenie, ustawiając jegoshouldBeArchived własność doYES. Potem, nawet po tym fałszywymcopy, zachowujesz odpowiednie ograniczenia w skopiowanym widoku.

Powiązane pytania