5

アーロンヒレガスのMacOSX用Cocoaプログラミングの第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];
}

これに関して2つの質問があります。

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

3 に答える 3

4

1)あなたはあなたがそれらすべてのことをすることになっていることをどうやって知っていますか?Appleのドキュメントに「チェックリスト」などはありますか?経験?

そうです、そのコードは、最初の実装を行うほとんどの人には発生しません。(それが本にある理由だと思います。アーロンの経験から利益を得ることができます)。

そのコードは、1つ以上のバグレポートの結果としてもたらされたはずです。つまり、最初はそのコードを思い付くことはありませんが、最終的には思い付くでしょう。

自分で試してみてください。そのコードを削除して、実行中のアプリケーションの問題を見つけることができるかどうかを確認してください。これらの問題を解決するには、SDKの知識とデバッグスキルの組み合わせが必要です。どちらも経験とともに成長します。

2)それでもすべてのメソッドを自分で書き直す必要がある場合、これはアレイコントローラーの目的全体を無効にしませんか?

そのようなテーブルビューの動作を変更する機能は、(アプリケーションの設計の要素としての)配列コントローラーの要点であると主張する人もいるかもしれません。

于 2010-02-03T04:20:14.177 に答える
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と対話したときに、それが最初のレスポンダーになる、つまり、NSWindowのアクションを受け取るようにすることです。そしてそれによって、私は「w」を意味します。

1)あなたはあなたがそれらすべてのことをすることになっていることをどうやって知っていますか?Appleのドキュメントに「チェックリスト」などはありますか?経験?

すばらしい質問です。これには、さまざまな種類のクラスとUIコントロールすべての経験と操作が含まれていると思います。heh=]わかりません...誰かがもっと良い答えを持っているかもしれません。学びたい!

良いリンクが見つかりました:http://www.cocoadev.com/index.pl?FirstResponder

于 2010-02-03T03:17:25.483 に答える
1

彼はそれらの行なしでそれを実装した可能性が高いと思います。元に戻る問題があり、問題をデバッグして修正しました。

于 2010-02-03T04:21:40.880 に答える