【问题标题】:In OS X 10.10, can I implement an NSControl without an NSCell?在 OS X 10.10 中,我可以在没有 NSCell 的情况下实现 NSControl 吗?
【发布时间】:2015-08-25 03:20:58
【问题描述】:

我正在了解NSControl。我知道NSCell 已经开始在 OS X 10.10 Yosemite 中弃用,所以我宁愿不使用即将消失的 API。此外,NSControl 类参考显示所有单元格访问器已被弃用。

我明白这一切,但不太清楚的是,对于在 10.10 上编写 NSControl 子类的人推荐的课程是什么。有关该主题的所有 Apple 指南均未提及弃用 NSCell。我想我可以按旧方式做事,但是当 Apple 将 NSCell 的弃用提升到一个新的水平时,我需要更改我的代码。

是否甚至可以在不使用NSCell 的情况下实现NSControl 子类?

谁能提供建议或将我链接到有关此主题的资源?事实证明这很难用谷歌搜索。

【问题讨论】:

  • 如果不使用NSCell,我看不到子类NSControl 的方法。很简单,因为NSControl 仍然依赖于NSCell(即使它已被弃用)。如果您需要构建一个独特的自定义用户界面控件(例如音量控制),那么子类化NSView 可能会更好。但是,如果您需要自定义标准NSControl,那么调整NSCell 属性甚至是NSCell 的“轻量级子类化”应该不是问题。

标签: macos cocoa osx-yosemite nscell nscontrol


【解决方案1】:

我也在努力解决这个问题。很遗憾,我无法回答您的所有问题,但这是我目前发现的。

AppKit Release Notes for OS X v10.10 简要解释了正在发生的事情,我最初在问题How to create a custom themed NSButton without subclassing NSButtonCell? 中看到了这一点。

逐步弃用 NSCell

Mac OS X 10.10 朝着最终弃用 细胞。不鼓励直接访问控件的单元格,并且 允许它的方法将在随后的正式弃用 发布。多种细胞级 API 已被提升为多种 控制子类以提供对重要的无细胞访问 功能。 NSLevelIndicator、NSTextField、NSSearchField、NSSlider、 和 NSPathControl 都有用于此目的的新属性。基于细胞的 NSTableViews 现在被弃用了,基于视图的 NSTableViews 应该是 改为使用。基于矩阵的 NSBrowsers 也被弃用,取而代之的是 基于项目的界面。

10.10 文档确实有许多 NSControl 方法用红色划掉。 (顺便说一句,我不确定这是否明确表示“已弃用”。)

但是,continuousenabled 的文档标记具有误导性。我在文档中被划掉的声明中查看了 NSControl 的头文件,似乎发生了一些不同的事情:

  1. 此方法已弃用 NS_DEPRECATED_MAC:

    // Use formatters instead.  See -[NSControl formatter] and -[NSControl setFormatter:].
    - (void)setFloatingPointFormat:(BOOL)autoRange left:(NSUInteger)leftDigits right:(NSUInteger)rightDigits NS_DEPRECATED_MAC(10_0, 10_0);
    
  2. 这些方法出现在NSDeprecated 类别中:

    @interface NSControl (NSDeprecated)
    
    // Use formatters instead.  See -[NSControl formatter] and -[NSControl setFormatter:].
    - (void)setFloatingPointFormat:(BOOL)autoRange left:(NSUInteger)leftDigits right:(NSUInteger)rightDigits NS_DEPRECATED_MAC(10_0, 10_0);
    
    + (void)setCellClass:(Class)factoryId;
    + (Class)cellClass;
    
    - (id)cell;
    - (void)setCell:(NSCell *)aCell;
    - (id)selectedCell;
    - (NSInteger)selectedTag;
    
    - (void)setNeedsDisplay;    // Use setNeedsDisplay:YES instead.
    - (void)calcSize;
    
    - (void)updateCell:(NSCell *)aCell;
    - (void)updateCellInside:(NSCell *)aCell;
    - (void)drawCellInside:(NSCell *)aCell;
    - (void)drawCell:(NSCell *)aCell;
    - (void)selectCell:(NSCell *)aCell;
    
    @end
    
  3. 这些方法在文档中显示为“在 OS X v10.8 到 OS X v10.9 中可用”,但不在 NSControl 头文件中,因此我认为它们已被完全删除:

    -userInterfaceLayoutDirection
    -setUserInterfaceLayoutDirection
    
  4. 这些声明以前是方法,但已被重构为属性。有关 isEnabled / setEnabled 方法发生了什么的详细信息,请参阅this answer。所以这些声明在文档中被划掉了,但这是误导性的:

    @property (getter=isContinuous) BOOL continuous;
    @property (getter=isEnabled) BOOL enabled;
    

我没有找到任何关于如何在不创建NSCell 子类的情况下创建NSControl 子类的好信息,尽管NSColorWell 显然是一个无单元格NSControl

我目前的粗略结论是NSControlNSCell 的耦合度相当高,不使用另一个是不明智的。所以我正在考虑改写一个NSView 子类。

我也希望在这里获得更多信息和建议!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2016-07-23
    • 2012-08-04
    • 1970-01-01
    • 2018-10-15
    相关资源
    最近更新 更多