5

为了将另一个问题分解成更小的部分,我正在尝试设置所有 TextKit 组件。但是,在更改了我的初始化方式后我遇到了崩溃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_GPFLTenumerateLineFragmentsForGlyphRange的异常代码崩溃。该代码不是很容易解释。基本问题似乎归结为我的初始化方式。NSTextStorage

如果我更换

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

有了这个

layoutManager.textStorage = textView.textStorage

然后它工作。我究竟做错了什么?

4

1 回答 1

7

似乎做事的方法是将 NSLayoutManager 添加到 NSTextStorage 对象,(使用 addLayoutManager :) 而不是在布局管理器上设置 textStorage 属性。

来自苹果的文件:

当您将 NSLayoutManager 添加到 NSTextStorage 对象时,会自动调用此方法;您永远不需要直接调用它,但您可能想要覆盖它。如果你想为已建立的包含接收者的文本系统对象组替换 NSTextStorage 对象,请使用 replaceTextStorage:。

链接到 setTextStorage: 用于 NSLayoutManager

大概在“addLayoutManager:”中完成了一些事情,而在 setTextStorage 中没有完成,导致崩溃。

您可能还想增加 textStorage 变量的范围,如果 viewDidLoad 完成后它似乎正在被清除。

于 2015-06-15T13:15:38.917 回答