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

时间:2010-04-01 15:47:05

标签: cocoa cocoa-bindings nstableview reload nsarraycontroller

我有以下情况:

  1. 第一个窗口中有一个包含NSTableView的自定义视图。
  2. 在第一个窗口内选择表视图后面有第二个窗口作为当前对象的表单。
  3. 更多细节:

    • 我在NSTableView中实现了setDoubleAction:行为,基本上打开了第二个窗口
    • 表视图绑定到(子类)NSArrayController
    • 的arrangeObjects
    • 第二个窗口中的特定界面元素(双击打开)绑定到NSArrayController的选择
    • 我已经将NSArrayController子类化并修改了以下函数:

    起初我改变了addObject :(或添加:,这并不重要):

    - (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 个答案:

答案 0 :(得分:2)

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

因此,不同之处在于表视图处理返回事件,但它永远不会看到鼠标事件。当用户点击时,您只需从按钮获取操作消息 - 表格视图保持编辑模式。

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