在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];
}
答案 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控件。嘿=]我不知道......也许有人有更好的答案。我很乐意学习!
答案 2 :(得分:1)
我认为很可能是在没有这些线路的情况下实现了它,存在撤消问题,他调试并修复了这些问题。