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



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

我明白这一切,但什么是不清楚的是什么建议的课程是为人们写NSControl子类在10.10。所有关于这个主题的Apple指南都没有提到弃用NSCell。我想我可以用旧的方式做事情,但是当苹果将NSCell的弃用提升到下一个级别时,我需要修改我的代码。

甚至有可能实现NSControl子类而不使用NSCell吗?

谁能提供建议或链接我到这个主题的资源?

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

AppKit发布说明OS X v10.10有一个简短的解释发生了什么,这是我最初看到的问题如何创建一个自定义主题的NSButton不子类化NSButtonCell?

逐步弃用NSCell

Mac OS X 10.10朝着最终弃用的方向又迈出了一步细胞。不鼓励直接访问控件的单元格,并且允许它的方法将在后续的释放。各种细胞级api已被推广到各种控件子类,以便提供对重要的单元格的无访问功能。nsslvelindicator, nsstextfield, 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方法发生了什么的详细信息,请参阅此回答。所以这些声明在文档中被划掉了,但这是误导:

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

我没有找到任何关于如何创建NSControl子类而不创建NSCell子类的好信息,尽管显然NSColorWell是一个无细胞的NSControl

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

我也希望这里有更多的信息和建议!

相关内容

  • 没有找到相关文章

最新更新