Con*_*or 5 macos cocoa objective-c nstextfield
我正在按照Apple 的示例在 NSTextField 中创建超链接(通过属性字符串),尽管超链接本身可以工作,但光标存在问题。也就是说,当您将鼠标悬停在超链接上时,它会显示正常的工字形光标,直到您单击它。单击一次后,它会显示正确的指针光标。
我已经搜索了一段时间,似乎没有一个简单的答案来解决这个问题,这很令人困惑,因为超链接似乎很常见。人们之前建议使用超链接的 NSButtons(那么如何在悬停时获得下划线?)和 NSTextViews,但这似乎有点 hack-y。在 OSX 编程中进行超链接的正确方法是什么?
注意:我偶然发现这篇文章,它展示了一种使用文本视图和“类别”执行此操作的方法。这是做事的正确方法吗?我想编写可维护且干净的代码。
谢谢你!
基于 Apple 的示例和 @stevesliva 的答案,我得出以下结论:
import Cocoa
extension NSAttributedString {
/// Return an attributed string that looks like a hyperlink
///
/// Based on code at <https://developer.apple.com/library/mac/qa/qa1487/_index.html>
///
/// - parameters:
/// - string: text to be turned into a hyperlink
/// - URL: destination of the hyperlink
/// - returns: `NSAttributedString`
static func hyperlinkFromString(string: String, withURL URL: NSURL) -> NSAttributedString {
let attrString = NSMutableAttributedString(string: string)
let range = NSMakeRange(0, attrString.length)
attrString.beginEditing()
attrString.addAttribute(NSLinkAttributeName,
value: URL.absoluteString,
range: range)
attrString.addAttribute(NSForegroundColorAttributeName,
value: NSColor.blueColor(),
range: range)
attrString.addAttribute(NSUnderlineStyleAttributeName,
value: NSNumber(int: Int32(NSUnderlineStyle.StyleSingle.rawValue)),
range: range)
attrString.fixAttributesInRange(range)
attrString.endEditing()
return attrString
}
}
/// Subclass of NSTextField used to display hyperlinks
class HyperlinkTextField: NSTextField {
/// Set content to be a hyperlink
///
/// Based on code at <https://developer.apple.com/library/mac/qa/qa1487/_index.html>
///
/// - parameters:
/// - title: text displayed in field
/// - URL: destination of hyperlink
func setHyperlinkWithTitle(title: String, URL: NSURL) {
allowsEditingTextAttributes = true
selectable = true
attributedStringValue = NSAttributedString.hyperlinkFromString(title,
withURL: URL)
}
/// Always display a pointing-hand cursor
override func resetCursorRects() {
addCursorRect(bounds, cursor: NSCursor.pointingHandCursor())
}
}
Run Code Online (Sandbox Code Playgroud)
好问题!OSX 控件中的超链接虽然功能强大,但看起来有点笨拙。
我相信这是因为 NSTextField 在第一次单击之前没有焦点。
可能的解决方案是使用此相关问题的答案。 我本来打算复制并粘贴一些代码,但是那里的讨论很有用。关于如何对视图进行子类化的最底层答案可能是最可靠的。
NSCursor类方法包含其他可能的游标类型的列表。
| 归档时间: |
|
| 查看次数: |
1337 次 |
| 最近记录: |