【发布时间】: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