2011-04-03 90 views
14

我想改善我的KVC/KVO/Cocoa-Bindings-fu,并想知道可能是什么原因来继承NSArrayController?子类化NSArrayController的原因是什么?

+0

太糟糕了没有更多的答复;这是一个有趣的问题,而我那愚蠢的小技巧几乎不能抓住主题的表面。 – 2011-04-05 09:24:57

+0

确实。我会尝试在线共享... – Eimantas 2011-04-05 10:06:19

回答

16

我有一个自定义NSArrayController子类,执行一大堆任务。我选择在那里实现这些东西,因为我可以享受绑定和东西的全部舒适。这是我现在用这个:

  • 有时候一些项目必须被隐藏,有些必须显示
  • 我执行自定义排序(即分组)控制器
  • 它是由一个项目喂不同的类比它返回(获取项目,返回项目节点 - 虚拟对象,转发最多的东西)
  • 我也用它来保存当前显示的筛选条件和搜索选项
  • 此外,我添加了NSTableView委托和数据源支持,允许拖动在控制器
  • 我还可以自定义工具提示的细胞中有

呀,等等0降权的实现。基本上,这一切归结为这个精髓:子类NSArrayController的,如果你想不同的数据进行比你

把最大

+0

信息性列表Max;你在做什么来定制工具提示? – 2011-05-07 16:36:08

+0

@Mike Abdullah:它是NSTableView委托的一部分,我只是实现了这个方法:'tableView:toolTipForCell:rect:tableColumn:row:mouseLocation:' – 2011-05-12 10:44:04

8

使用带有表格视图的阵列控制器时,我喜欢做的一件事是覆盖add:以发布通知,以便选择新项目并立即打开并进行编辑。我实际上是在CocoaDev张贴这在前段时间:

// Subclass of NSArrayController 

- (void)awakeFromNib 
{ 
    [[NSNotificationCenter defaultCenter] addObserver: self 
              selector: @selector(objectAdded:) 
               name: @"Object Added" 
               object: self] 
} 

- (void)add: (id)sender 
{ 
    [super add: sender] 
    NSNotification * note = [NSNotification 
           notificationWithName: @"Object Added" 
               object: self] 
    // The add method doesn't really take effect until this run loop ends, 
    // (see NSArrayController docs) so the notification needs 
    // to wait to post. Thus, enqueue with NSPostWhenIdle 
    [[NSNotificationQueue defaultQueue] enqueueNotification: note 
               postingStyle: NSPostWhenIdle] 
} 

- (void)objectAdded: (NSNotification *)note 
{ 
    // when the notification finally arrives, tell the table to edit 
    [[self contentTable] editColumn:0 
            row:[self selectionIndex] 
           withEvent:nil 
           select:YES] 
} 

当然,这是可以做到与控制器,这不是一个NSArrayController子类相似;这只是我想出的第一种方式。

+0

您可以重写'-addObject:'而不是'-add:'并正常发布通知 – 2011-05-07 16:37:09

1

我有一个应用程序,当用户添加一个对象时需要设置一个隐藏的文件名 - 自定义ArrayController类中的add方法只是这样做的地方。

编辑 - 其实,重新读我的Hillegas,重写newObject是更好的方法。但它仍然需要NSArrayController的子类。

0

我子类阵列控制器在调用返回所需的对象 - (ID)NEWOBJECT;

正常情况下,您的项目中的每个类都有.h &.m文件,并且阵列控制器通过读取这些文件来根据类的名称创建特定的对象。

但是,如果您只有一个.h.m文件或​​基于您的neeed可以返回任何对象(例如:employee,customer,通过读取存储的模式定义)的类(例如:Entity),则必须子类arraycontroller,因为类名称保持不变(实体)是否需要员工对象或客户对象。

0

我使用NSArrayController的子类来命名用于在我的Core Data应用程序中添加和删除对象的撤销/重做操作。
(这不是我自己的想法,信贷发给用户@MikeD谁回答my question on this matter。)

重写- newObject方法。

- (id)newObject 
{ 
    id newObj = [super newObject]; 

    NSUndoManager *undoManager = [[[NSApp delegate] window] undoManager]; 
    [undoManager setActionName:@"Add *insert custom name*"]; 

    return newObj; 
} 

也是- remove:sender方法。

- (void)remove:(id)sender 
{ 
    [super remove:sender]; 

    NSUndoManager *undoManager = [[[NSApp delegate] window] undoManager]; 
    [undoManager setActionName:@"Remove *insert custom name*"]; 
}