2015-06-12 3 views
5

Чтобы разбить another problem на более мелкие части, я пытаюсь настроить все компоненты TextKit. Тем не менее, я получаю сбой после изменения, как я инициализирую NSTextStorage. Для тестирования я упростил проект к следующему:Как инициализировать NSTextStorage со строкой в ​​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)) 

     }) 
    } 
} 

Это происходит сбой в enumerateLineFragmentsForGlyphRange с кодом исключения из EXC_I386_GPFLT. Этот код не очень объяснительный. Основная проблема, похоже, сводится к тому, как я инициализирую NSTextStorage.

Если я заменяю

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

с этим

layoutManager.textStorage = textView.textStorage 

затем он работает. Что я делаю не так?

+1

let text: NSTextStorage = NSTextStorage (строка: "test") – Arvind

+1

@Arvind, по-прежнему такая же ошибка ... – Suragch

+1

От взгляда на туалетные принадлежности, я думаю, вам стоит попробовать добавить менеджера компоновки в хранилище текста, а не наоборот. –

ответ

7

Кажется, что нужно сделать что-то, чтобы добавить NSLayoutManager к объекту NSTextStorage (используя addLayoutManager :) вместо установки свойства textStorage в менеджере компоновки.

Из документов компании Apple:

Этот метод вызывается автоматически при добавлении NSLayoutManager к объекту NSTextStorage; вам не нужно будет ссылаться на него напрямую, но вы можете переопределить его. Если вы хотите заменить объект NSTextStorage для установленной группы объектов текстовой системы, содержащих приемник, используйте replaceTextStorage :.

Link to setTextStorage: for NSLayoutManager

Предположительно что-то будет сделано в 'addLayoutManager:', который не будет сделано в setTextStorage, причиной аварии.

Возможно, вы также захотите увеличить область действия переменной textStorage, если она кажется, что она очищается после завершения viewDidLoad.

+0

Я рад расширить ответ, если вам нужно больше работы - пожалуйста, дайте мне знать. –

Смежные вопросы