2015-06-12 5 views
5

में स्ट्रिंग के साथ एनएसटीक्स्टस्टॉरेज को कैसे प्रारंभ करें another problem को छोटे हिस्सों में तोड़ने के लिए, मैं सभी टेक्स्टकिट घटकों को स्थापित करने की कोशिश कर रहा हूं। हालांकि, मैं NSTextStorage कैसे शुरू करता हूं इसे बदलने के बाद मुझे दुर्घटना हो रही है।स्विफ्ट

import UIKit 

class ViewController3: UIViewController { 

    @IBOutlet weak var textView: UITextView! 
    @IBOutlet weak var myTextView: MyTextView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let container = NSTextContainer(size: myTextView.bounds.size) 
     let layoutManager = NSLayoutManager() 
     let textStorage = NSTextStorage(string: "This is a test") 
     layoutManager.addTextContainer(container) 

     //layoutManager.textStorage = textView.textStorage // This works 
     layoutManager.textStorage = textStorage // This doesn't work 

     myTextView.layoutManager = layoutManager 

    } 
} 

class MyTextView: UIView { 

    var layoutManager: NSLayoutManager? 

    override func drawRect(rect: CGRect) { 
     let context = UIGraphicsGetCurrentContext(); 

     // Enumerate all the line fragments in the text 
     layoutManager?.enumerateLineFragmentsForGlyphRange(NSMakeRange(0, layoutManager!.numberOfGlyphs), usingBlock: { 
      (lineRect: CGRect, usedRect: CGRect, textContainer: NSTextContainer!, glyphRange: NSRange, stop: UnsafeMutablePointer<ObjCBool>) -> Void in 

      // Draw the line fragment 
      self.layoutManager?.drawGlyphsForGlyphRange(glyphRange, atPoint: CGPointMake(0, 0)) 

     }) 
    } 
} 

यह EXC_I386_GPFLT की एक अपवाद कोड के साथ enumerateLineFragmentsForGlyphRange पर दुर्घटनाओं: परीक्षण प्रयोजनों के लिए मैं निम्नलिखित करने के लिए परियोजना को सरल बनाया है। वह कोड बहुत स्पष्टीकरण नहीं है। लगता है कि मैं NSTextStorage कैसे शुरू कर रहा हूं, इस बारे में मूल समस्या नीचे आ रही है।

यदि मैं यह

layoutManager.textStorage = textView.textStorage 

साथ

let textStorage = NSTextStorage(string: "This is a test") 
layoutManager.textStorage = textStorage 

की जगह तो यह काम करता है। मैं क्या गलत कर रहा हूं?

+1

टेक्स्ट दें: NSTextStorage = NSTextStorage (स्ट्रिंग: "टेस्ट") – Arvind

+1

@ अरविंद, फिर भी वही त्रुटि ... – Suragch

+1

डॉकमेंट्स को देखने से, मुझे लगता है कि आपको लेआउट मैनेजर को टेक्स्ट स्टोरेज में जोड़ने की कोशिश करनी चाहिए दूसरी तरह के आसपास। –

उत्तर

7

यह चीजों को करने का तरीका प्रतीत होता है, एनएसएलक्स्ट मैनेजर को NSTextStorage ऑब्जेक्ट में जोड़ने के लिए, (addLayoutManager का उपयोग करके :) लेआउट मैनेजर पर टेक्स्टस्टोरेंस प्रॉपर्टी सेट करने के बजाय।

एप्पल के दस्तावेजों से

:

जब आप एक NSTextStorage वस्तु के लिए एक NSLayoutManager जोड़ने इस विधि स्वतः शुरू हो जाती है; आपको इसे सीधे आमंत्रित करने की आवश्यकता नहीं है, लेकिन आप इसे ओवरराइड करना चाहेंगे। यदि आप रिसीवर युक्त टेक्स्ट-सिस्टम ऑब्जेक्ट्स के एक स्थापित समूह के लिए NSTextStorage ऑब्जेक्ट को प्रतिस्थापित करना चाहते हैं, तो RemoveTextStorage का उपयोग करें:।

Link to setTextStorage: for NSLayoutManager

मुमकिन है कुछ में किया जाता है 'addLayoutManager:' जो setTextStorage में नहीं किया हो जाता है, दुर्घटना के कारण।

यदि आप ऐसा लगता है कि यह दृश्य लोड होने के बाद इसे साफ़ कर दिया गया है, तो आप टेक्स्टस्टॉरेज वैरिएबल का दायरा भी बढ़ा सकते हैं।

+0

मुझे जवाब का विस्तार करने में खुशी है, क्या इसे और अधिक काम की ज़रूरत है - कृपया मुझे बताएं। –