objective-c - 自定义 NSCell drawWithFrame :inView method not getting invoked in OSX 10. 8

标签 objective-c macos cocoa

我有一个应用程序,我在其中定义了自定义单元格并覆盖了该方法 - (void)drawWithFrame:inView:

只要我在 OS X 10.6 或更早版本上使用 Xcode 3.2 构建应用程序,此方法就可以毫无问题地绘制我的自定义单元格。

现在我正在尝试迁移代码以在 OS X 10.8 上使用 Xcode 4+ 进行构建。我发现我的自定义单元不再被绘制。设置断点并通过调试器运行应用程序后,我意识到自定义单元格的重写 - (void) drawWithFrame:inView: 方法根本没有被调用。

我的问题是:

1) 是什么使得这个方法在 OS X 10.8 上根本不被调用,而在 OS X 10.6 或更早版本上却被调用并且工作得很好?

2)我必须采取什么替代方案来解决此问题?

谢谢, 姆里甘卡

最佳答案

我遇到了同样的问题,除了我在 OSX 10.7 上使用 xcode 4.x

也许它是 xcode 4.x 的东西?

我注意到的是,当我在初始化我的 NSTextFieldCell 之后但在该 NSCell 上的 drawWithFrame 之前,在父 NSTextField 上调用 setEnabled (从 YES 更改为 NO 或从 NO 更改为 YES)时,我的子类 NSTextFieldCell 上的 drawWithFrame 不会被调用自动调用。

但是,如果我调用 setEnabled (在初始化我的子类 NSTextFieldCell 之后)并且没有发生任何更改(即 setEnabled:YES 但它已设置为 YES),则确实会调用 drawWithFrame。

不幸的是,我需要执行从 YES 到 NO 到 YES 的 setEnabled,因为我想在进行服务器调用时禁用我的 NSTextField,然后在回调中启用它。如果回调是(例如“密码错误”),我需要自定义将 NSTextFieldCell 边框绘制为红色..并且我必须通过覆盖 drawWithFrame 来完成此操作。

我的猜测是 setEnabled 使用 NSGraphicsContext 并执行 savesGraphicsState/restoreGraphicsState (可能是错误的),这会抛出 NSTextFieldCell/drawWithFrame 中使用的图形上下文。

我的猜测是,setEnabled 中的 NSGraphicsContext 仅在发生更改时才会使用(setEnabled 从 YES 变为 NO 或从 NO 变为 YES),因为当未发生更改时,我没有问题......我认为这是有意义的渲染新图形来向用户显示该 View 不可选择或不可编辑是没有意义的,因为它确实看起来不可选择或不可编辑。

关于objective-c - 自定义 NSCell drawWithFrame :inView method not getting invoked in OSX 10. 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16412124/

相关文章:

iphone - 如何通过示例学习 OpenGL,例如,构建一个旋转的地球仪?

objective-c - 有没有办法在浏览器上将 Cocoa 应用程序作为工作表打开?

cocoa - 子类化 NSButton,需要使其看起来像常规按钮

ios - NSDictionary 的不区分大小写的键

ios - DataSource Pattern 与 UITableView 一起使用是依赖注入(inject)的示例吗?

ios - NSNotFound 不适用于 NSUser 默认值

iphone - NSMutableArray 已填充但数据以某种方式丢失

macos - 如何制作一个没有装饰器的窗口应用程序(没有关闭、最小化、最大化按钮以及没有边框)

python - 无法在 Mac 上运行 'keyboard.is_pressed'

c# - 二维 NSMutableArray 有帮助吗?