2012-06-21 20 views
7

View-basierte NSTableViews scheinen nur das Standardverhalten zu haben. Um ein Textfeld in der Tabelle als First Responder zu definieren, muss der Benutzer entweder einen Doppelklick oder einen einzelnen Klick ausführen und "Ruhe bewahren".Wie können Sie in einem View-basierten NSTableView ein Steuerelement mit einem einzigen Klick zum Ersthelfer machen?

Angesichts der Flexibilität Sicht-basierte NSTableViews Angebot, ist dieses Verhalten nicht immer wünschenswert, da es jetzt viele verschiedene und komplexe Anwendungen möglich sind als nur eine "old school" -Tabelle.

Wie kann ich leicht eine Kontrolle (möglicherweise in einer Zelle zusammen mit anderen Steuerelementen) innerhalb einer Sicht-basierte NSTableView der Ersthelfer mit einem einzigen Klick machen?

Antwort

21

Um dies zu lösen, überschreiben diese Methode auf NSTableView:

@interface NSResponder (NSControlEditingSupport) 

/* This is a responder chain method to allow controls to determine when they should become first responder or not. Some controls, such as NSTextField, should only become first responder when the enclosing NSTableView/NSBrowser indicates that the view can begin editing. It is up to the particular control that wants to be validated to call this method in its -mouseDown: (or other time) to determine if it should attempt to become the first responder or not. The default implementation returns YES when there is no -nextResponder, otherwise, it is forwarded up the responder chain. NSTableView/NSBrowser implements this to only allow first responder status if the responder is a view in a selected row. It also delays the first responder assignment if a doubleAction needs to (possibly) be sent. 'event' may be nil if there is no applicable event. 
*/ 
- (BOOL)validateProposedFirstResponder:(NSResponder *)responder forEvent:(NSEvent *)event NS_AVAILABLE_MAC(10_7); 

@end 

Und Rückkehr JA sofort die firstResponder zu setzen, damit schnell werden. Die Tabelle "verzögert" den Ersthelfer, wenn ein Textfeld getroffen wurde, und lässt es nicht zu, es sei denn, die Zeile wurde zuerst ausgewählt.