2011-02-15 28 views
21

Arabirim Oluşturucu aracılığıyla bir UIViewController'a bağlı bir UIView var. Bu görünümü çoğaltıp kullanabilmem için çoğaltılabilir, kopyalayabilir veya kopyalayabilir miyim?Kopyalama, kopyalama veya kopyalama UIView

+0

[Swift cevap] (http://stackoverflow.com/a/37050633/3681880) – Suragch

cevap

1

Elbette. Belgelerin bir good example of how to achieve that; UITableViewCell için, ama burada da kullanmak için iyi bir yaklaşım.

Görünümünüzün karmaşıklığına bağlı olarak, özel bir görünüm sınıfı haline getirebilir ve sahip olduğu tüm alt görünümler için ona kendi IBOutlet özelliklerini verebilirsiniz; Bu durumda, Interface Builder'daki görünümün “Sınıf Kimliği” ni bu sınıfa ayarlarsınız. Daha sonra, görünüm denetleyiciniz, Xpe yüklü herhangi bir görünümde bu görünümlere, örneğin, myLoadedView.someLabel, örneğin, [myLoadedView viewWithTag:3], daha önce belirtilmemiş belgelerin önerdiği gibi kullanmak yerine, erişebilir.

+2

UITableViewCell sadece yüklenene birkaç kez, asla klonlamadı. – geon

+1

Fark olan? –

+8

Tahminimce, @geon, bir çok parçanın arşivden çıkarılmasıyla yeni bir nesne yaratılırken, OP'nin ihtiyaçlarını çözdüğü gibi, sorunun başlığının ima ettiği problem için genel bir çözüm olarak hizmet etmediğini öne sürüyor. Bu, kodda oluşturulan bir UIView'in genel durumunda, örneğin, [UIView alloc] initWithFrame: aFrame]; ile çalışmaz. Cevap doğru ama soru başlığı yanıltıcı. – clozach

30

aşağıdaki kategori özellikle verimli, ama bir projede benim için çalıştı olmayabilir:

@implementation UIView (OPCloning) 

- (id) clone { 
    NSData *archivedViewData = [NSKeyedArchiver archivedDataWithRootObject: self]; 
    id clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedViewData]; 
    return clone; 
} 

@end 

Ben -kopyala veya -copyWithZone uygulayamaz ediyorum: Elma gelecekte bunu edebileceğiniz gibi. Not: Tüm görünümler arşivlemeyi aynı ölçüde uygulamıyor. NSView alt sınıflarınızın klonlanacak özel özellikleri için NSCoding yöntemlerini kesinlikle uygulamanız gerekecektir (aksi halde klonlanmış görünümde sıfırlanır). Özel klonlama kodunu yazmaktan daha kolay.

+1

Yine de, harici depolama alanına erişemediğinden, bir kereliğin tekrar tekrar yüklenmesinden daha verimli olmalıdır. – osxdirk

+0

Benim durumumda arşivleme ve arşivden arındırma, birlikte paketten (harici depolama) yükleme koltuğuna göre yaklaşık% 20-25 daha fazla zaman aldı. Yine de, loadNibNamed performansını iyileştirmenin yolunu arıyorum. –

+0

Klonlanmış görünümdeki görüntüler iOS 9'da çok yavaş yükleniyor. – Suresh

13

Burada kullanabileceğiniz yeni bir yöntemdir: Kullanım UIView metodu:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates 

Bu bir görünüm çizmek için en hızlı yoludur. iOS mevcuttur 7.

+1

Not: Bu, çok özel bir kullanım durumu için iyi bir çözüm olsa da, bu yöntem aslında orijinal ile aynı türde yeni bir görünüm oluşturmaz. Yalnızca bu anda görünümün görünüşüne benzeyen bir görünüm yaratır (örn. Görünümün bir "ekran görüntüsünü alır"), örneğin bir stand-in olarak kullanabilirsiniz. geçiş efektleri sırasında veya yeniden yükleme/yeniden görüntüleme sırasında. – uliwitness

2
Aşağıdaki Swift 3.0.1 ile deneyebilirsiniz

:

extension UIView{ 
func copyView() -> AnyObject{ 
    return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject 
} 
}