2011-04-25 21 views
11

के लिए अपना स्वयं का ईवेंट "प्रेषित ईवेंट" में जोड़ें, मैंने UIView का उप-वर्ग बनाया है और मैं इसे इंटरफ़ेस बिल्डर (वास्तव में Xcode4) में दिखाए गए कस्टम ईवेंट प्रकाशित करना चाहता हूं जिस तरह से यूआईबटन की तरह नियंत्रण होता है, जब आप एक्सकोड 4 डिजाइनर में नियंत्रण पर राइट क्लिक करते हैं तो "भेजे गए ईवेंट" क्षेत्र में ईवेंट का एक समूह होता है। मुझे पता है कि मैं कुछ कस्टम चीजें होने पर वस्तुओं को अपने कस्टम व्यू का उपयोग करने के लिए डिलीगेशन (प्रोटोकॉल के माध्यम से) या अधिसूचना (यूआईएनओटीफिकेशन सेंटर के माध्यम से) का उपयोग कर सकता हूं, लेकिन मैं जानना चाहूंगा कि "लक्ष्य-क्रिया तंत्र" (जिसमें वर्णित है) कोको फंडामेंटल गाइड) एक्सकोड डिजाइनर के साथ उपयोग करने और एकीकृत करने के लिए उचित/वांछनीय/संभव है। ज्यादातर .NET पृष्ठभूमि से आ रहा है, यह दृष्टिकोण .NET ईवेंट मॉडल से निकटता से संबंधित प्रतीत होता है और मुझे सबसे अधिक समझ में आता है।इंटरफ़ेस बिल्डर मेनू में अपने स्वयं के कस्टम UIView

उत्तर

5

UIControlEventApplicationReserved है, जो आपको इवेंट पहचानकर्ताओं की एक श्रृंखला देता है जो आपका ऐप उपयोग कर सकता है। हालांकि, मुझे नहीं लगता कि इंटरफ़ेस बिल्डर को एप्लिकेशन-परिभाषित घटनाओं के बारे में बताने का कोई तरीका है, इसलिए आपको आईआईसीओन्ट्रोल की मानक घटनाओं के लिए आईबी में अपनी घटनाओं के लिए समान समर्थन नहीं मिलेगा। इसके बजाय, आपको कोड में प्रत्येक ऐप-परिभाषित ईवेंट के लिए लक्ष्य और कार्रवाई निर्दिष्ट करनी होगी। (कृपया, अगर मैं इस बिंदु पर गलत हूं तो कोई मुझे सही करेगा।) यह बिल्कुल मुश्किल नहीं है, लेकिन यह थोड़ा अलग है।

+0

आह, ठीक है। "लक्ष्य" प्रदान करने के लिए केवल एक प्रतिनिधि स्थापित करने से बहुत गड़बड़ लगती है, हालांकि मुझे लगता है कि मैं अपने कस्टम UIView को एनएसओब्जेक्ट के रूप में (संपत्ति या विधि के माध्यम से) ले सकता हूं, इसलिए मेरे विचार में हेडर शामिल नहीं होंगे उन ऑब्जेक्ट्स के लिए जो ऐप पदानुक्रम में ऊपर बैठते हैं और कसकर युग्मित होते हैं। मेरा अनुमान है कि डिजाइनर में कनेक्शन करते समय ऐसा होता है, इसलिए शायद यह वही बात है। ऐसा लगता है कि मानक या शायद, पसंदीदा तरीका केवल प्रतिनिधिमंडल का उपयोग करना है। मुझे उपर्युक्त "लक्ष्य-क्रिया तंत्र" पर अधिक जानकारी नहीं मिली। – dreyln

+0

वे बहुत समान विचार हैं। एक व्यू कंट्रोलर अक्सर विचारों और नियंत्रणों के लिए लक्ष्य और/या प्रतिनिधि होता है जो यह प्रबंधित करता है। उस स्थिति में, यह केवल 'स्वयं' को लक्ष्य के रूप में पारित करेगा और इसके चयनकर्ताओं में से एक को 'कॉल-टार्गेट: एक्शन: फॉर कंट्रोल इवेंट्स' के लिए कॉल में कार्रवाई के रूप में पास किया जाएगा। – Caleb

3

ऐसा करने का एक आसान तरीका के बजाय UIControl का विस्तार करना है, यह आपको सभी डिफ़ॉल्ट घटनाओं (UIButton आदि के रूप में) को लक्षित करने की अनुमति देगा।

नोट: मेरे कस्टम UIControl के लिए घटनाओं को संभालने के लिए मैंने इसके शीर्ष पर रखे गए नियंत्रणों के विपरीत मुझे यह सुनिश्चित करना था कि userInteractionEnabled = NO सभी स्तरित नियंत्रणों पर सेट किया गया था।

1

आप इसे आईबीओटलेट कोलेक्शन का उपयोग करके कर सकते हैं। इस दृष्टिकोण का लाभ यह है कि आप इंटरफ़ेस बिल्डर में ऑब्जेक्ट्स को लिंक कर सकते हैं। नकारात्मकता यह है कि आप सीधे आईबीएक्शन (जैसे यूआईसींट्रोल) से लिंक नहीं कर सकते हैं। यहाँ एक साफ एक प्रोटोकॉल का उपयोग कर दिया गया है:

ObserverProtocol.h

@protocol ObserverProtocol <NSObject> 
- (void)observedObjectChanged:(id)sender; 
@end 

MyObject.h

@interface MyObject : NSObject 
{ 
@private 
    IBOutletCollection(id<ObserverProtocol>) NSArray *observers; 
} 
- (void)objectChanged; 

MyObject.m

@implementation MyObject 

- (void)objectChanged 
{ 
    for (id<ObserverProtocol> observer in observers) 
    { 
     if ([observer respondsToSelector:@selector(observedObjectChanged:)]) 
     { 
      [observer observedObjectChanged:self]; 
     } 
    } 
} 

@end 

तो फिर तुम सिर्फ ObserverProtocol लागू करने की आवश्यकता कक्षाओं में आप घटना का निरीक्षण करना चाहते हैं (और पाठ्यक्रम के इंटरफ़ेस बिल्डर में बाध्यकारी करने के लिए)।

संबंधित मुद्दे