【问题标题】:How to implement NSTextFinderClient protocol in NSTextView in Swift?如何在 Swift 的 NSTextView 中实现 NSTextFinderClient 协议?
【发布时间】:2016-01-26 09:31:43
【问题描述】:

我有一个 NSTextView,其中的文本正在以编程方式进行更改。我有this 问题中提到的确切问题。但是由于我使用的是 swift,所以当我尝试在 NSTextView 中实现 NSTextFinderClient 协议时,我收到编译器错误,提示“‘字符串’的类型与协议‘NSTextFinderClient’所要求的可选性不同”。我需要帮助来弄清楚如何正确地做到这一点。

【问题讨论】:

  • 您能否在NSTextView 子类中提供符合协议的代码?特别是触发编译错误的行。我猜你只需要在这里打开一个可选的。
  • 当我尝试构建项目时显示错误,它没有显示在一行代码中。目前我正在使用func stringLength() -> Intfunc stringAtIndex(characterIndex: Int, effectiveRange outRange: NSRangePointer, endsWithSearchBoundary outFlag: UnsafeMutablePointer<ObjCBool>) -> String 这两种方法实现协议。您可以通过使 NSTextView 子类符合 NSTextFinderClient 协议来重现错误。
  • 我认为问题源于NSTextNSTextView 的超类已经具有string 类型的String? 属性,而string 属性由@987654330 定义@ 是 String(非可选)。目前我想不出任何解决方案,除了让另一个对象(默认情况下没有string 属性)作为客户端并引用您的NSTextView,几乎就像一个委托(从未这样做过) )
  • 我尝试通过将控制 NSTextView 的 viewcontroller 设置为 NSTextFinder 的客户端,但随后没有调用 NSTextFinderClient 协议中的任何方法。
  • 如果您提供string 属性,您实际上并不需要这两种方法。来自文档:“如果客户端无法在逻辑上或有效地将自身扁平化为单个字符串,则应实施 stringAtIndex:effectiveRange:endsWithSearchBoundary: 和 stringLength 方法。”只需为string 提供一个吸气剂,你应该会很好.. 我认为?

标签: swift cocoa nstextview


【解决方案1】:

我找到了解决问题的方法。 替换这个

class TextView: NSTextView, NSTextFinderClient {
    var textFinder: NSTextFinder!
}

class TextView: NSTextView {
    @IBOutlet weak var textFinder: NSTextFinder!
}

将一个 TextTFinder 对象拖放到包含 TextView 插座的场景中。将 TextView 的 textFinder 链接到 TextFinderObject,并使 TextView 成为 Outlet 的客户端。在此之后,您将能够向 FindBar 发送通知,例如 textFinder.noteClientStringWillChange()textFinder.performAction(.HideFindInterface)。在这样做时,我们不需要以编程方式使 TextView 对象确认到 NSTextFinderClient 协议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多