2014-09-17 11 views
28

स्विफ्ट में [self.view रिकर्सिव डिस्क्रिप्शन] का उपयोग करने का कोई तरीका है? मैं इस विधि का उपयोग करने की कोशिश कर रहा हूं लेकिन मुझे निम्न त्रुटि मिल रही है:रिकर्सिव डिस्क्रिप्शन विधि?

'UIView' does not have a member named 'recursiveDescription' 

कोई सुझाव?

+2

एफवाईआई, अगर आप स्विफ्ट या ओब्जे-सी डीबग करते समय [self.view रिकर्सिव डिस्क्रिप्शन] का उपयोग करना चाहते हैं, तो आप ऐप और पीओ [self.view रिकर्सिव डिस्क्रिप्शन] को रोक सकते हैं। [[UIWindow keyWindow] _autolayoutTrace] विशेष रूप से XCode6 के दृश्य डीबगर के संयोजन के रूप में उपयोग की जाने वाली दृश्य बाधाओं को डीबग करने के लिए बहुत अच्छा है। –

उत्तर

8

(UIView पर -recursiveDescription विधि) की तरह निजी/गैर-दस्तावेजी ऑब्जेक्टिव-सी एपीआई तक पहुँचने के लिए स्विफ्ट से आप कर सकते हैं निम्नलिखित में:

  1. वर्ग निजी विधि पर एक नया ऑब्जेक्टिव-सी श्रेणी बनाएं में परिभाषित किया गया है (उदाहरण के लिए UIView)।
  2. हिट यदि एक्सकोड आपको ब्रिजिंग हेडर को कॉन्फ़िगर करने के बारे में पूछता है तो हिट करें। (यदि आपके प्रोजेक्ट में पहले से ही ब्रिजिंग हेडर है तो यह चरण छोड़ा जाएगा)।
  3. श्रेणी की कार्यान्वयन फ़ाइल (.m) हटा दी जा सकती है।

    // UIView+Debugging.h 
    
    @interface UIView (Debugging) 
    - (id)recursiveDescription; 
    @end 
    

अब आप एक ब्रेकपाइंट सेट करें और यह LLDB में पुनरावर्ती विवरण मुद्रित कर सकते हैं:

  • श्रेणी शीर्षक में निजी विधि घोषित

    po view.recursiveDescription() as NSString 
    
  • +1

    यह तकनीक बहुत बढ़िया काम करती है लेकिन तेजी से/lldb इसे गड़बड़ कर रहे हैं अप। मेरे पास कोई सुराग नहीं है, लेकिन इस तकनीक से मुझे आउटपुट (एक्सकोड 6.2 6 सी 101) बहुत गड़बड़ हो गया है, इसमें \ n अलग-अलग पात्रों के रूप में कंसोल में वास्तविक लाइन-ब्रेक शामिल हैं - जो कि बहुत ही अच्छे थे - और यह लगभग 1800 वर्णों पर क्लिप करता है , यह बहुत बेकार बना रहा है। ओह। – natbro

    1

    ब्रिजिंग हेडर में उस विधि के साथ UIView की एक श्रेणी की घोषणा में जोड़ें।

    +0

    बस मेरे जैसे किसी अन्य नौसिखिया को अधिक जानकारी चाहिए :) http://petosoft.wordpress.com/2014/06/13/lldb-and-xcode-6/ – iamdavidlam

    6

    सबसे पहले एक वर्ग को जोड़ने के @interface आपके ब्रिजिंग हेडर में @implementation के बिना।

    @interface UIView (Debug) 
    - (id)recursiveDescription; 
    - (id)_autolayoutTrace; // This one is even sweeter 
    @end 
    
    तो आपके कंसोल में

    po self.recursiveDescription() as NSString 
    po self._autolayoutTrace() as NSString 
    

    कुंजी यहाँ as NSString है as String

    +0

    आप एनएसएसटींग के रूप में कैसे डालने के बारे में जानते थे? – MattD

    +1

    मुझे पहले पता नहीं था। बस _autolayoutTrace के लिए – CopperCash

    +0

    प्लस वन की कोशिश की और थक गया। यह * सुंदर मीठा है! –

    72

    नहीं आप lldb में दृश्य पदानुक्रम प्रदर्शित करना चाहते हैं तो आप किसी भी श्रेणियां जोड़ने या ब्रिजिंग की जरूरत नहीं है हेडर या ऐसा कुछ भी। जब ऑब्जेक्टिव-सी कोड डिबगिंग, एक आम तौर पर (lldb) प्रॉम्प्ट पर निम्न आदेश का उपयोग होगा:

    po [[UIWindow keyWindow] recursiveDescription] 
    

    हैं, हालांकि, आप एक स्विफ्ट फ्रेम में रोक दिया है, lldb एक स्विफ्ट अभिव्यक्ति की उम्मीद कर सकते हैं।आप, हालांकि, स्पष्ट रूप से बता सकते हैं expr (po संक्षिप्त नाम वास्तव में बुला रहा है expression) जो भाषा अभिव्यक्ति है में:

    expr -l objc++ -O -- [[UIWindow keyWindow] recursiveDescription] 
    

    एक ही पैटर्न iOS 8 में पाए जाते हैं, दृश्य नियंत्रक पदानुक्रम को देखने का उपयोग करते समय, :

    po [UIViewController _printHierarchy] 
    

    या, स्विफ्ट फ्रेम में:

    expr -l objc++ -O -- [UIViewController _printHierarchy] 
    

    यह ध्यान देने योग्य है कि Xcode 8 दृश्य डीबगर (view debug button पर क्लिक करें) शुरू की, दृश्य पदानुक्रम का विश्लेषण करने के अधिक सहभागी रूप से की पेशकश, काफी हद तक दृश्य पदानुक्रम के LLDB recursiveDescription की आवश्यकता को समाप्त लायक है। अधिक जानकारी के लिए डब्ल्यूडब्ल्यूडीसी 2016 वीडियो Visual Debugging with Xcode देखें। माना जाता है कि, कभी-कभी हम उपरोक्त दिखाए गए recursiveDescription तकनीक पर वापस आना बंद कर देते हैं, लेकिन अधिकांश समय व्यू डिबगर इसे एक और अधिक प्राकृतिक, अंतर्ज्ञानी प्रक्रिया बनाता है।

    और Xcode 9 में, वे इस दृश्य डिबगर का विस्तार किया है इसलिए अब प्रासंगिक दृश्य नियंत्रकों शामिल भी:

    enter image description here

    +2

    स्विफ्ट 2.0 के लिए रॉन का जवाब आसान है, लेकिन यह उपयोगी एलएलडीबी ज्ञान –

    +0

    अच्छी जानकारी है! Objc को भाषा बदलने के दौरान स्वयं कोई विचार क्यों उपलब्ध नहीं है? जैसे अगर मैं एक इंस्टेंस विधि के अंदर तोड़ता हूं, "expr -l swift - print (self)" सफलतापूर्वक स्वयं का विवरण प्रिंट करता है, जबकि "expr -l objc - NSLog (@"% @ ", self)" परिणाम "उपयोग अविकसित पहचानकर्ता 'स्वयं' ' –

    +0

    नोट, स्वयं का परीक्षण करने के लिए आपको पहले की आवश्यकता होगी: expr -l objc - @import UIKit –

    58

    तेज 2.0 में आप बस चला सकते हैं:

    po view.performSelector("recursiveDescription") 
    

    में (आईओएस 10 बीटा 3 के साथ परीक्षण) स्विफ्ट 3.0 यह थोड़ा और जटिल है:

    po let s = view.perform("recursiveDescription"); print(s)

    +4

    यह स्वीकार्य उत्तर होना चाहिए क्योंकि इसे कोई अतिरिक्त कोड की आवश्यकता नहीं है। – user3246173

    5
    po view.value(forKey: "recursiveDescription")! 
    
    संबंधित मुद्दे