2009-05-25 13 views
6

के लिए ईवेंट मेरे UIView सबक्लास के लिए ईवेंट पंजीकृत करने का सबसे अच्छा तरीका क्या है, ताकि मैं उन्हें इंटरफ़ेस बिल्डर में IBAction-s से कनेक्ट कर सकूं?कस्टम UIView

वर्तमान में मुझे अभी मेरे मानक दृश्य पर एक मानक UIView गिरा दिया गया है और मैंने कक्षा को "रेडियोडिअल" (मेरी कस्टम क्लास) में सेट कर दिया है। यह दृश्य को ठीक दिखाता है, लेकिन मुझे नहीं पता कि इससे घटनाएं कैसे प्राप्त करें।

धन्यवाद

उत्तर

5

कृपया स्पष्ट करें: क्या आपका मतलब यह है कि आप इंटरफ़ेस बिल्डर को अपने दृश्य नियंत्रकों को कस्टम ईवेंट को तारित करने के लिए ऑफ़र करना चाहते हैं, जो आपके व्यू सबक्लास उत्सर्जित हो जाएंगे (बटन नियंत्रणों की तरह आप टच इनसाइड को तार करने की इजाजत देते हैं)?

यदि आपको इस प्रकार की कार्यक्षमता की आवश्यकता है, तो आपको प्रोटोकॉल के साथ संयुक्त दृश्य पर एक सामान्यीकृत 'प्रतिनिधि' संपत्ति का उपयोग करने की आवश्यकता होगी।

@protocol RadioDialDelegate 
-(void)dialValueChanged:(id)sender 
@end 

@interface RadioDial 
{ 
    id<RadioDialDelegate> radioDelegate; 
} 
@property (nonatomic, assign) IBOutlet id<RadioDialDelegate> radioDelegate; 

इस नियंत्रक को देखने के लिए ऊपर तार (यह मानते हुए यह RadioDialDelegate लागू करता है) और किसी भी घटनाओं उस दृश्य से बाहर आने के प्राप्त करने के लिए अनुमति देगा। वैकल्पिक रूप से, आप एक untyped प्रतिनिधि का उपयोग कर सकते हैं और अपने व्यू कोड में, देर से बाध्य कॉल का उपयोग करें:

if([radioDelegate respondsToSelector:@selector(dialValueChanged:)]) { 
    [radioDelegate dialValueChanged:self]; 
} 
+0

हां, यही मेरा मतलब है। और मेरी समस्या यह है कि मेरे दृश्य उपclass के लिए उन कस्टम घटनाओं को बना रहा है। वास्तव में क्या हो रहा है कि कक्षाओं में (शून्य) स्पर्श छूटे कुछ स्थितियों के तहत मैं आग और घटना करना चाहता हूं और मैं चाहता हूं कि वह घटना आईबी के माध्यम से आईबीएक्शन के लिए कनेक्ट करने योग्य हो। –

+0

मैंने यह जवाब देने के लिए अपना जवाब संपादित किया है कि यह कैसे करें। ऐसा करने के लिए आपको प्रतिनिधि/प्रोटोकॉल पैटर्न का उपयोग करने की आवश्यकता होगी। आईबी प्रतिनिधि को आपके कंट्रोलर को सौंपा गया एक संपत्ति के रूप में उजागर करेगा (आपको आईबी में अपने कंट्रोलर क्लास को ठीक से सेट करने की भी आवश्यकता होगी), और आपके नियंत्रक को प्रोटोकॉल को लागू करने की आवश्यकता होगी। – Jason

+0

इस तरह का अर्थ समझता है (पूरे उद्देश्य-सी/कोको चीज के लिए बिल्कुल नया), लेकिन यह मुझे प्रत्येक रेडियोडिअल के मूल्य परिवर्तन घटना को दृश्य नियंत्रक पर एक अलग विधि में कैसे तारित करने की अनुमति देगा? मैं समझता हूं कि मैं एक ही विधि का उपयोग कर सकता हूं और प्रेषक संदर्भ पर जांच कर सकता हूं, लेकिन क्या यह एकमात्र तरीका है? –

3

आपके विचार नियंत्रक में एक विधि बनाएं (यदि और कुछ नहीं, आप एक RootViewController होना चाहिए आप में परियोजना)। मान लें कि आपका विधि

-(void) buttonClicked { code code code } 

नियंत्रक के हेडर फाइल (उदाहरण के लिए RootViewController.h) में आप तो डाल है करते हैं:

-(IBAction) buttonClicked; 

और आईबी में आप अपने बटन/रेडियो डायल/जो कुछ भी राइट क्लिक करें। आप घटनाओं की एक सूची देखेंगे और आप उस नियंत्रक से खींच सकते हैं, जिसे आप अपने नियंत्रक को प्राप्त करना चाहते हैं, आईबी में ऑब्जेक्ट को जो नियंत्रक का प्रतिनिधित्व करता है (संभवत: पहला उत्तरदाता)। यह इस बात पर निर्भर करता है कि आपकी आईबी संरचना कैसे स्थापित की जाती है, लेकिन यह सीधा होना चाहिए।

एक और विकल्प यह जानने के लिए है कि प्रोग्रामिंग के रूप में UIViews कैसे बनाएं, और समय के लिए आईबी के बारे में भूल जाएं। राय इस बारे में विभाजित हैं कि शुरुआत में आईबी का उपयोग करना सीखना बेहतर है या फिर कोड में सबकुछ कैसे करना है और बाद में आईबी को सहेजना सीखना बेहतर है या नहीं। किसी भी मामले में, किसी बिंदु पर एक इंटरफ़ेस स्थापित करने के दोनों तरीकों को सीखना आवश्यक है।