2012-05-16 14 views
12

UII kopyasını, kendini denetleyici veya self.view ihtiyaç i denedim:Klon veya Kopyala UIViewController veya UIView

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

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

hatadır: Bir nesne için

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

'self' sınıfı nedir? 'MyViewController'? Rishi'nin cevabı benim için de işe yaradıysa da, UIView ve UIViewController' – Raptor

cevap

30

Kullanımı - Aynı şekilde

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

-

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

Özel hareketler, vb. Gibi her şeyi alamıyor. – jjxtra

+0

Hmm UIImageView'umu almadım Klonlama yaptığım görünümün alt görünümünde bulundum. –

5

o olmalı copyable olmak UIView sınıfı veya UIViewController sınıfının uygulanmadığı NSCopying protokolünü uygulayın.

Bir görünümü kopyalamak isterseniz, yanlış bir şey yaptığınızdan eminim. Kopyalama, dequeueReusableCellWithIdentifier: yöntemini kullanarak UIView gibi tekrar kullanılabilir.

Görüntü denetleyicisini kopyalamak kesinlikle bir desen karşıtıdır. Zaten sahip olduğunuz görünüm denetleyicisinin tam kopyasını istiyorsanız - geçerli olanla aynı parametrelere sahip yeni bir örneği oluşturun.

+1

'un değiştirilemez bir kopyası bulunmadığını düşünüyorum, ancak yeni örnekler oluşturmak benim sorunum için daha güvenilir bir çözüm olduğunu kanıtladı. Teşekkürler! – Myxtic

4

Ne yazık ki henüz yorum yapmak hakkım yok ama Rishi çözümü bir sorun vardır: NSLayoutConstraint s kopyalamaz. Dolayısıyla, görüntülemelerinizden herhangi biri otomatik yayın kullanıyorsa, bunlar kopyalanmayacaktır. Bunu çözmek için bir mini-lib yazıyorum ve bittiğinde github'a göndereceğim. Ne yazık ki, herhangi bir yerde kullanıma hazır bir çözüm bulamadım. Daha önce yazdıklarımı

Maalesef

// Düzenleme tamamen doğru değildi. Daha fazla araştırma yaptım ve varsayılan olarak, arşivlenen görünümde NSLayoutConstraint s KAYDEDİLDİ. Ancak, shouldBeArchived özelliğini YES olarak ayarlayarak bir kısıtlamayı arşivlemek isteyip istemediğinizi belirtebilirsiniz. Daha sonra, bu sahte copy'dan sonra bile, kopyalanan görünümde doğru kısıtlamaları korursunuz.