我有以下情况:
在第一个窗口内有一个自定义视图,其中包含一个NSTableView。
在第一个窗口中选择表格视图之后,有第二个窗口充当当前对象的形式。
一些更多的细节:
我已经在NSTableView中实现了setDoubleAction:行为,该行为基本上会打开第二个窗口
表视图绑定到(子类化的)NSArrayController的rangedObjects
第二个窗口中的特定接口元素(双击打开)绑定到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被正确地重新加载,而无需任何进一步的交互。但是,当我用鼠标按“确定”按钮时,似乎什么也没发生。这是有趣的部分:当我现在在第二个窗口消失之后在第一个窗口的表格视图中选择另一行时,先前选择的行(读取:更新的对象)将被正确地重新加载并显示我在第二个窗口中编辑的内容具有绑定到所选内容的界面元素的窗口。
基本上我的实现有效,但是当用户使用鼠标关闭窗口时无效。
我可以发现的唯一区别是currentEvent,但是我无法想象这会如何改变这个简单应用程序的行为。
当我用鼠标按下“确定”按钮时:
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
有什么想法可以解决我的问题吗?
最佳答案
记住响应者链:键盘事件从第一个响应者开始,它将是字段编辑器,然后(如果没有处理)进入下一个响应者,这将是表视图。鼠标事件直接进入用户单击的视图,即按钮。
因此,不同之处在于表视图处理了return事件,但从未看到过鼠标事件。当用户单击时,您只需从按钮获得操作消息-表格视图将处于编辑模式。
解决方案是在执行实际动作之前,让动作方法告诉控制器commit editing。