2011-02-15 11 views
21

मेरे पास एक UIView है जो इंटरफ़ेस बिल्डर के माध्यम से UIViewController से जुड़ा हुआ है। क्या इस दृश्य को डुप्लिकेट, क्लोन या कॉपी करना संभव है ताकि मैं इसे एक से अधिक बार उपयोग कर सकूं?डुप्लिकेट, क्लोन या प्रतिलिपि UIView

+0

[स्विफ्ट जवाब] (http://stackoverflow.com/a/37050633/3681880) – Suragch

उत्तर

1

निश्चित रूप से। प्रलेखन में good example of how to achieve that है; यह UITableViewCell के लिए है, लेकिन यहां भी उपयोग करने के लिए एक अच्छा तरीका है।

आपके विचार की जटिलता के आधार पर, आप इसे एक कस्टम व्यू क्लास बनाना चाहते हैं, और इसे अपने स्वयं के IBOutlet गुणों को जो भी सबव्यूव के लिए दे सकते हैं; उस स्थिति में, आप उस वर्ग में इंटरफ़ेस बिल्डर में दृश्य की "कक्षा पहचान" सेट करेंगे। फिर आपके व्यू कंट्रोलर किसी भी दिए गए XIB- लोड किए गए दृश्य पर उन दृश्यों तक पहुंच सकते हैं, उदाहरण के लिए, myLoadedView.someLabel, उदाहरण के लिए, उदाहरण के लिए, [myLoadedView viewWithTag:3] उपरोक्त दस्तावेज द्वारा सुझाए गए अनुसार।

+2

UITableViewCell केवल भरी हुई है कई बार, कभी क्लोन नहीं किया। – geon

+1

अंतर क्या है? –

+8

मेरा अनुमान है कि @geon यह सुझाव दे रहा है कि, कई बार एक निब अनारक्षित करके एक नई वस्तु बनाने के दौरान ओपी की ज़रूरतों को हल करने लगता है, यह समस्या के सामान्य समाधान के रूप में कार्य नहीं करता है जैसा कि प्रश्न के शीर्षक से निहित है। यह कोड में बनाए गए UIView के सामान्य मामले में काम नहीं करेगा, उदाहरण के लिए, '[UIView alloc] initWithFrame: aFrame]; '। जवाब सही है, लेकिन सवाल शीर्षक भ्रामक है। – clozach

30

निम्नलिखित श्रेणी विशेष रूप से प्रभावी नहीं हो सकता है, लेकिन एक परियोजना में मेरे लिए काम किया:

@implementation UIView (OPCloning) 

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

@end 

मैं -copy या -copyWithZone को लागू नहीं होगी: के रूप में एप्पल भविष्य में ऐसा हो सकता है। ध्यान दें, कि सभी विचार एक ही हद तक संग्रह को कार्यान्वित नहीं करते हैं। आपको निश्चित रूप से क्लोन होने के लिए अपने एनएसवी व्यूक्लास के कस्टम गुणों के लिए एनएससीओडींग विधियों को लागू करने की आवश्यकता होगी (अन्यथा क्लोन व्यू में शून्य हो जाएगी)। कस्टम क्लोनिंग कोड लिखने से अभी भी आसान है। उपयोग UIView की विधि:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates 

यह एक दृश्य आकर्षित करने के लिए सबसे तेज़ तरीका है

+1

यह बार-बार एक निब लोड करने से अधिक कुशल होना चाहिए क्योंकि यह बाह्य भंडारण तक नहीं पहुंचता है। – osxdirk

+0

मेरे मामले में संग्रहण और अनारक्षित एक साथ बंडल (बाहरी भंडारण) से निब लोड करने से लगभग 20-25% अधिक समय लगा। वैसे भी मैं अभी भी loadNibNamed प्रदर्शन को बेहतर बनाने के लिए रास्ता तलाश रहा हूं। –

+0

क्लोन व्यू में छवियां आईओएस 9 में बहुत धीमी गति से लोड हो रही हैं। – Suresh

13

यहाँ एक नई विधि का उपयोग कर सकते है। आईओएस में उपलब्ध है 7.

+1

नोट: हालांकि यह एक बहुत ही विशिष्ट उपयोग मामले के लिए एक अच्छा समाधान है, यह विधि वास्तव में मूल के समान प्रकार का एक नया दृश्य नहीं बनाती है। यह केवल एक ऐसा दृश्य बनाता है जो इस पल को देखने जैसा दिखता है (यानी यह "दृश्य का एक स्क्रीनशॉट" लेता है), जिसे आप स्टैंड-इन के रूप में उपयोग कर सकते हैं उदा। संक्रमण प्रभाव के दौरान या फिर पुनः लोड/दृश्यों को पुनर्निर्मित करते समय। – uliwitness

2

आप स्विफ्ट 3.0.1 नीचे के साथ की कोशिश कर सकते हैं:

extension UIView{ 
func copyView() -> AnyObject{ 
    return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject 
} 
} 
संबंधित मुद्दे