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

时间:2016-11-29 21:03:19

标签: swift cocoa nstextview

我给了一个任意的NSAttributedString(从markdown解析,而不是在这里重要),它可能包含我希望在NSTableView单元格的文本字段中可点击的URL。要求规定,如果用户单击该URL,则使用默认浏览器将其带到该URL。如果他们点击单元格中的任何其他位置,我们会有默认行为(显示其他信息弹出窗口)。

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

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

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

使用委托协议的Swift 3中的任何帮助或示例代码都将非常感激。

这是我在NSTextView上设置委托属性时遇到的崩溃: Crash

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

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
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

我不明白,但它有效,所以这才是最重要的。