繁体   English   中英

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

[英]Aaron Hillegass _Cocoa Programming for Mac OS X_ Chapter 9 Question

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

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

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

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

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

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

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

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)你怎么知道你应该做所有这些事情? Apple的文档中是否有“清单”或其他内容? 经验?

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

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

我认为很可能他没有那些线路就实现了它,有撤消问题,他调试并修复了问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM