在NSTableView中不调用textShouldEndEditing

Fno*_*d23 1 xcode nstableview objective-c-2.0 nstableviewcell

当用户添加新的托管对象时,它会显示在一个表格中,该表格向下滚动到新条目,并且新对象的名称(默认值)将进入编辑模式.

我需要检查数据存储区中新对象的名称是否唯一,因此我不能使用格式化程序.我认为我应该验证这一点的最佳时刻是用户尝试使用时提交条目的名称值textShouldEndEditing:.

NSTableView将以下方法子类化并覆盖,只是为了能够在日志中检查它们是否被调用.

- (BOOL)textShouldEndEditing:(NSText *)textObject {
    NSLog(@"textSHOULDendEditing fired in MyTableView");
    return [super textShouldEndEditing:textObject];
}
- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor {
    NSLog(@"control:textShouldEndEditing fired in MyTableView");
    return YES;
}
- (void)textDidEndEditing:(NSNotification *)aNotification {
    NSLog(@"textDIDEndEditing fired in MyTableView");
}
Run Code Online (Sandbox Code Playgroud)

textDidEndEditing:被称为罚款,但textShouldEndEditing:没有.

NSTableView的类参考,在文字的委托方法,这两种方法textShouldEndEditing:,并textDidEndEditing:列出.有人请解释为什么一个人被召唤而另一个没有.


我认为NSTableView作为一个委托的行为NSTextField被实例化为黑盒子委托NSTextFieldCell.因此,在NSTableView类参考中称为委托方法,实际上实现了对象的文本操作方法.NSTextField

我试图宣布这NSTextFieldCell是我的出路NSTableView.我还尝试在声明中声明了几个协议NSTableView.

#import <AppKit/AppKit.h>
#import <Cocoa/Cocoa.h>
@interface MyTableView : NSTableView <NSTextDelegate, NSTextFieldDelegate, NSControlTextEditingDelegate, NSTableViewDelegate, NSTableViewDataSource> {
}
@end
Run Code Online (Sandbox Code Playgroud)

不要笑,我甚至试图将我的表视图声明为自己的代表:P

Enr*_*omo 6

在没有在Apple文档中找到任何结论性答案之后,我在这个问题上整整一天敲了敲头,我决定分享我找到的解决方案,以防其他人在遇到同样的问题.

根据该文件,因为原来的海报提到的,方法control:textShouldBeginEditingcontrol:textShouldEndEditingNSControlTextEditingDelegate应该被称为直接的委托:

此消息由控件直接发送到其委托对象.

此外,Apple发布了技术问答,标题是在NSTableView检测单元格的开始和结束编辑会话,其中明确说明如下:

答:如何在NSTableView中检测单元格的开始和结束编辑会话?

为了检测用户何时开始和结束单元格的编辑会话NSTableView,您需要设置为该表的委托并实现以下NSControl委托方法:

- (BOOL)control:(NSControl *)control textShouldBeginEditing:(NSText *)fieldEditor;

- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor;

该表使用该control:textShouldEndEditing:方法将从文本视图获取的委托消息转发到您的委托对象.这样,您的代理可以被告知文本视图字段编辑器代表它执行哪个控件.

我在Apple的文档中没有发现任何不同的内容,如果有人这样做,那么文档指针真的很值得赞赏.

实际上,如果使用基于单元格的情况,这似乎是正确的NSTableView.但是,只要将表更改为基于视图的表,就不会再在表委托对象上调用委托方法.

一个办法

但是,我执行的一些启发式测试显示,这些委托方法在基于视图的表委托上调用if(据我所知:并且仅在以下情况下):

  • 表委托已设置.
  • 设置了可编辑控件的委托.

如果删除任一委托,NSControlTextEditingDelegate则不会调用协议的方法.

根据(仅)文档的意外是设置可编辑控件的委托.另一方面,设置委托对象以接收委托通知听起来对我来说非常直观,这就是我首先尝试的原因.但有一个问题!但奇怪的是,这不够.如果删除了表委托,NSControlTextEditingDelegate即使设置了可编辑控件的委托,也不会调用这些方法(这对我来说是最奇怪的事情).

希望这有助于其他人不要在这个问题上浪费时间.