Objective-C:我是否正确使用此代表?

时间:2013-04-14 16:37:47

标签: objective-c xcode delegates tableview nstableview

我有一个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的控制器中定义它们吗?

1 个答案:

答案 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中的控制器。