You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至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区域并通过父视图返回内容:
  1. 设置Tooltip区域:
errorField.addToolTipRect(errorField.bounds, owner: self, userInfo: [NSViewToolTipUserInfoKey: errorDetailString])
  1. 在父视图类中实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:07:28