浏览器视图提供了一个用户界面,用于从数据列表或目录路径等分层组织的数据列表中显示和选择项。
本文讨论如何使用浏览器。关于浏览器视图提供关于浏览器的基本信息,并描述了当您选择浏览器项时会发生什么。浏览器界面特性描述了如何控制浏览器外观的某些方面。使用浏览器委托描述如何使用委托来填充浏览器中的数据。
关于浏览器视图
浏览器视图提供了一个用户界面,用于从数据列表或目录路径等分层组织的数据列表中显示和选择项。在处理数据层次结构时,级别显示在列中,列从左到右编号,以0开头。浏览器是由NSBrowser类实现的,它的每个列都包含一个NSScrollView
,其中包含一个填充了NSBrowserCells
的NSMatrix
。NSBrowser
依靠委托在它的NSBrowserCells
中提供数据。
浏览器视图如何工作
NSBrowser
列中的每个条目都是NSBrowser Cell。这个单元格可以是分支单元格(如目录)或叶单元格(如文件)。一个分支cell显示一个图片,表示当该cell被点击时,浏览器视图将会显示一个新的NSBrowserCell
列。为了显示新列,NSBrowser
会自己发送addColumn
消息,addColumn
消息会通知它的委托加载下一列。NSBrowserCell也可以加载或卸载,加载的NSBrowserCells
已经设置好状态,准备好显示了。如果你的代码需要访问一个特定的NSBrowserCell
,可以使用NSBrowser的LoadedCellAtRow:column:
方法。
用户的选择可以表示为字符串,如果选中的是多层的文件(如一个目录中的文件),则选中节点之前的路径用“/”分割。要使用其他字符作为分隔符,调用NSBrowser
的setPathSeparate
方法。
一个浏览器视图可以设置为每列允许选择多个cell或者限制为单选。当设置为单选时,它也可以设置为仅对叶子cell允许多选,或者允许同时选中两个类型的cell。
因为NSBrowser
继承自NSControl
,因此它有一个目标对象和动作消息。每次用户在每列中选择一个或多个cell时,浏览器视图会发送它的动作消息给目标对象。NSBrowser
还添加了当用户双击一个条目时发送的操作,这允许用户在不采取任何操作的情况下选择条目,然后双击调用一些有用的操作,比如打开一个文件。
因为NSBrowserCell
不继承NSActionCell
,它不持有目标和动作值,不能直接参与目标/动作范例。但是,NSBrowser
的动作方法可以使用selectedCell
方法获得最后一个选中的NSBrowserCell
。
浏览器界面特性
NSBrowser
的用户界面特性可以通过多种方式改变。NSBrowser
的水平滚动器可有可无。(相反,NSBrowser
的列总有一个垂直滚动器-内容不多时滚动器可能会看不见)。正常情况下不应该创建一个没有水平滚动器的NSBrowser
,如果那样做的话,必须要保证NSBrowser足够容纳所有的列并能正常显示。一个NSBrowser
的列或许是有边框有标题、有边框无标题或者是无边框无标题。一个列标题或许可以从左边选中的列中得到,或者可以通过NSBrowser
或它的代理直接指定。
图1 介绍一个NSBrowser的示例。
从上图中可以看出用户界面方面的东西:
- 浏览器标题:可以通过在xib中的Title属性设置
NSBrowser
的标题 - 列标题:可以通过NSBrowser的实例方法
setTitle:ofColumn:
改变每列的标题,注意,如果在Interface Builder中设置浏览器的Title属性,它将显示在列0的标题的位置。 - 分支指示器(Branch indicator):这个指示器是根据对应的
NSBrowserCell
对isLeaf消息的响应而显示的,指示符的存在告诉用户,当他们单击单元格时,右侧的列将显示该单元格下分层关联的信息。
使用浏览器委托
NSBrowser需要使用一个代理去提供给他需要展示的数据。该代理负责提供数据,并负责设置每个项目为分支或叶子cell、可用或不可用。它还可以接收事件通知,比如滚动,以及可能已经更改的列的验证请求。
可以执行两个类型的代理中的任何一个:主动或者被动。主动代理创建列的行(即NSBrowserCells
)本身,然而被动式代理把此部分任务交给了NSBrowser。通常,建议使用被动式代理,因为它更方便调用。一个主动式代理必须执行browser:createRowsForColumn:
去创建一个特定列的行。另一方面,被动式代理必须执行browser:numberOfRowsInColumn:
让NSBrowser知道需要创建多少行。以上两个方法是互斥的,只能执行其一,不能同时执行。(NSBrowser确定它拥有哪种类型的委托,委托通过哪种方法响应。)
两种类型的代理在单个cell显示之前均执行browser:willDisplayCell:atRow:column:
方法去设置状态(如设置cell的文字以及是否是分支cell或者叶子cell),(该代理方法无需调用NSBrowserCell的setLoaded:
方法,因为NSBrowser可以自身决定其状态。)主动式代理可以在创建单元格时设置所有单元格的状态,在这种情况下,它不需要实现browser:willDisplayCell:atRow:column:
方法,但是被动式代理必须始终执行该方法。
转载自原文链接, 如需删除请联系管理员。
原文链接:Browsers简介,转载请注明来源!