1

我有一个应用程序,我在其中定义了一个自定义单元格并覆盖了方法 - (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)我有什么替代方法来解决这个问题?

谢谢, 玛丽甘卡

4

2 回答 2

0

我的问题的答案是在我调用 setEnabled 后手动重新绘制,方法是在 NSTextField 上调用 setNeedsDisplay。

我认为这也可能对您有用,因为它会导致手动进行抽签。

哈哈!

-埃里克

于 2013-05-29T18:49:20.533 回答
0

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

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

我注意到的是,当我在父 NSTextField 上调用 setEnabled(从 YES 更改为 NO 或 NO 更改为 YES)时,在我的 NSTextFieldCell 初始化之后,但在该 NSCell 上的 drawWithFrame 被自动调用之前,我的子类 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),因为当没有发生更改时,我没有问题......我认为这是有道理的渲染新图形以向用户显示视图不可选择或不可编辑是没有意义的,因为它确实已经看起来不可选择或不可编辑。

于 2013-05-25T06:16:37.817 回答