Aaron Hillegass _适用于Mac OS X的编程_第9章问题

chr*_*yal 5 xcode cocoa objective-c appkit cocoa-bindings

在Aaron Hillegass的" Mac OS X可可编程"第9章"插入时开始编辑"一节中,他解释了如何做到这一点.这让我感到困惑,虽然事情是,他做了一堆其他的东西.这是完整的代码清单:

- (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]) {
    // 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];
[p release];
// 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
int row = [a indexOfObjectIdenticalTo:p];
NSLog(@"starting edit of %@ in row %d", p, row);

// Begin the edit in the first column
[tableView editColumn:0
                  row:row
            withEvent:nil
               select:YES];
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

1)你怎么知道你应该做所有这些事情?Apple的文档中是否有"清单"或其他内容?经验?

2)如果您还必须自己重写所有方法,这是否会破坏阵列控制器的整个目的?

编辑:我主要想知道他是如何知道的那样:(因为其他一切都非常基本且明显)

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]) {
    // Close the last group
    [undo endUndoGrouping];
    // Open a new group
    [undo beginUndoGrouping];
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*ren 4

1)你怎么知道你应该做所有这些事情?Apple 文档中有“清单”或其他内容吗?经验?

你是对的,大多数进行初始实现的人都不会想到该代码。(我想这就是本书中的原因。您可以从亚伦的经验中受益)。

该代码可能是一个或多个错误报告的结果。换句话说,您最初不会想出该代码,但您最终会想出该代码。

亲自尝试一下。删除该代码,然后查看是否可以发现正在运行的应用程序中的问题。解决这些问题需要结合 SDK 知识和调试技巧。两者都随着经验的增长而成长。

2)如果您仍然必须自己重写所有方法,这是否会破坏数组控制器的全部目的?

有人可能会说,像这样修改表格视图行为的能力是数组控制器的全部要点(作为应用程序设计的一个元素)。