在OS X 10.10中,我能否实现一个没有NSCell的NSControl?

9
我正在学习NSControl。我知道在OS X 10.10 Yosemite中,NSCell已经开始逐渐被淘汰了,因此我不想使用即将被废弃的API。此外,NSControl类参考显示所有的单元格访问器都已经被弃用。
我理解这一点,但不太清楚对于在10.10上编写NSControl子类的人来说推荐的做法是什么。所有关于这个主题的苹果指南都没有提到NSCell的弃用。我猜我可以按照旧方法进行,但这样的话当苹果进一步弃用NSCell时就需要修改我的代码了。
是否有可能完全不使用NSCell来实现NSControl子类呢?
有人能给予建议或提供有关这个主题的资源链接吗?这很难通过谷歌搜索得到。

我无法找到在不使用NSCell的情况下对NSControl进行子类化的方法。这是因为NSControl仍然依赖于NSCell(即使它已被弃用)。如果您需要构建一个独特的自定义用户界面控件(比如音量控制),那么最好是子类化NSView。但是,如果您需要自定义标准的NSControl,那么调整NSCell属性甚至“轻量级子类化”NSCell都不应该成为问题。 - Vlad
1个回答

5
我也在试图解决这个问题。很抱歉我无法回答你所有的问题,但是以下是我迄今为止找到的内容。
OS X v10.10 的 AppKit 发布说明(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 都有新属性来实现此目的。基于单元格的 NSTableView 现已停用,应改用基于视图的 NSTableView。基于矩阵的 NSBrowser 也已停用,建议使用基于项目的界面。
10.10 文档确实在很多 NSControl 方法上用红色划掉了。(顺便说一句,我不确定这是否明确意味着 "已停用"。)
但是,关于 continuous 和 enabled 的文档标记是具有误导性的。然而,我查看了 NSControl 的头文件中文档划掉的声明,似乎有几件事情正在发生:
  1. This method is deprecated with 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. These methods appear in an NSDeprecated category:

    @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. These methods appear in the documentation as "Available in OS X v10.8 through OS X v10.9", but not in the NSControl header file, so I assume they've been removed completely:

    -userInterfaceLayoutDirection
    -setUserInterfaceLayoutDirection
    
  4. These declarations were previously methods, but have been refactored into properties. See this answer for details about what happened to the isEnabled / setEnabled methods. So these declarations are crossed out in the docs, but this is misleading:

    @property (getter=isContinuous) BOOL continuous;
    @property (getter=isEnabled) BOOL enabled;
    
我没有找到如何创建一个不必创建NSCell子类的NSControl子类的好方法,尽管显然NSColorWell是一个无单元格的NSControl
我的初步结论是NSControlNSCell相当强烈地耦合在一起,使用其中的一个而不使用另一个是不明智的。因此,我正在考虑编写一个NSView的子类。
我也希望能够获得更多信息和建议!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接