使用 NSPopUpButtonCell 时在 NSTableView 中获取重复的标题按钮单元格

2023-12-21

我有一个动态 NSTableView,它可以根据提供的数据添加许多列。对于每一列,我将标题单元格设置为 NSPopUpButtonCell。 (旁注:我必须为 NSTableHeaderView 使用自定义子类,否则菜单不会弹出)。除了右上角有一个重复或额外的标题按钮单元之外,一切都运行良好。它完美地反映了先前的列选择,如屏幕截图所示。我的问题是如何阻止 NSTableView 回收以前的弹出标题单元格? (顺便说一句,我尝试过 setCornerView 方法,但这只影响垂直滚动条上方的标题区域。)


这周我遇到了同样的问题。我采取了快速解决方案,

[_tableView sizeLastColumnToFit];

(但是,在与OP讨论后,这要求您在标头中使用 NSPopUpButtonCell 的子类以及 NSTableHeaderView 。我在下面附上我的解决方案)

您可以通过结合此处概述的方法来实现这一点,

  1. 弹出表头单元格 http://www.cocoabuilder.com/archive/cocoa/133285-placing-controls-inside-table-header-view-solution.html#133285
  2. 数据表标题视图 http://forums.macnn.com/79/developer-center/304072/problem-of-nspopupbuttoncell-within-nstableheaderview/

这是一个简化的片段,

// PopUpTableHeaderCell.h
#import <Cocoa/Cocoa.h>
/* Credit: http://www.cocoabuilder.com/archive/cocoa/133285-placing-controls-inside-table-header-view-solution.html#133285 */

@interface PopUpTableHeaderCell : NSPopUpButtonCell
@property (strong) NSTableHeaderCell *tableHeaderCell; // Just used for drawing the background

@end

// PopUpTableHeaderCell.m
@implementation PopUpTableHeaderCell

- (id)init {
    if (self = [super init]){

        // Init our table header cell and set a blank title, ready for drawing
        _tableHeaderCell = [[NSTableHeaderCell alloc] init];
        [_tableHeaderCell setTitle:@""];

        // Set up the popup cell attributes
        [self setControlSize:NSMiniControlSize];
        [self setArrowPosition:NSPopUpNoArrow];
        [self setBordered:NO];
        [self setBezeled:NO];
        [self setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
    }
    return self;
}

// We do all drawing ourselves to make our popup cell look like a header cell
- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView{

    [_tableHeaderCell drawWithFrame:cellFrame inView:controlView];

    // Now draw the text and image over the top
    [self drawInteriorWithFrame:cellFrame inView:controlView];
}

@end

现在来说说 NSTableViewHeader 子类。

//DataTableHeaderView.h
#import <Cocoa/Cocoa.h>

/* Credit: http://forums.macnn.com/79/developer-center/304072/problem-of-nspopupbuttoncell-within-nstableheaderview/ */

@interface DataTableHeaderView : NSTableHeaderView
@end

//DataTableHeaderView.m
#import "DataTableHeaderView.h"

/* Credit: http://forums.macnn.com/79/developer-center/304072/problem-of-nspopupbuttoncell-within-nstableheaderview/ */

@implementation DataTableHeaderView

- (id)initWithFrame:(NSRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
    }
    return self;
}

- (void)mouseDown:(NSEvent *)theEvent {

    // Figure which column, if any, was clicked
    NSPoint clickedPoint = [self convertPoint:theEvent.locationInWindow fromView:nil];
    NSInteger columnIndex = [self columnAtPoint:clickedPoint];
    if (columnIndex < 0) {
        return [super mouseDown:theEvent];
    }

    NSRect columnRect = [self headerRectOfColumn:columnIndex];

    // I want to preserve column resizing. If you do not, remove this
    if (![self mouse:clickedPoint inRect:NSInsetRect(columnRect, 3, 0)]) {
        return [super mouseDown:theEvent];
    }

    // Now, pop the cell's menu
    [[[self.tableView.tableColumns objectAtIndex:columnIndex] headerCell] performClickWithFrame:columnRect inView:self];
    [self setNeedsDisplay:YES];
}

- (BOOL)isOpaque {
    return NO;
}


- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect]; 
    // Drawing code here.
}

@end

您可以在 AppDelegate 中将所有内容绑定在一起-awakeFromNib或类似的,

-(void) awakeFromNib {

    /* NB the NSTableHeaderView class is changed to be an DataTableHeaderView in IB! */

    NSUInteger numberOfColumnsWanted = 5;
    for (NSUInteger i=0; i<numberOfColumnsWanted; i++) {

        PopUpTableHeaderCell *headerCell;
        headerCell = [[PopUpTableHeaderCell alloc] init];

        [headerCell addItemWithTitle:@"item 1"];
        [headerCell addItemWithTitle:@"item 2"];
        [headerCell addItemWithTitle:@"item 3"];

        NSTableColumn *column;
        [column setHeaderCell:headerCell];
        [column sizeToFit];

        [_tableView addTableColumn:column];
    }

    /* If we don't do this we get a final (space filling) column with an unclickable (dummy) header */
    [_tableView sizeLastColumnToFit];

}

除此之外,我还没有弄清楚如何正确纠正该区域的绘图。

看起来像是正在复制的最后一个单元格的图像。因此,我稍微更黑客的方法是在表视图中添加一个带有空白名称的额外列,并故意忽略鼠标点击。希望通过设置最后一列的显示属性,您可以使其看起来像您想要的那样。

我找不到任何允许控制该区域的 NSTableView 或 NSTableViewDelegate 方法,因此可能任何其他解决方案都会非常复杂。我也对一个好的解决方案感兴趣,但我希望这能让您开始!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NSPopUpButtonCell 时在 NSTableView 中获取重复的标题按钮单元格 的相关文章

  • 当我的 Mac 进入睡眠状态时,我的应用程序会发生什么情况?

    当 Mac OS X 进入睡眠状态时 由于关闭笔记本电脑或从 Apple 菜单中选择 睡眠 它如何暂停正在执行的进程 我认为非窗口进程只是在任意执行点挂起 对于 Cocoa 应用程序来说也是如此 还是操作系统会等到控制权返回到运行循环调度程
  • 如何从远程 ssh 连接上运行的 tmux(复制模式)复制到本地剪贴板

    我通过 OS X 上的 VirtualBox 运行 Linux 我通过在无头状态下运行虚拟机 然后使用端口转发 sshing 到 Linux 机器来实现这一点 现在 无论复制到我的虚拟机上的剪贴板 我都可以粘贴到我的远程 ssh 会话上 但
  • NSMenu 未调用 validateMenuItem 或 menuWillOpen

    我的 Mac 应用程序有一个 NSMenu 其委托功能validateMenuItem and menuWillOpen从来没有被调用过 到目前为止 网上的解决方案都没有帮助 看来我做的一切都是对的 菜单项的选择器属于同一类 管理它的类继承
  • 包含 Xcode 上添加的框架的标头

    我想使用一些框架 例如glew and cg所以我手动添加 通过右键单击项目 gt 将文件添加到 来将所需的框架添加到我的项目中 并选择正确的框架 问题是 当我尝试包含头文件时 Xcode 找不到其中任何一个 我希望这张图能帮助理解 And
  • Captive Wifi 弹出窗口:单击链接打开 Safari

    我们的 iOS 设备 ipad iphone 等 网络出现问题 连接到 SSID 后 iphone ipad 立即打开强制网络助手 CNA 它就像一个缩小版的浏览器 没有导航按钮等 显示我们的欢迎页面 准备好让用户在网络中验证他的 MAC
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • Core Data 与 SQLite 3 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java:如何检测(并更改?)System.console 的编码?

    我有一个在控制台上运行的程序 其变音符号和其他特殊字符在 Mac 上以 的形式输出 这是一个简单的测试程序 public static void main String args System out println h h System
  • 如何在 Mac 上运行 virtualenv python

    我正在尝试使用 virtualenv 在我的 mac 上创建虚拟 python 环境 我已经下载了 virtualenv 但是我无法运行它 因为即使我提供了正确的路径 它也找不到我的 python3 安装路径 这是我运行的命令和响应 vir
  • OSX 上的 Java 7 使用 jnlp/webstart 时出现文件名编码问题

    我遇到了这个问题 经过几天的搜索和解决方法尝试均未成功 我现在有一个由 jnlp webstart 分发的内部 java swing 程序 在 osx 和 windows 计算机上 除其他外 它还从 WebDav 下载一些文件 最近 在装有
  • MacOS 中 AVFoundation 和 Metal 的帧速率非常慢

    我正在尝试适应苹果的AVCam滤镜 https developer apple com documentation avfoundation cameras and media capture avcamfilter applying fi
  • localhost 拒绝在 chrome mac 中连接

    我正在使用 webpack dev server 使用此命令运行服务器 npm run dev 当我使用npm start 它工作得很好 但不想这样做 因为它是为了生产 到目前为止我的服务器运行良好http 本地主机 3000 http l
  • 在 macOS 中通过 Python 访问进程的压缩 RAM(顶部的 CMPRS)的方法?

    我试图弄清楚如何从 Python 访问任何给定进程占用的实际 RAM 量 我发现 psutil Process PID memory info rss 工作得很好 直到操作系统决定开始压缩某些进程的 RAM 然后 所有的 memory in
  • 使用 PDFOutline 将 TOC 添加到 Swift/Cocoa 中的 PDFDocument

    我正在开发一个小程序 将多个单页 PDF 合并到一个多页 PDF 中 我正在 Swift4 MacOS Cocoa 中工作 但我一生都无法在 Swift 中找到任何类型的示例来创建大纲 仅遍历现有的大纲 我对此非常熟悉 使用对文档的最佳猜测
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • FileProviderExtension 将不会在 macOS 12.2 中加载

    我是 macOS 开发新手 我正在尝试开发 macOS FileProvider 扩展 一切都很好 直到我将 macOS 从 11 更新到 12 2 更新操作系统后 NSFileProviderManager add domain 不会加载
  • 为什么我的 NSTableView 中的图像淡出?

    首先 有一个NSArrayController 服务器 其内容是 服务器 对象的数组 我也有一个NSTableView与一列 该列绑定到服务器的 arrangedObjects status 属性 我用的是自定义的NSValueConver
  • MacOS Big Sur 中的 NPM 错误“找不到 Python 可执行文件”

    我已经花了整整一周的时间寻找这个问题的答案 但没有成功 我查看了每个 StackOverflow 帖子 Google 的每一篇文章以及我能找到的每个相关的 Github 问题 大多数相关错误似乎都比较旧 所以我想知道我的问题是否由于我使用的
  • 如何在 Cocoa with Core Data 中上传和存储文件?

    我有一个应用程序 我希望能够将文件上传到其中 我可以想象序列化数据 将其放入数组中 然后序列化数组并将其放入核心数据中 但这似乎不太正确 我还可以想象将文件复制到应用程序的支持文件中 获取这些文件的 NSURL 并存储数组或 NSURL 无
  • Intellij 基本完整的 ctrl + space 在 mac 上不起作用

    我在跑步IntelliJ on my macOS Big Sur and ctl space对于基本完整似乎不起作用 我查看了 首选项 gt 键盘映射 gt 代码完成 gt 基本 它似乎按顺序排列 有任何想法吗 发现操作系统本身已经采取了这

随机推荐

  • Intellij 工作表和其中定义的类

    我正在学习 Coursera 的 Scala 函数式编程课程 并发现工作表 repl 出现了奇怪的行为 在课程中 包含以下代码的工作表应在右侧给出以下结果 object rationals val x new Rational 1 2 gt
  • 获取对象为 null 的对象的类型?

    以下代码可以编译 但为什么会出现运行时异常 String b null System out println b getClass 我得到的错误是 java lang NullPointerException 即使对象设置为 null 如何
  • Cocos2d播放2个不同的背景音乐文件或循环播放效果

    我需要为场景提供背景音乐 为角色提供背景音乐 但是当角色做出某些动作时我必须停止它 对于这个问题我必须选择 同时播放2个背景音乐文件 并停止与角色相关的背景音乐文件 循环播放音效 这 2 种中哪一种是可能且推荐的 Regards 你说你正在
  • 非交互式 bash 中的别名[重复]

    这个问题在这里已经有答案了 我想让别名在非交互式 bash 中工作 我运行以下命令 bash c alias toto ls shopt s expand aliases alias toto ls toto 我得到以下信息 bash to
  • SeekBar - 使用上面的 TextView 显示进度

    我正在尝试 肯定很简单 任务 让 TextView 跟随进度条上的拇指并在 TextView 中显示进度 问题是 对于小于最大值一半的进度值 TextView 会向拇指左侧漂移 越来越远离正确位置 反之亦然 当进度值大于最大值一半时 Tex
  • 如何在Java中将getRGB(x,y)整数像素转换为Color(r,g,b,a)?

    我有从中获得的整数像素getRGB x y 但我不知道如何将其转换为 RGBA 格式 例如 16726016应该Color 0 200 0 255 有小费吗 如果我猜对了 你得到的是一个无符号整数的形式0xAARRGGBB so int b
  • JNI - java ArrayList 转换为 c++ std::string*

    我正在尝试使用 C 中的 JNI 进行数据转换 我在工作中遇到了麻烦java s 数组列表 of strings 因为我无法将这样的数据转换为c vector or 标准 字符串 我想知道如果可能的话 如何在不牺牲太多性能的情况下进行这种转
  • 打开本地html页面-java

    在我的 java 控制台应用程序之一中 我正在动态创建 html 页面 现在我想使用默认的网络浏览器打开它 所以你们能帮我解决这个问题吗 Swing java awt Desktop getDesktop browse uri SWT Pr
  • 如何使用C++ Expects 运算符?

    我正在使用 C 启动一个项目 除了少数学校项目之外 我之前从未使用过 C 远远超出了我现在正在处理的范围 我的目标是尽力遵循C 核心指南 https isocpp github io CppCoreGuidelines CppCoreGui
  • 嵌套资源的 Link_to 路由问题

    我有两个模型 作业 和 问题 一份工作有很多问题 而问题又属于一份工作 我已经在模型中设置了资源以及路线 我在尝试 link to questions index 页面上问题控制器的 Show 方法时遇到问题 我的 rake 路线说路径应该
  • selenium 获取元素类和文本

    我无法从以下 html 页面找到 test1 test2 dd class class subclass test1 test2 test3 dd 尝试过 dd contains class class subclass and conta
  • ASP.NET MVC 中的 Google API 图表

    我正在使用 google api 创建一个简单图表 AllowAnonymous public JsonResult PieChart return Json State Total GA 50 AL 30 JsonRequestBehav
  • 类构造函数默认为 void 吗?

    我一直在阅读 C 中的类构造函数 示例显示重载类构造函数 而且他们所有人都没有void关键字并且它们都没有返回值 e g public Class myClass public myClass public myClass int id o
  • Apache Camel AMQP - ActiveMQ AMQP 标头不匹配值 1,期望 0

    我正在尝试创建一个通过 AMQP 与 ActiveMQ 集成的 Apache Camel 应用程序 我一直在按照提供的 骆驼示例 spring jms 项目 它通过标准 TCP 连接 但我已修改为使用我的独立 ActiveMQ 5 8 安装
  • 将 Google Cloud Build 连接到 Google Cloud SQL

    Google Cloud Run 允许使用 Cloud SQL 但是 如果您在 Google Cloud Build 中构建容器时需要 Cloud SQL 该怎么办 那可能吗 背景 我有一个 Next js 项目 它在 Google Clo
  • 对象具有与成员函数不兼容的类型限定符

    我的课Game有一个会员EntityManager entityManager 班上EntityManager有一个私人成员Player player 和公共 getter 函数Player EntityManager getPlayer
  • 减少模板匹配的失误(使用透明模板)

    我正在尝试确定拼图图像上拼图块的位置 我有 拼图的图像 透明 png 拼图板的图像 正确位置周围有白色轮廓 首先 我提取图像 1 上的轮廓 并用它来绘制我的最终模板 然后我将最终模板与拼图板匹配并保存一些结果图像 这是我得到的结果的一些示例
  • 修改常量对象

    我正在查看初级 C 开发人员职位的面试问题 问题是 引用 是下面的代码correct struct Foo int i void foo void const Foo pointer const cast
  • elasticsearch监听多个ip

    是否可以监听多个主机地址 以便我可以监听本地主机请求和私有 IP 请求 就像是 network host 127 0 0 1 192 168 1 4 事实上是的 使用 JSON 表示法 这是我在配置中使用的 network bind hos
  • 使用 NSPopUpButtonCell 时在 NSTableView 中获取重复的标题按钮单元格

    我有一个动态 NSTableView 它可以根据提供的数据添加许多列 对于每一列 我将标题单元格设置为 NSPopUpButtonCell 旁注 我必须为 NSTableHeaderView 使用自定义子类 否则菜单不会弹出 除了右上角有一