2012-08-12 19 views
8

UIBarButtonItemUIView से उप-वर्ग नहीं है, इसलिए इसकी frame जैसी सामान्य विशेषताओं को प्राप्त करना असंभव है।UIBarButtonItem, निजी एपीआई उल्लंघन में देखने के लिए `valueForKey` का उपयोग करना?

एक तरह से यह करने के लिए [barButtonItem valueForKey:@"view"]

यह पूरी तरह से काम करता है, और आप अंतर्निहित UIView करने के लिए (उदाहरण के लिए) एक GestureRecognizer जोड़ने के लिए अनुमति देता है।

हालांकि, क्या यह एक निजी UIKit एपीआई उल्लंघन है?

+0

अधिक जानकारी के लिए यह उत्तर http://stackoverflow.com/a/5066899/418715 देखें। – Joe

+0

हाय @ जो, हाँ, मैंने उसे देखा, लेकिन उसे नहीं पता था कि इसे क्या बनाना है। अब मुझे लगता है कि यह ठीक होने जा रहा है। वे केवीसी का कारण यह है कि दृश्य बहुत बदल जाता है। –

उत्तर

14

यह सत्यापन पर तत्काल अस्वीकृति के मामले में निजी नहीं है, लेकिन यह नाजुक माना जाने वाला पर्याप्त निजी है (यानी, नया आईओएस संस्करण आपके मौजूदा ऐप को ऐप स्टोर में तोड़ सकता है जो कोड का उपयोग कर रहा है)।

मैं कह सकता हूं कि एक समान कोड (केवीसी के माध्यम से यूआईटीयूएलबार के पृष्ठभूमि दृश्य ivar लाने) ने ऐप स्टोर सत्यापन पास कर दिया है और उत्पादन में इसका उपयोग किया जा रहा है।

संभावित बुरी चीजों के मामले में, आपको विधि को @try { ... } @catch में लपेटना होगा, ताकि आप केवीसी को संभवतः नए आईओएस रिलीज में विफल कर सकें।

+0

धन्यवाद, महान जवाब, एसओ पर यहां शुभकामनाएँ। –

+0

ऐप को बस इस कोड के साथ ऐप के हर कोने में अनुमोदित किया गया था। मेरा मतलब है, निष्पादन के मामले में, कोड सिर्फ एक ही स्थान पर है :) तो फिर से धन्यवाद! –

+0

@farcaller, आप 'setValue: forKey:' पर ​​"निजी" एपीआई का उपयोग करने के बारे में क्या सोचते हैं?मैं '_customRightViews' प्रॉपर्टी को 'UINavigationItem' के लिए शून्य पर सेट करना चाहता हूं। – Daniel

7

पांच साक्ष्य के टुकड़े के लिए "यह निजी नहीं है"

  • यह एक संपत्ति है कि आप अन्य तरीकों से करने के लिए प्राप्त कर सकते हैं। इसे आज़माएं और उन विचारों में से एक वास्तव में UIBarButtonItem प्रश्न में ivar है। यह इंगित करता है कि इस UIView तक पहुंच प्रतिबंधित नहीं है, हालांकि केवीओ मार्ग संदिग्ध हो सकता है (लेकिन मुझे शक है)।

    NSArray *array = self.toolBar.subviews; 
        for (UIView *view in array) { 
         view.backgroundColor = UIColor.greenColor; 
        } 
    
  • वे वास्तव में इस संपत्ति के लिए केवीओ को ट्रिगर करते हैं। ivars को केवीओ एपीआई ट्रिगर करने की ज़रूरत नहीं है, है ना?

  • @ फ़ैकररर एक समान मामला बताता है जो ऐप स्टोर में बिक्री के लिए है। चूंकि उसने प्रश्न के पहले 20 मिनट के भीतर जवाब दिया है, इसलिए यह उचित है (लेकिन सुरक्षित नहीं है!) यह मानने के लिए कि ऐप स्टोर में हजारों ऐप्स हो सकते हैं जो ऐसा करते हैं।

  • यह UIView बटन दबाए जाने पर प्रत्येक बार उपेक्षित हो जाता है, इसलिए आप केवल उदाहरण के लिए, एक इशारा पहचानकर्ता सेट नहीं कर सकते हैं और किया जा सकता है। हालांकि, आप view प्रतिस्थापित होने पर हर बार एक ही इशारा पहचानकर्ता स्थापित कर सकते हैं। मेरे लिए, यह वास्तव में अधिक सबूत है कि यह एक निजी एपीआई चीज नहीं है, बल्कि इसका उपयोग करते समय आपको बहुत सावधान रहना होगा (और यह सुनिश्चित करने के लिए केवीओ का उपयोग करें कि आपके पास नवीनतम है)।

  • मेरा ऐप ऐप स्टोर में बिक्री के लिए है और यह करता है।

+3

क्या कालातीत जवाब है। शायद आईओएस 9 पर लागू हो सकता है। – fatuhoku

+0

मुझे लगता है कि यह _ ** निजी ** _ ("इसका उपयोग न करें, हमें किसी भी समय इस आंतरिक कार्यान्वयन विस्तार को बदलने के लिए स्वतंत्र होना चाहिए") और _ ** अनियंत्रित ** _ ("अपने जोखिम पर उपयोग करें, हम ज़िम्मेदार नहीं हैं")। –