我有一个mainWindowController,它包含一个tabView(我用它在主窗口的视图之间切换)。
我为每个视图都有视图控制器(每个都有一个nib文件)。其中一个视图,视图A,包含一个tableView。我需要使用委托方法来完成某些事情。
经过一两个小时或网络研究和阅读代表(我的新概念)后,我终于得到了我的程序,以达到我想要的结果视图A.
这是视图A的接口声明:
@interface ViewAController : NSViewController <NSTableViewDelegate>
- (BOOL) tableView:(NSTableView *)tableView shouldEditTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row;
如您所见,我正在使用NSTableViewDelegate,我需要禁用表列的编辑。该方法的实现如下:
- (BOOL) tableView:(NSTableView *)tableView shouldEditTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
NSLog(@"shouldEditTableColumn called");
return NO;
}
我使用NSLog来确保调用该函数。
现在在 SAME 视图控制器(视图A)中,我通过单击按钮禁用编辑:
- (IBAction)turnOffEditing:(id)sender
{
[self.tableView setDelegate:self];
[self tableView:self.tableView shouldEditTableColumn:self.columnTableName row:0];
[self tableView:self.tableView shouldEditTableColumn:self.columnTableName row:1];
NSLog(@"turnOffEditing");
}
如您所见,我从视图控制器获取tableView并将委托分配给self。
然后我在self上调用shouldEditTableColumn方法。
现在,一切正常。但是,这是使用委托的正确方法吗?如果我需要为视图A使用更多的NSTableView委托方法(唯一一个有表的视图),我假设我可以像以前一样在View A的控制器中定义它们吗?
答案 0 :(得分:2)
通常,委托从一开始就是委托。也就是说,在-turnOffEditing:
动作方法中设置委托有点奇怪。当然,为了我的工作建议,你需要从委托方法返回一些动态值,比如布尔标志实例变量的值。
此外,您不应该在action方法中自己调用委托方法。这没什么。委托是框架在需要决定如何行事时调用的内容。
因此,我会将您的代码更改为:
@property BOOL editingDisabled;
- (BOOL) tableView:(NSTableView *)tableView shouldEditTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
NSLog(@"shouldEditTableColumn called");
return self.editingDisabled;
}
- (IBAction)turnOffEditing:(id)sender
{
self.editingDisabled = TRUE;
NSLog(@"turnOffEditing");
}
您需要在设置期间设置委托。一个好的方法是简单地将表视图的委托插座连接到NIB中的控制器。