[英]Sorting NSTableColumn with NSArrayController
我有一个NSArrayController绑定到NSTableView,所以表列如下所示:
NSTableView bindings:
Content -> ArrayController.arrangedObjects
SelectionIndexs -> ArrayController.arrangedObjects
SortDescriptors -> ArrayController.sortDescriptors
NSTableColumn bindings:
Value -> ArrayController.arrangedObjects.description
当我尝试使用列标题对它进行排序时,它会崩溃,例如
error setting value for key path sortDescriptors of object NSArrayController
有任何想法吗?
我今天正为同样的问题而苦苦挣扎。
似乎将tableView的内容和selectionIndexes绑定到阵列控制器IB > inspector window > select your tableView > bindings tab
,可以通过单击表头来禁用排序。 这是有道理的,因为表格视图现在向您显示了阵列控制器的确切内容(和顺序)。
我在IB中取消选中了这些绑定,还从表列IB > inspector window > select your NSTableColumn > attributes pane
删除了所有排序键。 选中表格列的绑定选项卡中的Creates Sort Descriptor
复选框。 尽管我认为将表的sortDescriptor绑定到“ Shared User Defaults Controller
可以节省您退出应用程序时的排序,但是表上不需要sortDescriptor。
如果需要对表进行排序,请将sortDescriptor放在数组控制器上,也许放在awakeFromNib
。
- (void)awakeFromNib {
[super awakeFromNib];
[self setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"propertyOfYourObject" ascending:YES selector:@selector(compare:)]]];
}
这不会影响单击表列标题。
我无法在数组控制器上获得sortDescriptor来处理绑定。
在您的绑定尝试中,我看到了几个问题。
通常不需要绑定NSTableView
。 将特定NSTableColumn
的值绑定到NSArrayController就足够了。
您尝试将某些内容绑定到.description属性。 请记住-“ 描述 ”就像是Obj-C中的“保留字”。 任何NSObject都应在其“ description”方法中以NSString
出现。 当您在调试器中放置po <object>
或通过“%@”将NSObject
传递给NSLog时,这就是所谓的。 所以...可能您想将自己的属性重命名为其他名称。
您根本不需要绑定NSArrayController
或NSTableView
或NSTableColumn
的排序描述符。 碰巧,当你绑定一个NSTableColumn
的价值, NSArrayController
的arrangedObjects
的NSTableColumn
(实际上是NSColumnHeader
)对象知道所设置的NSArrayController
的sortDescriptor
为你列的值绑定指定一个相同的路径-当您单击列标题时。 换句话说,如果您仅将列的值绑定到NSArrayController的rangedObjects,则通过单击列标题进行排序是免费的。
有关表绑定的文档不好而且令人沮丧。 有多种使用表的方案,调试绑定问题是一个真正的噩梦。 但是,网上有很多文章和教程。
希望这可以帮助。
让我建议您一个简单的方法-
NSTableColumn bindings:
Value ->
Bind to: ArrayController
Controller Key : arrangedObjects
Model Key Path : keyPath (such as name)
如果您不熟悉在表视图中使用绑定,那么本文将对您有很大帮助-
编辑:项目搬迁到Github。 (没有更多说明-仅代码)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.