Ale*_*ski 13 cocoa core-data objective-c
我正在为我的应用程序创建一个源列表,我希望它的结构类似于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的解决方案.
我正在开发一个具有完全相同行为的应用程序,这就是我在做的方式:
我的核心数据模型中有5个主要实体:
AbstractItem-有共同所有的项目,如属性的抽象的实体name,weight和editable.也有两个关系:parent(一对一关系AbstractItem)和children(一对多关系AbstractItem,以及逆parent).Group- 具体的儿童实体AbstractItem.Folder- 具体的儿童实体AbstractItem.向基本Item实体添加多对多关系.SmartFolder- 具体的儿童实体Folder.添加二进制属性predicateData.覆盖Folder的"items"关系访问器返回使用predicateData属性定义的谓词执行获取请求的结果.DefaultFolder- 具体的儿童实体SmartFolder.添加字符串属性identifier.对于"库"部分项目,我插入DefaultFolder对象并为它们提供唯一标识符,以便我可以轻松地检索它们并区分它们.我也给他们一个NSPredicate与Items他们应该展示的东西相对应的东西.例如,"音乐" DefaultFolder将有一个谓词来检索所有音乐项目,"播客" DefaultFolder将有一个谓词来检索所有播客项目等.
根级项目("库","共享","存储","天才"等)都是Group具有nil父级的项目.无法编辑的组和文件夹的editable属性设置为NO.
至于在outlineView中实际获取这些东西,你必须自己实现NSOutlineViewDataSource和NSOutlineViewDelegate协议.这里有太多的行为复杂性来通过一个NSTreeController.但是,在我的应用程序中,我在200行代码中得到了所有的行为(甚至是拖放)(所以它并没有那么糟糕).
不要为了支持视图而在数据集中注入废话.这不仅违背了MVC设计模式,而且还为单个最重要的部分添加了不必要的复杂性(即"更多潜在的错误"):用户数据的管理.
也就是说,在这种特殊情况下使用Bindings会导致如此多的摩擦.为什么不完全避开Bindings?我认为,你使用的是NSOutlineViewDataSource协议,但你没有采取足够的措施.相反,完全依赖于此(仍然完全有效且在某些方面更优越)协议.
您基本上可以交易易于设置(以及易于更改通知)以完全控制树结构.