2012-02-23 29 views
5

मेरा एप्लिकेशन कभी-कभी ट्रैक को खो देता है कि किस प्रतिक्रियाकर्ता को टच इवेंट को संभालना चाहिए।यूआईबटन घटना ने 1% समय संभाला नहीं: मुझे अपने उत्तरदाता श्रृंखला में किसको दोष देना चाहिए?

मेरे स्थिति:

  • एक XIB फ़ाइल 3 विचारों को परिभाषित:
  • 2 अतिरिक्त दृश्य दृश्य पदानुक्रम प्रोग्राम के रूप में
में जोड़े गए
  • एक फ़ाइल के मालिक दृश्य के रूप में देखने के लिए
  • सबव्यूव (सबव्यूए) में से एक UIButton है, FirstResponder पर चयनकर्ता भेजने के लिए कॉन्फ़िगर किया गया है जब एक "टच अप के अंदर" घटना का पता चला है
  • SubviewA जानता है कि कैसे संभाल करने के लिए समय की myAction:

99%, सब कुछ ठीक हो जाता है। जब उपयोगकर्ता बटन को टैप करता है, तो सबव्यूए myAction: संदेश का ख्याल रखता है और सबकुछ ठीक है। लेकिन कई बार, उपयोगकर्ता शिकायत करते हैं कि बटन "फ्रीज" है और मैंने वास्तव में मांग पर होने के लिए स्पष्ट परिदृश्य खोजने में सक्षम होने के बिना इसे दो बार पुन: उत्पन्न किया।

मेरे जांच अब तक है:

  • जब कुछ नहीं होता जब बटन को टैप:
    • मेरी बटन नल का पता लगाता है जब
    • myAction: दबाया यह प्रकाश डाला जाता है कारण SubviewA
    • पर नहीं बुलाया जाता है
    • शेष यूआई उत्तरदायी

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

मेरे प्रश्न हैं:

  • जहां बग से आ सकते हैं पर कोई विचार? (उत्तरदाता श्रृंखला?)
  • कोई टिप्पणी इस बात पर कोई टिप्पणी करती है कि दृश्य को अपने बटन को स्वयं ही संभालना चाहिए या यदि कोई दृश्य नियंत्रक इसे करना चाहिए?

संपादित करें: मैं कैसे बग को ठीक करने पर एक विचार है: बल्कि इंटरफ़ेस बिल्डर के भीतर FirstResponder का उपयोग करने से बटन कार्रवाई सीधे SubviewA करने के लिए तार। इस सवाल को पोस्ट करने का कारण यह समझने की कोशिश करना है कि प्रतिक्रियाकर्ता श्रृंखला समय-समय पर क्यों काम नहीं कर रही है।

+0

कुछ कोड देखने के लिए अच्छा रहें ... – tarmes

+0

नहीं। एम कोड शामिल है: केवल एक्सआईबी फाइलें, जो साझा करना वास्तव में आसान नहीं हैं। –

उत्तर

1

क्या आप बस सबव्यूए बन सकते हैं फर्स्ट रेस्पॉन्डर और फिर समाप्त होने पर इसे छोड़ दें?

+0

मेरी बग को ठीक करने की मेरी योजना इंटरफ़ेस बिल्डर के भीतर फर्स्ट रेस्पॉन्डर की बजाय बटन एक्शन को सीधे सबव्यूए से तार करना है। मैं क्या जानना चाहता हूं कि यह फर्स्ट रेस्पॉन्डर के साथ क्यों काम नहीं कर रहा है। –

1

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

इस कारण से आपको स्पर्श देखने के लिए UIButton को उप-वर्ग करने की आवश्यकता होगी। जब आप ऐसा करते हैं, तो जब आप उनके साथ काम करते हैं तो ईवेंट को हमेशा सुपर क्लास में पास करना सुनिश्चित करें, अन्यथा UIButton सही तरीके से काम नहीं करेगा। UIControl Class Reference में सबक्लासिंग नोट्स देखें। इसके अलावा Control Events in that reference पर एक नज़र डालें, साथ ही कुछ उदाहरण विधियों को सुनिश्चित करें कि आपको वास्तव में अपने कोड में छूने की आवश्यकता है। उदाहरण के लिए नोट, यूआईबटन को यूआईसींट्रोल से छूने की क्षमता प्राप्त होती है।

+0

आपका उत्तर समझ में आता है लेकिन मेरे प्रश्न के बिंदु को याद करता है: मेरी xib फ़ाइल स्पष्ट रूप से मेरे बटन को टच-अप-इन-इवेंट के लिए पहले उत्तरदाता पर myAction कॉल करने के लिए बता रही थी। तो कभी-कभी इसे याद क्यों आता है? –