Pergunta sobre uiviewcontroller, objective-c, clone, uiview, copy – Clone ou Copiar UIViewController ou UIView

12

UII precisa de cópia, auto controlador ou self.view, eu tentei:

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

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

O erro é:

    -[UIViewController mutableCopyWithZone:]: unrecognized selector sent to instance 0xb803490
    -[UIView copyWithZone:]: unrecognized selector sent to instance 0x6e0acb0
qual é a classe deself ? MyViewController ? Eu acho que não há cópia mutável deUIView eUIViewController Raptor

Sua resposta

3   a resposta
4

Infelizmente ainda não tenho permissão para comentar, mas a solução do rishi tem um problema: não copiaNSLayoutConstraints. Portanto, se alguma das suas visualizações estiver usando o autolayout, elas não serão copiadas. Eu estou escrevendo um mini-lib para resolver isso e vou postar no github quando terminar. Infelizmente, não encontrei uma solução pronta para uso em nenhum lugar.

//Editar

Desculpe, o que eu escrevi anteriormente não estava completamente correto. Eu fiz mais algumas pesquisas e verifica-se que, no padrão, oNSLayoutConstraints na exibição arquivada NÃO são salvos. Mas, você pode realmente especificar se deseja arquivar uma restrição definindoshouldBeArchived propriedade paraYES. Então, mesmo depois desse falsocopy, você retém as restrições corretas na exibição copiada.

30

Usar -

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

Similarmente -

NSData *tempArchiveViewController = [NSKeyedArchiver archivedDataWithRootObject:self];
UIViewController *controller = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveViewController];
Não obtém tudo como gestos personalizados, etc. jjxtra
Hmm não conseguiu o meu UIImageView que eu tinha como sub-view da view que eu estava clonando. Carl Hine
5

Para um objeto ser copiável, ele deve implementarNSCopying protocolo queUIView classe nemUIViewController classe não.

Se você quiser copiar uma visão, tenho certeza que você está fazendo algo errado. A cópia deve ser substituída por reutilizávelUIView assim como emUITableView usandodequeueReusableCellWithIdentifier: método.

Copiar o controlador de visualização é definitivamente um anti-padrão. Se você quiser uma cópia exata do controlador de visualização que já possui, crie uma nova instância com os mesmos parâmetros que a atual.

Embora a resposta de Rishi tenha funcionado para mim também, mas criar novas instâncias provou ser uma solução mais confiável para o meu problema. Obrigado! Myxtic

Perguntas relacionadas