作者atst (电脑无法阻止人类做蠢事)
看板MacDev
标题Re: [问题] 请问NSButton跟NSButtonCell的关系
时间Mon Apr 28 15:40:59 2008
※ 引述《Devon22 ()》之铭言:
: NSButon -> NSButtonCell
: NSTextField -> NSTextFieldCell
: 如上面这些物件,请问NSButtonCell跟NSButton差在哪里呢?
: 我一直搞不懂Cell的用途..
The NSCell class provides a mechanism for displaying text or images
in an NSView object
without the overhead of a full NSView subclass.
It’s used heavily by most of the NSControl classes to implement
their internal workings.
上面这段是从NSCell的Overview中取来的.
简单的说, NSControl是外皮,真正在做事的是NSCell。
举例来说,NSButton 继承自NSView, 同时NSButton预设会在内部产生一个NSButtonCell.
当要画出一个Button的样子的时候,NSButton会从NSView的DrawRect开始,
在DrawRect内再呼叫NSButtonCell,询问NSButtonCell想要画成什麽样子.
同样的,当使用者点击Button时,也依照类似的流程在走.
这里比较令人困惑的是,为何Apple要做这种设计呢?
会何不直接让NSButton处理一切?而宁愿多加一层NSButtonCell?
在Control vs Cell 为 1 vs 1的情况下,这种设计并没有明显的好处。
然而当Control vs Cell为 1 vs N的情况下,就有很明显的好处了。
首先,Control只需要负责排列Cell的位置,而Cell的外观与反应,
都可以交由Cell自己决定.在这种情形下,Control可搭配不同的Cell,而做出更多变化.
例如,我们可以在一个Popup menu中,同时呈现文字的menu与图形的menu。
而所需做的,只是替换cell。
另一个好处,则可以参考Finder的行为。当不同类型的档案,同时呈现时,
我们可以看到影片档有影片档的preview icon,文字档有文字档的preview icon。
若是我们想在没有cell的情况下, 实现这种功能, control就必须同时有处理文字档
与影像档的功能,同时,一但有新的档案类型,就必须将功能加以扩张。
可是若是以现在的架构,当有新的档案类型时,只要使用新的Cell替代原有的Cell,
即可加以呈现.
以上讲的比较粗略,若想更进一步了解,
http://developer.apple.com/documentation/Cocoa/Conceptual/ControlCell/ControlCell.html
会是一个不错的进入点。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.84.126.49
1F:推 Devon22:感谢说明,虽然还无法完全理解但总算有个概念了 04/28 22:11