2015-06-12 16 views
5

Per interrompere another problem in parti più piccole, sto cercando di impostare tutti i componenti di TextKit. Tuttavia, si verifica un arresto anomalo dopo aver modificato la modalità di inizializzazione di NSTextStorage. A scopo di verifica Ho semplificato il progetto al seguente:Come inizializzare NSTextStorage con una stringa in Swift

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)) 

     }) 
    } 
} 

Si blocca in enumerateLineFragmentsForGlyphRange con un codice di eccezione di EXC_I386_GPFLT. Quel codice non è molto esplicativo. Il problema di base sembra essere il modo in cui sto inizializzando NSTextStorage.

Se sostituisco

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

con questo

layoutManager.textStorage = textView.textStorage 

allora funziona. Che cosa sto facendo di sbagliato?

+1

let testo: NSTextStorage = NSTextStorage (stringa: "test") – Arvind

+1

@Arvind, Ancora lo stesso errore ... – Suragch

+1

Dall'analisi dei doucments, penso che dovresti provare ad aggiungere il gestore di layout all'archivio di testo piuttosto che viceversa. –

risposta

7

Sembra che il modo di fare le cose, è aggiungere NSLayoutManager all'oggetto NSTextStorage, (usando addLayoutManager :) piuttosto che impostare la proprietà textStorage sul gestore di layout.

Dai documenti di Apple:

Questo metodo viene richiamato automaticamente quando si aggiunge un NSLayoutManager a un oggetto NSTextStorage; non dovresti mai aver bisogno di invocarlo direttamente, ma potresti volerlo sovrascrivere. Se si desidera sostituire l'oggetto NSTextStorage per un gruppo stabilito di oggetti del sistema di testo contenente il destinatario, utilizzare replaceTextStorage :.

Link to setTextStorage: for NSLayoutManager

Presumibilmente qualcosa viene fatto a 'addLayoutManager:' che non venga fatto in setTextStorage, causando l'incidente.

Si potrebbe anche voler aumentare l'ambito della variabile textStorage, se sembra che si stia chiarendo una volta terminato viewDidLoad.

+0

Sono felice di estendere la risposta, nel caso necessiti di più lavoro, per favore fatemelo sapere. –