在OS X 10.10中,我可以在没有NSCell的情况下实现NSControl吗?

时间:2015-06-10 03:48:21

标签: macos cocoa yosemite nscell nscontrol

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

我理解这一切,但不清楚的是,在10.10上编写NSControl子类的人推荐的课程是什么。有关该主题的所有Apple指南均未提及NSCell的弃用。我想我可以用旧的方式做事,但是当Apple将NSCell的弃用推进到下一个级别时,我需要更改我的代码。

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

任何人都可以提供建议或将我链接到有关此主题的资源吗?这证明很难谷歌。

1 个答案:

答案 0 :(得分:4)

我也试图解决这个问题。我不能不幸地回答你所有的问题,但这是我迄今为止所发现的。

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应该是   用来代替。基于矩阵的NSBrowser也被弃用了   基于项目的界面。

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;
    
  5. 我没有找到关于如何创建NSControl子类而没有创建NSCell子类的任何好信息,尽管显然NSColorWell是无单元NSControl

    我目前的粗略结论是NSControlNSCell相当强烈地结合在一起,并且使用一个而不是另一个是不明智的。所以我正在考虑改写NSView子类。

    我也非常感谢您提供更多信息和建议!