2012-04-07 3 views
2

私は現在、それらの内部にNSTextFieldsを持つセルビューを持つテーブルビューを持っています。 現在、選択した行の上に、私は、細胞が細胞ビューファーストレスポンダの状態でNSTextViewを付与することを期待して、次のメッセージを表示送るよ:私はNSTextFieldsが編集可能になりたくないのでNSTextFieldにフォーカスを与える - ?

- (void)notifyOfSelectionInWindow:(NSWindow *)window { 
    [[self textField] setEditable:YES]; 
    [[self textField] setSelectable:YES]; 
    // make textField (textView) first responder 
    [[self textField] selectText:nil]; 
    [[[self textField] currentEditor] setSelectedRange:NSMakeRange([[[self textField] stringValue] length], 0)];  
} 

を彼らはしている行が選択されていない場合、私はまた私のカスタムNSTextFieldサブクラスでこれを実行します。

- (void)textDidEndEditing:(NSNotification *)notification { 
    [self setEditable:NO]; 
    [self setSelectable:NO]; 
    [super textDidEndEditing:notification]; 
} 

選択更新コードを:

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row { 
    // get the table veiw to animate/recalculate height of row 
    NSMutableIndexSet *changedRows = [NSMutableIndexSet indexSet]; 
    [changedRows addIndex:row]; 
    [changedRows addIndex:[tableView selectedRow]]; 
    [tableView noteHeightOfRowsWithIndexesChanged:changedRows]; 
    [rowView notifyOfSelectionInWindow:[self window]]; 
    //^this in turn calls a method of the same name of the corresponding cell view 
    return YES; 
} 
(私もここに行の高さを変えてることに注意してください)

問題は、これは時間ののの半分だけの作品です。最初に行を選択しようとすると、最初のレスポンダのステータスがテーブルビューに戻ります。 2回目は完全に動作し、テキストフィールドにはフォーカスがあります。 3回目に、再び壊れます。 4番目は完璧です!いくつかの奇妙な理由のために、コードは他の時間にのみ動作します...

これはなぜそうですか?どんな啓発的なフィードバックも高く評価されます。

答えて

2

tableViewでtextFieldからtextFieldに切り替えると、予期しない順序でイベントが呼び出されます(これを考えるまで)。

ここでの問題は、デリゲートメソッドが呼び出される順序です。

あなたがtextField1からtextField2に行くとしましょう。

テキストフィールド1がすでにアクティブであり、あなたがのTextField2をクリックすると、彼らはこのように呼ばれます:それは前の行を選択できることを確認する必要があるのでtextShouldBeginEditingが(textDidEndEditing前に呼び出されるため

textShouldBeginEditing (textField2) 
textShouldEndEditing (textField1) 
textDidEndEditing  (textField1) 
textDidBeginEditing  (textField2) 

あなたのself.textFieldtextDidBeginEditingに更新する必要があります)。

関連する問題