需要将 NSTextView(或 NSTextField)用于可点击的 URL

Need to use a NSTextView (or NSTextField) for a clickable URL

我得到了一个任意的 NSAttributedString(从 markdown 解析而来,在这里无关紧要),它可能包含 URL,我想在 NSTableView 单元格的文本字段中点击它。要求指出,如果用户单击 URL,他们将使用默认浏览器转到它。如果他们点击单元格中的其他任何地方,我们有默认行为(显示附加信息弹出窗口)。

我正在尝试使用 NSTextView 来显示内容。但是,在 URL 外部但在视图内单击会选择文本并占用鼠标单击。使视图不可选择也不允许单击 URL。我也不太希望文本可以选择,但这是一个小问题。

所以...我决定让我的视图控制器成为一个 NSTextViewDelegate,这样我就可以使用其中的一些回调。但是如果我将 NSTextView 的委托 属性 设置为 'self',我的应用程序就会崩溃。即使我没有实现任何功能,也会发生这种情况,即使它们都是可选的。

我正在使用 Swift 3,想知道那里是否存在错误或其他问题?调用堆栈似乎正在发送一条 textView:willChangeSelectionFromCharacterRanges:toCharacterRanges: 消息,即使它没有实现。顺便说一句,实施该方法也无济于事。

Swift3 中使用委托协议的任何帮助或示例代码,将不胜感激。

这是我通过简单地在 NSTextView 上设置委托 属性 而导致的崩溃:

根据要求,这是设置委托的代码。目前我只是在消息更改时设置它。这显然可以优化,但现在我只想看到它的工作。

var notification: SSNotification! {
    didSet {
        guard let notificationCellView = self.view as? SSNotificationCellView else { return }
        notificationCellView.subjectLabel.stringValue = notification.subject
        if let description = notification.message , description != "" {
            let attrString = TSMarkdownParser.standard().attributedString(fromMarkdown: description)

            notificationCellView.messageLabel.textStorage?.setAttributedString(attrString)
            notificationCellView.messageLabel.isHidden = false
            notificationCellView.messageLabel.delegate = self

        } else {
            notificationCellView.messageLabel.isHidden = true
        }
    }
}

我从来没有弄清楚为什么会崩溃,但我想出了一个解决方法。我最初试图使包含 NSTextView 的 table 单元格的视图控制器成为委托。我更改了它,以便单元格的视图子类本身就是委托,一切都很好。

我不明白,但它确实有效,所以这很重要。