【问题标题】:Change NSTextField Cursor Color When inside TableView Cell在 TableView 单元格内更改 NSTextField 光标颜色
【发布时间】:2018-06-01 20:00:44
【问题描述】:

我有一个NSTextField,它位于NSTableCelView 子类中。我想改变它的光标颜色,因为现在光标和背景一样。

在我的应用程序的其他地方,我用一个方便的扩展更改了光标颜色,如下所示:

extension NSTextField {
  public func cursorColor(_ cursorColor: NSColor) {
    let fieldEditor = self.window?.fieldEditor(true, for: self) as! NSTextView
    fieldEditor.insertionPointColor = cursorColor
  }
}

我把这个方法放在viewWillDraw() 我的NSTableCellView 子类中:

override func viewWillDraw() {
  name.cursorColor(NSColor.white)
}

...但应用程序在extension 内的这一行崩溃:

let fieldEditor = self.window?.fieldEditor(true, for: self) as! NSTextView //Crash!

我认为这是因为它找不到对 self.window 的引用,但我不确定。

任何想法我做错了什么?

【问题讨论】:

    标签: cocoa nstextfield nstextview nstablecellview


    【解决方案1】:

    NSWindow.fieldEditor(_: for:) 返回一个 NSText?,但您正试图将其显式强制转换为 NSTextView

    所以我的猜测是:

    1. 返回的对象是 nil 并且您的演员阵容失败或
    2. 返回的对象是 NSText 的不同子类(因此不是 NSTextView),并且您的转换失败

    您在崩溃时收到的实际错误消息是什么?

    【讨论】:

    • NSTextFieldNSTableCellView 内时,self.window 看起来像nil,但当它在常规NSViewController 内时,它永远不是nil。错误是Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0),我认为这只是意味着我正在强制展开一个 nil 值。
    • 看起来这只是一个竞争条件。如果我将其更改为 if let 语句并测试类型,它最终会起作用。该方法被多次调用,因为它位于NSTableCellView 中,最终self.window 不再是nil。感谢您的帮助!
    • viewWillDraw 设置光标颜色的时机合适吗?
    猜你喜欢
    • 2013-03-15
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多