On 17 Jan 2010, at 16:30, Brad Stone wrote:

> Here's why I need this - I've been trying to solve this problem for 2 weeks!
> 
> This issue all revolves around a NSCollectionView.  Each CollectionViewItem 
> has a view containing a NSTextField, NSDatePicker, NSButton (checkbox), and 
> an NSLevelIndicator.  The selection index of my CollectionView is binded to 
> the selection index of an NSArrayController.  The problem I having is if the 
> user performs a mouseDown in the TextField I need to update the 
> selectionIndex of the array controller so the CollectionView will show the 
> appropriate view as selected. Without this, the wrong view is selected.  
> Here's a quick example:
> 
> 1) click the add button twice to create two items in my collectionView.  
> Items with index 0 and 1.  Since item 1 was the last one created, it is 
> selected (I have it showing a grey box).
> 2) click your mouse into the text field of the item at index 0 and start 
> typing
> 
> The user would expect item 0 to be the selected item but it's not.  The array 
> controller still thinks item 1 is selected.  It needs to be told otherwise.  
> If the user pressed the remove button item 1 would be removed.  
> 
> This is why I want to fire an action when the user inserts into the text 
> field (just like I do when the user clicks the checkbox).  I want to change 
> the selectedObject in the array controller.  The problem I'm having with 
> subclassing the NSTextField is I can't figure out how to get the 
> CollectionViewItem from the subclassed TextField.  
Does -superview not do the trick?

Sometimes when I need to activate views on mouse clicks I use the following 
approach.
Subclass NSWindow and register the views I need click detection in with 
NSWindow - addClickView:
In NSWindow -sendEvent: I check to see if we have a hit and dispatch a message 
on the view
Might help you out.

@interface MGSClickWindow : NSWindow {
        NSHashTable *_clickViews;
}
- (void)addClickView:(NSView *)aView;
@end

@implementation MGSClickWindow
/*
 
 NSWindow designated initialiser
 
 */
- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle 
backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation
{
        if ((self = [super initWithContentRect:contentRect 
styleMask:windowStyle backing:bufferingType defer:deferCreation])) {
                _clickViews = [NSHashTable hashTableWithWeakObjects];
        }
        
        return self;
}
/*
 
 add a click view
 
 click view must be a sub view of the NSWindow contentView
 
 */
- (void)addClickView:(NSView *)aView
{
        if ([aView isDescendantOf:[self contentView]] && [aView 
respondsToSelector:@selector(subviewClicked:)]) {
                
                // _clickViews will maintain a weak ref to aView so we don't 
need
                // to remove it
                [_clickViews addObject:aView];
        }
}

/*
 
 send event
 
 This action method dispatches mouse and keyboard events sent to the window by 
the NSApplication object.
 
 */
- (void)sendEvent:(NSEvent *)event
{
        
        // look for mouse down
        if ([event type] == NSLeftMouseDown) {
                
                // look for deepest subview
                NSView *deepView = [[self contentView] hitTest:[event 
locationInWindow]];
                if (deepView) {
                        for (NSView *aClickView in [_clickViews allObjects]) {
                                if ([deepView isDescendantOf:aClickView]) {
                                        [(id)aClickView 
subviewClicked:deepView];
                                        break;
                                }
                        }
                }                       
        }
        
        [super sendEvent:event];

}

@end



> If I could I could then execute my method to update the ArrayController.  I 
> tried creating an IBOutlet to the CollectionView, the ArrayController and the 
> CollectionViewItem but they all come back as nil.  I think I read here that 
> IBOutlets don't work in this instance.  I also tried setting up my own 
> Notification but the CollectionViewItem never receives it (other objects do).
> 
> This is tricky, any help you may have would be appreciated.
> 
> Brad
> 
> 
> 
> On Jan 17, 2010, at 6:12 AM, Graham Cox wrote:
> 
>> 
>> On 17/01/2010, at 3:56 PM, Brad Stone wrote:
>> 
>>> I was able to capture the mouseDown event in the field but only in a 
>>> subclass which is causing me problems elsewhere.
>> 
>> 
>> Indeed, a mouse click is not the only reason a field might become focused - 
>> the user could tab into it as well.
>> 
>> Overriding -becomeFirstResponder should do it.
>> 
>> Taking a step back though, WHY do you need to get notified here? What are 
>> you trying to do? There might be a better way.
>> 
>> --Graham
>> 
>> 
>> 
>> 
> 
> _______________________________________________
> 
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
> 
> 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:
> http://lists.apple.com/mailman/options/cocoa-dev/jonathan%40mugginsoft.com
> 
> This email sent to jonat...@mugginsoft.com

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to