ios - Swift 中的 NSTextStorage 子类不更新 UITextView

标签 ios objective-c cocoa cocoa-touch swift

我正在尝试在 Swift 中创建一个简单的 NSTextStorage 子类,但是当我在 textView 中输入内容时,没有出现任何文本。

这是我在 View Controller 中的设置代码

var textView: UITextView!

var textStorage: CustomTextStorage?

override func viewDidLoad() {
    super.viewDidLoad()

    textStorage = CustomTextStorage()

    let layoutManager = NSLayoutManager()
    textStorage!.addLayoutManager(layoutManager)

    let textContainer = NSTextContainer(size: view.bounds.size)
    layoutManager.addTextContainer(textContainer)

    textView = UITextView(frame: view.bounds, textContainer: textContainer)
    view.addSubview(textView)
}

在我的 CustomTextStorage 子类中:

var store: NSMutableAttributedString = NSMutableAttributedString()

func string() -> NSString {
    return store.string
}

override func attributesAtIndex(location: Int, effectiveRange range: NSRangePointer) -> [NSObject : AnyObject] {
    return store.attributesAtIndex(location, effectiveRange: range)
}

override func replaceCharactersInRange(range: NSRange, withString str: String) {
    store.replaceCharactersInRange(range, withString: string)
    edited(NSTextStorageEditActions.EditedCharacters, range: range, changeInLength:countElements(str) - range.length)
}

override func setAttributes(attrs: [NSObject : AnyObject]?, range: NSRange) {
    store.setAttributes(attrs, range: range)
    edited(NSTextStorageEditActions.EditedAttributes, range: range, changeInLength: 0)
}

问题:每次我在textView中输入内容时,都会使用正确的字符串调用replaceCharactersInRange:withString:,但是范围 {0,0},并且 textView 中没有显示任何内容。不过键盘上方的建议栏确实发生了变化。

顺便说一句,setAttributes: 被调用,范围为 {0,1}(正确的值),导致异常:

NSMutableRLEArray ReplaceObjectsInRange:withObject:length::越界'

我通过首先检查范围是否在边界内来避免这种情况,但这并不能解决第一个问题。

任何帮助都会很棒!

最佳答案

看起来我在 CustomTextStorage.swift 中显示的内容下面有这个:

override func processEditing() {
}

需要在该方法中调用 super.processEditing()。哎呀。

因为我在其他网站和邮件列表上看到一些没有答案的类似问题,所以把它留在这里。

关于ios - Swift 中的 NSTextStorage 子类不更新 UITextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26579915/

相关文章:

ios - Apache cordova/phonegap 如何从 config.xml 启用功能

objective-c - 如何将字符串转换为一系列击键?

objective-c - 如何在 NSOutlineView 或 NSTableView 中选择时反转图标

ios - swift :信标测距在打电话时返回空数组

ios - Bundle ID 不允许在 iTunes 中更改

objective-c - 保留/分配内存管理

objective-c - 终止应用程序后保存 NSFetchResultsController 缓存

cocoa - 绑定(bind)到 NSCollectionViewItem 会使 Xcode 崩溃

objective-c - 从 IOUSBInterface 管道中找出数据

ios - 转到另一个 Storyboard,但导航 Controller 仍然可见