升级至macOS Sonoma后自定义NSTextField的Tooltip不显示
macOS Sonoma下NSTextField Tooltip失效的解决方法
以下是针对自定义NSTextField在Sonoma系统中Tooltip失效的几种可行修复方案:
- 重写NSTextField的跟踪区域逻辑
Sonoma可能对视图的鼠标跟踪区域处理有变化,通过自定义子类确保跟踪区域正确创建:
class TooltipEnabledTextField: NSTextField { override func updateTrackingAreas() { super.updateTrackingAreas() // 清理旧跟踪区域 trackingAreas.forEach { removeTrackingArea($0) } // 添加覆盖整个视图的跟踪区域,支持活跃/非活跃App状态 let trackingArea = NSTrackingArea( rect: bounds, options: [.mouseEnteredAndExited, .activeInActiveApp, .inVisibleRect], owner: self, userInfo: nil ) addTrackingArea(trackingArea) } }
将原代码中的NSTextField()替换为TooltipEnabledTextField()即可。
- 开启父视图的鼠标移动事件接收
Tooltip依赖鼠标移动事件触发,确保包含该NSTextField的父视图允许接收鼠标移动事件:
// 在父视图的初始化方法或awakeFromNib中设置 self.acceptsMouseMovedEvents = true
- 手动添加Tooltip区域并实现代理方法
替代直接设置toolTip属性,手动绑定Tooltip区域并通过父视图返回内容:
- 设置Tooltip区域:
errorField.addToolTipRect(errorField.bounds, owner: self, userInfo: [NSViewToolTipUserInfoKey: errorDetailString])
- 在父视图类中实现Tooltip代理方法:
override func view(_ view: NSView, toolTipFor event: NSEvent, point: NSPoint, userInfo: [String : Any]?) -> String? { guard view == errorField else { return super.view(view, toolTipFor: event, point: point, userInfo: userInfo) } return userInfo?[NSViewToolTipUserInfoKey] as? String }
内容的提问来源于stack exchange,提问作者RRSK01_11
相关产品推荐
相关产品推荐

