0

我有一个包含 tabView 的 mainWindowController(我用来在主窗口上的视图之间切换)。

我有每个视图的视图控制器(每个都有一个 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 委托方法(唯一具有表的视图),我假设我可以像以前一样在视图 A 的控制器中定义它们?

4

1 回答 1

2

通常,委托人从一开始就是委托人。-turnOffEditing:也就是在action方法中设置delegate有点奇怪。当然,为了使我的建议起作用,您需要从委托方法返回一些动态值,例如布尔标志实例变量的值。

此外,您不应该在操作方法中自己调用委托方法。那没有任何作用。委托是框架在需要决定如何表现时调用的东西。

因此,我会将您的代码更改为:

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

于 2013-04-14T16:59:22.353 回答