在NSTableView中选择和编辑新对象

时间:2012-03-12 11:13:16

标签: objective-c xcode nstableview nsmanagedobject

我正在尝试选择和编辑新添加对象的名称属性。

在OSX上,我有一个数组控制器,它在表视图中显示其内容。我通过AC的属性连接了表列的值(使用绑定)。另外,我将表视图的内容和selectionIndexes绑定设置为指向AC。

我的子类AC在表视图中有一个IBOutlet(称为tableView),并包含来自数据模型的托管对象。

在我的AC中,我重写了add:方法。

- (void)add:(id)sender {
    [super add:sender];
    [[self managedObjectContext] processPendingChanges]; // no effect
    [tableView reloadData]; // no effect
    [tableView scrollRowToVisible:[[self arrangedObjects] count]-1];
}

新添加的对象在选定状态下显示在表视图中(我在IB中设置AC以选择新插入的对象)。但是表格视图向下滚动到倒数第二行,将新行放在可见视图之外。

当我尝试这个时,

[tableView scrollRowToVisible:[tableView selectedRow]];

或者,

[tableView scrollRowToVisible:[self selectionIndex]];

情况更糟:selectionIndex似乎没有正确更新。

- (void)add:(id)sender {
    [super add:sender];
    NSLog(@"selectionIndex = %lu", [self selectionIndex]);
    NSLog(@"number of objects in AC = %lu", [[self arrangedObjects] count]);
}

记录selectionIndex会显示它始终显示上一个选择索引。 记录AC中的对象数总是太少了。

我是否过早地操纵桌面视图?任何想法哪种方法更适合覆盖?


关于编辑部分..

以下语句干扰了上面的scrollRowToVisible:方法,因为最后一个参数似乎也选择了该行。

[tableView editColumn:0 row:0 withEvent:nil select:YES];

无论如何,指定的字段(用于测试目的表的第一行)似乎进入编辑模式只是瞬间闪烁,但随后立即完成编辑。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我提出了一个解决方案:

- (void)rearrangeObjects {
    [super rearrangeObjects];
    [tableView editColumn:0 row:[self selectionIndex] withEvent:nil select:YES];
}

最后一个参数select:YES不会将表格滚动到该行,也不会选择该行。以下行也会滚动表格视图。

[tableView editColumn:0 row:[self selectionIndex] withEvent:nil select:NO];

select:YES选择正在编辑的文本字段中的文字。

不过,我想知道我是否正确对待这个问题。此解决方案要求每个阵列控制器都有一个显示其数据的表视图的出口。这似乎是多余的,因为表视图(及其列)已经绑定到AC。

尝试实现MVC设计模式,不应该负责编辑单元格,是否委托给表视图?

答案 1 :(得分:1)

问题是数组控制器不会立即添加新对象。 documentation for -[NSArrayController add:]说:

  

从Mac OS X v10.4开始,此方法的结果将延迟   直到runloop的下一次迭代,以便出现错误   机制(请参阅错误响应程序和错误恢复)可以提供   反馈作为一张纸。

我不知道有什么优雅的方法来解决这个问题。您可以尝试通过将对象直接添加到数组控制器绑定的add:来绕过NSMutableArray方法。或者,您可以尝试使用performSelector:withObject:afterDelay:,延迟时间为0.1秒,此时应添加对象。