Excellent explanation, thanks Quincey.   Interestingly, the 'Select All' menu 
item that sits just under the Delete item (and both of them were already 
present when I started my project) works 'out of the box'  for my NSTableView, 
I did not set any responders or do any validation, etc.

- Koen.


On Apr 15, 2012, at 2:43 PM, Quincey Morris wrote:

> On Apr 15, 2012, at 11:13 , Koen van der Drift wrote:
> 
>> My MainMenu.nib has a 'Delete' menu item that is mapped to the Delete key.  
>> I'd like to use that to remove items from my NSTableView that is connected 
>> to an NSArrayController.  So in the bindings for the Delete menu item, I set 
>> it's availability to myArrayController.canRemove.  However, the Delete menu 
>> item remains grayed out.
>> 
>> Is there anything else I need to do to activate the Delete menu item?
> 
> Aside from the fact that controlling the menu state this way won't work, it's 
> not a valid approach. Even if the only things *your* code can delete are 
> table view items, the Delete menu item needs to be available for editing text 
> fields in any dialogs that pop up.
> 
> Anyway, the reason it doesn't work is that the sequence of events is as 
> follows, when the containing menu is about to be displayed:
> 
> 1. The target of the Delete menu item is determined. The outcome of this step 
> depends on whether it's configured with a specific target or its target is 
> nil (i.e. First Responder).
> 
> 1a. If there's an explicit target, the target must implement the action 
> method, otherwise the menu item is disabled.
> 
> 1b. If there target is nil, the responder chain is traversed looking for a 
> responder that implements the action method. If none is found, the menu item 
> is disabled.
> 
> 2. If the target implements user interface item validation (or one of its 
> variants, such as menu item validation), validation must return YES. Note 
> that validation might pass up the class hierarchy via a 'super' invocation, 
> or be delegated to other objects, depending on the implementation in the 
> target object.
> 
> If the validation returns YES, or if the target doesn't implement validation, 
> then the menu item is enabled, otherwise disabled.
> 
> So, what responder object do you have that implements the 'delete:' action? 
> What object in the responder chain implements user item validation? Note that 
> NSArrayController is not a responder and is not in the responder chain. In a 
> document-based app, a window controller or document would likely be 
> responsible for this sort of thing. In a non-document app, the app delegate 
> or the main window controller would usually do it.
> 
> Note that if you have a delete *button* in your window, you can target its 
> action directly to the array controller, in which case the binding can be 
> used for the button enable state. Menus (being shared app-wide) are different.
> 


_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to