【问题标题】:Need to use a NSTextView (or NSTextField) for a clickable URL需要为可点击的 URL 使用 NSTextView(或 NSTextField)
【发布时间】:2016-11-29 21:03:19
【问题描述】:

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

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

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

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

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

这是我通过简单地在 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
        }
    }
}

【问题讨论】:

  • 已添加代码。没有什么太疯狂的事情了。

标签: swift cocoa nstextview


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多