В NSTableView на основе представления как сделать элемент управления первым респондентом одним щелчком мыши?
NSTableView на основе представлений, кажется, имеют только стандартное поведение, при котором для того, чтобы сделать текстовое поле внутри таблицы первым респондентом, пользователь должен либо дважды щелкнуть мышью, либо щелкнуть один раз и "сохранять спокойствие".
Однако, учитывая предложение NSTableView, основанное на представлении гибкости, такое поведение не всегда желательно, поскольку в настоящее время существует много различных и сложных приложений, которые могут быть сделаны не просто за таблицей "старой школы".
Как я могу легко сделать элемент управления (возможно, в ячейке вместе с другими элементами управления) в представлении NSTableView на основе представления одним ответчиком одним щелчком мыши?
1 ответ
Чтобы решить эту проблему, переопределите этот метод в 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
И сразу же верните ДА, чтобы быстро сделать первый ответчик. Таблица "задерживает" создание первого респондента, если текстовое поле было нажато, и не позволяет сделать это, если строка не была выбрана первой.