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

时间:2010-02-03 02:45:00

标签: objective-c cocoa xcode cocoa-bindings appkit

在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];
}

我有两个问题:

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];
}

3 个答案:

答案 0 :(得分:4)

  

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

你是对的,大多数人做初始实现都不会出现这个代码。 (我猜这就是为什么它出现在书中。你可以从Aaron的经验中受益)。

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

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

  

2)如果您不得不自己重写所有方法,这是否会破坏数组控制器的整个目的?

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

答案 1 :(得分:2)

1)他正在做那些实现他的程序所需功能的东西。它不是一个Apple的东西(就像我在遵守这样的协议时必须实现的代理方法),但这是他的程序的流程。可能有一百万种方法可以解决这个问题。

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的第一条消息,[w makeFirstResponder:w];我们可以从这里(http://developer.apple...NSWindow/makeFirstResponder)找到NSWindow的实例支持makeFirstResponder消息。我对NSWindow这样做的理解是,当用户与之交互时,它将成为第一个响应者,换句话说,它将接收NSWindow的任何动作。通过它,我的意思是'w'。

  

1)你怎么知道你应该的   做那些东西?有没有   苹果公司的'清单'或其他东西   文档?经验?

很棒的问题 - 我认为它带来了经验并且使用了所有不同类型的类和UI控件。嘿=]我不知道......也许有人有更好的答案。我很乐意学习!

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

答案 2 :(得分:1)

我认为很可能是在没有这些线路的情况下实现了它,存在撤消问题,他调试并修复了这些问题。