Aaron Hillegass《Cocoa Programming for Mac OS X》第9章问题

5
在Aaron Hillegass的《Cocoa Programming for Mac OS X》一书中,第9章的名为“Begin Editing on Insert”的部分详细解释了如何实现这一功能。然而,让我感到困惑的是他还做了许多其他的事情。以下是完整的代码列表:
- (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];
}

我有两个问题:
1)你是如何知道需要做所有这些事情的?苹果文档中是否有“清单”或其他东西?还是经验?
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];
}

1
这是一个很好的问题,我同意书中没有充分解释。正如一些答案所指出的那样,这实际上更多地取决于经验。 - Rob Keniger
3个回答

4

1) 你怎么知道你应该做所有这些事情?苹果的文档里有清单之类的东西吗?还是经验?

你说得对,大多数人在初始实现时不会想到那段代码。(我猜这就是为什么它出现在书中。你可以从Aaron的经验中受益)。那段代码可能是一个或多个错误报告的结果。换句话说,你不会最初想出那段代码,但你最终会想到。

试试自己做。删除那段代码,然后看看运行应用程序时是否能发现问题。解决这些问题需要结合SDK知识和调试技能。两者都随着经验而增长。

2) 如果你仍然需要重写所有方法,这不是让数组控制器失去了意义吗?

有人可能会认为修改表视图的行为能力就是数组控制器(作为应用程序设计元素)的全部意义。


2

1) 他正在实现程序所需的功能。这不是苹果公司的事情(比如,当遵循某个协议时,我需要实现哪些委托方法),而是他的程序流程。可能有无数种方法来解决这个问题。

2) 不确定你的意思,但他似乎在使用许多内置方法 - 我没有看到他真正地重新发明轮子(例如:)

Person *p = [employeeController newObject];

// Add it to the content array of 'employeeController'
[employeeController addObject:p]; // <-- built in method
[p release]; // <-- built in method
// Re-sort (in case the user has sorted a column)
[employeeController rearrangeObjects]; // <-- built in method

// Get the sorted array
NSArray *a = [employeeController arrangedObjects]; // <-- built in method

// Find the object just added
int row = [a indexOfObjectIdenticalTo:p]; // <-- built in method

编辑

好的,对于第一条消息“[w makeFirstResponder:w]”,我们可以从这里找到相关信息(http://developer.apple...NSWindow/makeFirstResponder),该消息是NSWindow类支持的。我理解对NSWindow执行此操作是为了使其成为第一响应者,也就是说,它将接收NSWindow的任何操作。而“w”指的就是NSWindow。

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

非常好的问题-我认为这需要经验和使用各种类型的类和UI控件。呵=] 我不知道...也许有人有更好的答案。我很想学习!

找到一个好的链接:http://www.cocoadev.com/index.pl?FirstResponder


谢谢回复。不过请看我对问题所做的修改。我主要想知道他是如何知道添加处理第一响应者和撤销管理器的代码行的。 - chrisgoyal

1

我认为很可能他在没有那些代码行的情况下实现了它,然后出现了撤销问题,他进行了调试并修复了这些问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接