2012-04-07 15 views
2

Ich habe derzeit eine Tabellenansicht, mit Zellenansichten, die NSTextFields in ihnen haben. Derzeit auf Zeilenauswahl, ich schicke die Zelle die folgende Meldung mit der Hoffnung auf die Gewährung der NSTextView in der Zelle Ansicht ersten Responder-Status anzuzeigen:Gib NSTextField Fokus -?

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

Weil ich will nicht die NSTextFields editierbar sein wenn die Zeile sie in nicht ausgewählt ist, kann ich dies auch in meiner benutzerdefinierten NSTextField Unterklasse:

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

Update-Code Auswahl: (beachten sie, dass ich wechselnde Zeilenhöhen auch hier)

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

Problem ist, das funktioniert nur halb der Zeit. Wenn ich zum ersten Mal eine Zeile auswähle, kehrt der First-Responder-Status zur Tabellenansicht zurück. Das zweite Mal funktioniert es perfekt und das Textfeld hat den Fokus. Beim dritten Mal bricht es wieder. Der vierte - es ist perfekt! Aus irgendeinem seltsamen Grund funktioniert der Code nur jedes andere Mal ...

Jeder hat eine Idee, warum das so ist? Jede aufschlussreiche Rückmeldung wird sehr geschätzt.

Antwort

2

Beim Wechsel von textField zu textField in einer tableView werden Ereignisse in einer unerwarteten Reihenfolge aufgerufen (bis Sie darüber nachdenken).

Das Problem hier ist die Reihenfolge, in der Ihre Delegiertenmethoden aufgerufen werden.

Angenommen, Sie gehen von textField1 nach textField2.

Sobald TextField1 bereits aktiv ist und Sie klicken auf TextField2, bekommen sie wie folgt aufgerufen:

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

Da textShouldBeginEditing aufgerufen wird, bevor textDidEndEditing (weil es braucht, um sicherzustellen, dass es kann die Zeile auswählen, bevor es gibt seine 'alte') Sie müssen Ihre self.textField in textDidBeginEditing aktualisieren.