NSTableView,NSArrayController 和仅在按键后重新加载?

Posted

技术标签:

【中文标题】NSTableView,NSArrayController 和仅在按键后重新加载?【英文标题】:NSTableView, NSArrayController and reload only after key press? 【发布时间】:2010-04-01 15:47:04 【问题描述】:

我有以下情况:

    在包含 NSTableView 的第一个窗口内有一个自定义视图。 在第一个窗口内选择表格视图后,还有第二个窗口,它充当当前对象的表单。

更多细节:

我在 NSTableView 中实现了 setDoubleAction: 行为,基本上打开了第二个窗口 表格视图绑定到(子类)NSArrayController 的排列对象 第二个窗口(双击打开)中的特定界面元素绑定到 NSArrayController 的选择 我继承了 NSArrayController 并修改了以下函数:

一开始我改了addObject:(或者add:,这个无所谓):

- (void)addObject:(id)object

    [super addObject:object];
    [self saveTemplatesToDisk];

然后我改变了删除:

- (void)remove:(id)sender

    [super remove:sender];
    [self saveTemplatesToDisk];

打开首选项表的操作只是一行:[NSApp beginSheet:preferenceWindow modalForWindow:[_preferenceView window] modalDelegate:nil didEndSelector:NULL contextInfo:NULL]; 用户按下返回键/确定按钮后执行的代码也不复杂。

它只是将阵列控制器的当前内容保存到磁盘并关闭第二个窗口:

- (IBAction)endPreferenceSheet:(id)sender

    [templateArrayController saveTemplatesToDisk];

    [NSApp endSheet:preferenceWindow];
    [preferenceWindow orderOut:nil];

最后这是我的问题/疑问

当我在第二个窗口中按下返回键时,窗口关闭,数据被保存并且 NSTableView 被正确地重新加载,无需任何进一步的交互。但是当我用鼠标按下 OK 按钮时,似乎什么也没有发生。这是有趣的部分:当我现在在第二个窗口消失后在第一个窗口的表视图中选择另一行时,先前选择的行(读取:更新的对象)被正确重新加载并显示我在第二个窗口中编辑的内容界面元素绑定到所选内容的窗口。

基本上我的实现可以工作,但当用户使用鼠标关闭窗口时就不行了。

我能发现的唯一区别是 currentEvent,但我无法想象这会如何改变这个简单应用程序的行为。

当我用鼠标按下 OK 按钮时:NSEvent: type=LMouseUp loc=(563.055,30.1484) time=58450.2 flags=0 win=0x0 winNum=5371 ctxt=0x0 evNum=8093 click=1 buttonNumber=0 pressure=0 subtype=NSTabletPointEventSubtype deviceID=0 x=19469 y=15838 z=0 buttons=0x0 pressure=0.000000 tilt=0.453108, -0.140629 rotation=0.000000 tangentialPressure=0.000000 vendor1-3=(0, 0, 0) 当我按下回车键时:NSEvent: type=KeyDown loc=(0,300) time=58474.8 flags=0 win=0x0 winNum=5371 ctxt=0x0 chars=" " unmodchars=" " repeat=0 keyCode=36

有什么想法可以解决我的问题吗?

【问题讨论】:

是的,但这有关系吗? 【参考方案1】:

记住响应者链:键盘事件从第一个响应者开始,这将是字段编辑器,然后(如果没有处理它)转到下一个响应者,这将是表视图。鼠标事件直接进入用户点击的视图,也就是按钮。

所以,区别在于表格视图处理返回事件,但它从不看到鼠标事件。当用户单击时,您只需从按钮中获得一条操作消息 — 表格视图仍处于编辑模式。

解决方案是在执行实际操作之前让操作方法告诉控制器commit editing。

【讨论】:

我完全忘记了响应者链。感谢您提出的解决方案,它可以正常工作。据我了解,当用户双击一行时,表格视图会更改为编辑模式。你从哪里得到这些信息? setDoubleAction: 不清楚这个主题,我认为当表格视图未设置为可编辑时,它不会更改为编辑模式。以及为什么编辑模式对reloadData有影响? Rafael:你现在谈论的是几个全新的主题。您应该再发布两个问题,每个问题一个。

以上是关于NSTableView,NSArrayController 和仅在按键后重新加载?的主要内容,如果未能解决你的问题,请参考以下文章

NSTableView 意外调整大小

NSTableView 委托不工作/不填充单元格

macOS开发之NSTableView的应用详解 - 转

如何根据文本内容增加 NSTableView 中的行高?

NSTableView,NSArrayController 和仅在按键后重新加载?

放弃 NSTableView 行为