2012-04-11 16 views
10

एक दृश्य पर UIGestureRecognizer को जोड़ने और निकालने का सही तरीका क्या है?UIGestureRecognizers को जोड़ने/हटाने का सही तरीका

मैं आमतौर पर -viewDidLoad में UIGestureReconizers को बना और संलग्न करता हूं। क्या मैं का उपयोग -viewDidUnload में करूँगा? या वे स्वचालित रूप से हटा दिए जाते हैं?

उदाहरण के लिए यह एक UIGestureRecognizer संपत्ति बनाने के लिए और यह ViewController के init विधि में प्रारंभ और उसके बाद देते हैं/निकालें -viewDidAppear/-viewDidDisappear में इस gestureRecognizer संपत्ति एक बेहतर तरीका है?

(नोट मैं एआरसी का उपयोग कर रहा हूं)

धन्यवाद।

+0

मैं पहले से ही उस के माध्यम से स्किम किया है लेकिन मेरे प्रश्न का उत्तर नहीं मिला। – mrd3650

+0

@TheLion: "क्षमा करें, वह पृष्ठ नहीं मिला।" – Colas

+0

क्षमा करें सेब ने इसे बदल दिया है [यहां] [https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html) यह एक ही संसाधन के लिए नया यूआरएल है। इसे उत्तर देने के लिए धन्यवाद @ कोला –

उत्तर

10

अनिवार्य रूप से जब आप समझ में आता है तो आप इशारा पहचानकर्ता बना सकते हैं, जोड़ सकते हैं और निकाल सकते हैं। और "जब यह समझ में आता है" कुछ चीजों के आधार पर भिन्न होता है, लेकिन आम तौर पर केवल यह कि आप उन्हें इवर के रूप में रखेंगे या नहीं। ARC के साथ कुंजी मजबूत संदर्भों का प्रबंधन कर रही है; ARC ivars डिफ़ॉल्ट रूप से मजबूत हैं।

तो मान लें कि आप एक टैप पहचानकर्ता जोड़ते हैं। इस परिदृश्य में आपको फिर से पहचानकर्ता तक पहुंचने की आवश्यकता नहीं है। मैं इसे इस तरह बनाउंगा:

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
    [self.view addGestureRecognizer:tap]; 
} 

इस परिदृश्य के साथ, आपको इस पहचानकर्ता को प्रबंधित करने के लिए और कुछ नहीं करने की आवश्यकता है। दृश्य प्रणाली इसके लिए मजबूत संदर्भ रख रही है। आप बस इतना बैठते हैं और handleTap: पर कॉल करने के लिए प्रतीक्षा करें। जब दृश्य अनलोड करता है तो इस टैप पहचानकर्ता को हटा दिया जाएगा।

यह परिदृश्य viewWillAppear: में इस पहचानकर्ता को जोड़ने के लिए भी अच्छा नहीं होगा क्योंकि घटनाओं की एक श्रृंखला की कल्पना करना मुश्किल नहीं है जो कई पहचानकर्ताओं को बनाया जाएगा।

तो तर्कसंगत रूप से यदि आप उपस्थिति विधियों में एक पहचानकर्ता जोड़ना चाहते हैं तो आपको उन्हें ivar में किसी प्रकार का संदर्भ रखना होगा। लेकिन फिर यह हमेशा एक बुरा विचार नहीं है। आमतौर पर आपके पहचानकर्ताओं के संदर्भ का कारण <UIGestureRecognizerDelegate> विधियों के तर्क में सहायता करना है, यदि उनका उपयोग किया जाता है।

मैं बाद में संलग्नक के लिए initWith.. विधि में कोई पहचानकर्ता कभी नहीं जोड़ूंगा। एकमात्र फायदा यह है कि आपके द्वारा बनाए गए किसी भी पहचानकर्ता को दृश्य नियंत्रक के पूरे जीवन में रखा जाएगा। लेकिन चूंकि एक पहचानकर्ता स्पष्ट रूप से दृश्य प्रणाली का हिस्सा है, इस तरह के muddies- MVC ऊपर कोको बड़ा है। नेविगेशन स्टैक पर नियंत्रकों की कम स्मृति स्थिति दृश्य में भी शुद्ध किया गया है, लेकिन इस मामले में पहचानकर्ता किसी भी वास्तविक कारण के लिए स्मृति (उसमें बड़ी वस्तुएं नहीं) का उपयोग कर रह सकता है।

आप निश्चित रूप से view(Will/Did)Appear: विधि में एक पहचानकर्ता जोड़ सकते हैं और view(Will/Did)Disappear: में इसे हटा सकते हैं। मेरी वरीयता नहीं है।मुझे नहीं लगता कि सिर्फ modal दृश्य प्रस्तुत किया गया है और हटाया गया है या नेविगेशन push/pop ऐसा हुआ है कि मुझे अपने पहचानकर्ताओं को हटा देना और दोबारा जोड़ना चाहिए।

मैं अपने पहचानकर्ताओं को तत्काल और संलग्न करने के लिए लगभग हमेशा viewDidLoad का उपयोग करने की सलाह दूंगा। कम स्मृति स्थिति में मदद के लिए बस viewDidUnload में किसी भी मजबूत संदर्भ को नेल-आउट करना याद रखें। और फिर ARC के साथ dealloc में ivars के साथ कुछ भी करने की आवश्यकता नहीं है।

+0

विस्तृत उत्तर के लिए धन्यवाद NJones! दृश्य में पहचानकर्ताओं को जोड़ने/अलग करने का कारण (होगा/किया गया) लोड और अनलोड लोड स्मृति और कारणों के लिए पूरी तरह से था (ताकि जब स्क्रीन पर दृश्य न हो, तो स्मृति रिलीज़ हो जाती है और स्क्रीन पर होने पर वापस असाइन की जाती है) लेकिन आप जो कहते हैं उससे , यह इतना अंतर नहीं बनाता है। – mrd3650

0

viewDidUnload केवल कम स्मृति की स्थिति में कहा जाता है, और सभी एक ही नाम से जाना इसकी गारंटी नहीं है। इसलिए, viewDidUnload में हटाए गए किसी भी इशारे पहचानकर्ता को dealloc में भी हटा दिया जाना चाहिए। आपके द्वारा उल्लेख की जाने वाली ईथर विधि ठीक है।

0

ठीक है तो viewWillAppear:Animated और viewWillDisappear:animated मेरे ज्ञान के रूप में संकेतों के साथ कुछ भी करने का सबसे अच्छा विकल्प होगा।

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