在源列表中显示固定和可编辑的项目

Ale*_*ski 13 cocoa core-data objective-c

背景

我正在为我的应用程序创建一个源列表,我希望它的结构类似于iTunes,有两种类型的项目:

  • "固定"项目 - 这些项目不会更改,也无法移动 - 位于顶部
  • 编辑项下,这可以由用户来改变-到处移动,重命名等(在iTunes例如,像播放列表和智能播放列表)

在我的iTunes比喻中:

iTunes来源列表http://perspx.com/wp-content/uploads/2010/02/itunessourcelist.jpg

到目前为止,我构建数据的方式如下:

  • 我想要编辑的项目是"组"项,以Group核心数据实体的形式.
  • 源列表中的每个项目都表示为SourceListItem常规的Objective-C对象,以便我可以将每个项目与标题,图标,子项目等相关联.
  • 固定项目当前由SourceListItem实例表示,存储在我的控制器对象的数组中.

问题

我不确定如何将这两种类型的项目合并到源列表中,以便固定项目位于顶部并始终存在且不会更改,可编辑项目位于底部,可以移动和编辑.

这些是我到目前为止提出的想法:

  • 将固定项添加到Core Data模型.这意味着我可以创建一个实体来表示源列表项,并将我的固定和可编辑项放在这些项的实例中.然后可以使用Array/Tree Controller将这些绑定到Outline View表列.但是,这意味着我必须创建一个新实体来表示源列表项,然后将其Group与此同步.我还必须有一些方法只创建一次所有固定项目,如果任何持久存储文件发生了某些事情,那么固定项目将不会显示.

  • 将固定项目与组项目合并.虽然两者都存储在单独的数组中,但是当Outline View请求数据时(如果采用NSOutlineViewDataSource协议,而不是绑定),这可以在我的窗口的控制器中完成.但是,这意味着我必须为SourceListItem阵列控制器中的每个组创建新的s(将每个组与图标和其他属性相关联),存储这些,然后观察组阵列控制器以进行更改以删除,添加或修改SourceListItem实例对组进行更改.

有没有人对如何实现这个有更好的想法?

我希望我的应用程序与OS X v10.5兼容,所以我更喜欢任何依赖于安装Snow Leopard的解决方案.

Dav*_*ong 7

我正在开发一个具有完全相同行为的应用程序,这就是我在做的方式:

我的核心数据模型中有5个主要实体:

  1. AbstractItem-有共同所有的项目,如属性的抽象的实体name,weighteditable.也有两个关系:parent(一对一关系AbstractItem)和children(一对多关系AbstractItem,以及逆parent).
  2. Group- 具体的儿童实体AbstractItem.
  3. Folder- 具体的儿童实体AbstractItem.向基本Item实体添加多对多关系.
  4. SmartFolder- 具体的儿童实体Folder.添加二进制属性predicateData.覆盖Folder的"items"关系访问器返回使用predicateData属性定义的谓词执行获取请求的结果.
  5. DefaultFolder- 具体的儿童实体SmartFolder.添加字符串属性identifier.

对于"库"部分项目,我插入DefaultFolder对象并为它们提供唯一标识符,以便我可以轻松地检索它们并区分它们.我也给他们一个NSPredicateItems他们应该展示的东西相对应的东西.例如,"音乐" DefaultFolder将有一个谓词来检索所有音乐项目,"播客" DefaultFolder将有一个谓词来检索所有播客项目等.

根级项目("库","共享","存储","天才"等)都是Group具有nil父级的项目.无法编辑的组和文件夹的editable属性设置为NO.

至于在outlineView中实际获取这些东西,你必须自己实现NSOutlineViewDataSourceNSOutlineViewDelegate协议.这里有太多的行为复杂性来通过一个NSTreeController.但是,在我的应用程序中,我在200行代码中得到了所有的行为(甚至是拖放)(所以它并没有那么糟糕).


Jos*_*zzi 5

不要为了支持视图而在数据集中注入废话.这不仅违背了MVC设计模式,而且还为单个最重要的部分添加了不必要的复杂性(即"更多潜在的错误"):用户数据的管理.

也就是说,在这种特殊情况下使用Bindings会导致如此多的摩擦.为什么不完全避开Bindings?我认为,你使用的是NSOutlineViewDataSource协议,但你没有采取足够的措施.相反,完全依赖于此(仍然完全有效且在某些方面更优越)协议.

您基本上可以交易易于设置(以及易于更改通知)以完全控制树结构.