我想改善我的KVC/KVO/Cocoa-Bindings-fu,并想知道可能是什么原因来继承NSArrayController?子类化NSArrayController的原因是什么?
回答
我有一个自定义NSArrayController子类,执行一大堆任务。我选择在那里实现这些东西,因为我可以享受绑定和东西的全部舒适。这是我现在用这个:
- 有时候一些项目必须被隐藏,有些必须显示
- 我执行自定义排序(即分组)控制器
- 它是由一个项目喂不同的类比它返回(获取项目,返回项目节点 - 虚拟对象,转发最多的东西)
- 我也用它来保存当前显示的筛选条件和搜索选项
- 此外,我添加了NSTableView委托和数据源支持,允许拖动在控制器
- 我还可以自定义工具提示的细胞中有
呀,等等0降权的实现。基本上,这一切归结为这个精髓:子类NSArrayController的,如果你想不同的数据进行比你
把最大
信息性列表Max;你在做什么来定制工具提示? – 2011-05-07 16:36:08
@Mike Abdullah:它是NSTableView委托的一部分,我只是实现了这个方法:'tableView:toolTipForCell:rect:tableColumn:row:mouseLocation:' – 2011-05-12 10:44:04
使用带有表格视图的阵列控制器时,我喜欢做的一件事是覆盖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
子类相似;这只是我想出的第一种方式。
您可以重写'-addObject:'而不是'-add:'并正常发布通知 – 2011-05-07 16:37:09
我有一个应用程序,当用户添加一个对象时需要设置一个隐藏的文件名 - 自定义ArrayController类中的add方法只是这样做的地方。
编辑 - 其实,重新读我的Hillegas,重写newObject是更好的方法。但它仍然需要NSArrayController的子类。
我子类阵列控制器在调用返回所需的对象 - (ID)NEWOBJECT;
正常情况下,您的项目中的每个类都有.h &.m文件,并且阵列控制器通过读取这些文件来根据类的名称创建特定的对象。
但是,如果您只有一个.h.m文件或基于您的neeed可以返回任何对象(例如:employee,customer,通过读取存储的模式定义)的类(例如:Entity),则必须子类arraycontroller,因为类名称保持不变(实体)是否需要员工对象或客户对象。
我使用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*"];
}
- 1. 是什么原因
- 2. 嵌套类的原因是什么
- 3. 类型化数据集奇怪行为的原因是什么?
- 4. 'System.IO.IsolatedStorage.IsolatedStorageException'的原因是什么?
- 5. UnsupportedClassVersionError的原因是什么?
- 6. ChangeConflictException的原因是什么?
- 7. 什么是UnsatisfiedLinkError的原因?
- 8. RejctedExecutionException的原因是什么?
- 9. PlatformID.MacOSX是什么原因?
- 10. java.lang.reflect.InvocationTargetException:这是什么原因?
- 11. “BUG:调度原子?”的可能原因是什么?
- 12. 子类化UIView的正确基本原理是什么?
- 13. 'NSInternalInconsistencyException',原因:不是NSManagedObject的子类。'
- 14. 什么是原子商店类型?
- 15. SendAsync失败的原因是什么?
- 16. @ font-face失败的原因是什么?
- 17. Classformat异常的原因是什么?
- 18. sqlite回滚的原因是什么?
- 19. AADSTS90009的主要原因是什么?
- 20. xgboost速度慢的原因是什么?
- 21. Spring STS挂起的原因是什么?
- 22. .htaccess不准确的原因是什么
- 23. 这个NoMethodError的原因是什么?
- 24. 什么是MySQL的原因:Errorno 150
- 25. StageWebView失败的原因是什么?
- 26. InputStream为空? openStream的原因是什么?
- 27. fsockopen()错误的原因是什么?
- 28. 以下错误的原因是什么?
- 29. 这是什么错误的原因
- 30. 这是什么原因造成的?
太糟糕了没有更多的答复;这是一个有趣的问题,而我那愚蠢的小技巧几乎不能抓住主题的表面。 – 2011-04-05 09:24:57
确实。我会尝试在线共享... – Eimantas 2011-04-05 10:06:19