2009-07-07 10 views
21

वस्तु एनएसओब्जेक्ट से प्राप्त होती है।उद्देश्य सी में UIButton को डुप्लिकेट कैसे करें?

क्या इसकी एक प्रति नई वस्तु के रूप में बनाने की कोई विधि है?

+2

क्यों आप कोशिश कर रहे हैं UIButton की प्रतिलिपि बनाने के लिए? एक बेहतर रास्ता हो सकता है ... –

+3

क्या UIButton की प्रतिलिपि बनाने का कोई नकारात्मक पक्ष है? मुझे मौजूदा डेटा के आधार पर गतिशील रूप से नए बटन बनाने की आवश्यकता है। –

+0

आप बटन की एक पंक्ति बनाने, कहने के लिए एक बटन डुप्लिकेट करते हैं। @JamesSkidmore यहां पूरा कोड है http://stackoverflow.com/a/26438692/294884 – Fattie

उत्तर

63

UIButton NSCopying के अनुरूप नहीं है, तो आप -copy के माध्यम से एक प्रतिलिपि नहीं कर सकता।

हालांकि, यह एनएससीओडी के अनुरूप है, इसलिए आप वर्तमान उदाहरण को संग्रहित कर सकते हैं, फिर 'प्रतिलिपि' को अनारक्षित कर सकते हैं।

NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: button]; 
UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData]; 

बाद में, आप किसी भी अतिरिक्त गुण है कि आवश्यक के रूप में संग्रह (जैसे प्रतिनिधि) में खत्म किया नहीं कर रहे थे आवंटित करने के लिए होगा।

+6

चालाक! मैं शायद एक श्रेणी के माध्यम से बस कॉपी किया होगा, लेकिन यह बेहतर है। =) –

+0

महान विचार, जिम धन्यवाद! –

+2

क्या यह थोड़ा धीमा नहीं है? – mattsven

0

यदि यह NSCopying प्रोटोकॉल लागू करता है, तो -copy विधि को चाल चलानी चाहिए।

+0

मैं UIButton की प्रतिलिपि बनाने का प्रयास कर रहा हूं। कोई विचार? –

0

आप -copy विधि और यह एडीसी संदर्भ साइट पर उप-वस्तुओं के साथ कैसे काम करता है के बारे में अधिक जानकारी प्राप्त कर सकते हैं। स्टीफन डार्लिंगटन का उल्लेख है, आपको अपनी ऑब्जेक्ट में NSCopying प्रोटोकॉल को लागू करने की आवश्यकता है।

documentation

4

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

3

एक वर्ग

@implementation UIButton (NSCopying) 

- (id)copyWithZone:(NSZone *)zone { 
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self]; 
    UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData]; 
    return buttonCopy; 
} 

@end 

का उपयोग करके उपरोक्त जिम की जवाब देने के लिए जोड़ने के लिए, यदि आप एक बटन से दूसरे कार्यों के सभी नकल करना चाहता था, कुछ इस तरह जोड़ें:

for (id target in button.allTargets) { 
    NSArray *actions = [button actionsForTarget:target forControlEvent:UIControlEventTouchUpInside]; 
    for (NSString *action in actions) { 
     [newButton addTarget:target action:NSSelectorFromString(action) forControlEvents:UIControlEventTouchUpInside]; 
    } 
} 
संबंधित मुद्दे