如何将NSArrayController子类化以在add上选择文本字段:

时间:2014-04-05 03:59:25

标签: objective-c cocoa core-data subclass nsarraycontroller

我很确定这很简单,但我仍然在学习。

我有一个连接到数组控制器的NSTableView来显示coredata对象。该表是不可编辑的。当选择单个记录时,我将子视图设置为可见,其中包含选择的值。

我试图做到这一点,当我在我的阵列控制器上按下连接添加的+按钮时,将创建一个新条目,焦点将跳转到子视图中的项目描述文本字段,当子视图出现时,用户可以无需选择新的arrangeObject行,然后选择文本字段,即可开始输入。

任何想法?

我会发布截图,但我还没有成为这里的用户。

2 个答案:

答案 0 :(得分:4)

Big Nerd Ranch的Cocoa书(第4版)在第9章中有一个例子。它不使用NSArrayController的+ -add:方法作为+按钮,而是使用自定义方法创建对象,将其插入到数组中,处理正在进行的编辑和撤消管理器分组,最后选择所需的字段进行编辑。这是摘录:

- (IBAction)createEmployee:(id)sender
{
NSWindow *w = [tableView window];
// Try to end any editing that is taking place
BOOL editingEnded = [w makeFirstResponder:w];
if (!editingEnded) {
    NSLog(@"Unable to end editing");
    return; }
NSUndoManager *undo = [self undoManager];
// Has an edit occurred already in this event?
if ([undo groupingLevel] > 0) {
    // Close the last group
    [undo endUndoGrouping];
    // Open a new group
    [undo beginUndoGrouping];
}
// Create the object
Person *p = [employeeController newObject];
// Add it to the content array of ’employeeController’
[employeeController addObject:p];
// Re-sort (in case the user has sorted a column)
[employeeController rearrangeObjects];
// Get the sorted array
NSArray *a = [employeeController arrangedObjects];
// Find the object just added
NSUInteger row = [a indexOfObjectIdenticalTo:p];
NSLog(@"starting edit of %@ in row %lu", p, row);
// Begin the edit in the first column
[tableView editColumn:0
                  row:row
            withEvent:nil
               select:YES];
}

完整实施位于https://github.com/preble/Cocoa4eSolutions

答案 1 :(得分:1)

是的,很简单:

请勿使用NSArrayController

只有在完全不需要任何控制的情况下,该课程才适用。如果需要控制,则应创建自己的控制器对象,该对象是表视图的数据源和委托,并具有NSFetchedResultsController以访问核心数据。

就我个人而言,我只使用NSArrayController作为原型。一旦我开始认真对待应用程序,我总是将其抛弃,并将自定义的书面控制器放在其位置。