• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Bindings with a custom view
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Bindings with a custom view


  • Subject: Re: Bindings with a custom view
  • From: Steve Israelson <email@hidden>
  • Date: Wed, 27 Jun 2007 16:15:02 -0700

Hmm, thanks.
For some odd reason I was thinking that when I made a change to the view property using setSelectedPhotoIndexes that the binding would get activated. But I guess only KVO would be activated.
I'll look over mmalc's sample more carefully and be sure to do all the icky bits to make sure it happens.


I am not sure why the model has an easy time of it. You just change stuff and the binding know somehow. The view should be like that too i would think with all the complexity in the NSArrayController class.

Hmm, anyway, more reading and stuff.


On 27-Jun-07, at 3:59 PM, Ricky Sharp wrote:


On Jun 27, 2007, at 5:27 PM, Steve Israelson wrote:

I have made a custom view that can show a list of items in a grid like view.
I also have a view of the same list in a table.
I have an NSArrayController bound to both views.


When I make a selection in the NSTableView, I correctly see that same selection in my grid like view.
When I make a selection in my custom view, the NSTableView does NOT mirror the selection.
It seems like the binding for the selected indexes is not working for my custom view.
I can't see why though.
I looked at the KVC docs on ensuring compliance and I think I am compliant.


Is there anything I am missing?

The relevant code is:

@interface PhotoGridView : NSView
{
NSIndexSet *selectedPhotoIndexes;
}
- (NSIndexSet *)selectedPhotoIndexes;
- (void)setSelectedPhotoIndexes:(NSIndexSet *)inSet;
@end

@implementation PhotoGridView
+ (void)initialize;
	{
    [self exposeBinding:@"selectedPhotoIndexes"];
	}
- (NSIndexSet *)selectedPhotoIndexes;
	{
	return selectedPhotoIndexes;
	}
- (void)setSelectedPhotoIndexes:(NSIndexSet *)inSet;
	{
	[selectedPhotoIndexes release];
	selectedPhotoIndexes = [inSet copy];
	[self setNeedsDisplay:YES];
	}
@end

I'm going to assume that you've got some model that is bound to both the table view and photo grid view (property of selectedPhotoIndexes).


Changes to your model should thus be reflected in both the table view and custom view (i.e. model-initiated changes). I believe this already works for you.

When you make a different selection in the table view, that's a "view-initiated" change. The table view is doing the right thing and updating the model which in turn drives a change to your custom view (since it observes changes on your model).

What you now need to ensure is that such "view-initiated" changes work with your custom view. You've got part of the code already there.

Beyond exposing the binding in +initialize, you'll want to look at the implementing the following:

(1) accessors for observed object and observed object key paths. For the attribute with name foo, I tend to have ivars like this:

id observedObjectForFoo;
NSString* observedKeyPathForFoo;

(2) provide an implementation of valueClassForBinding: which will return [NSIndexSet class] if the given binding name is your custom binding. Otherwise, call thru to super

(3) bind:toObject:withKeyPath:options:

(4) unbind:

(5) observeValueForKeyPath:ofObject:change:context:

(6) either setValue:forKey: or setNilValue:forKey: (comes in handy when you're fed nil values for your attribute. You'll often want to replace nil with some default value)


Then, in your custom view, look at all code that can change the selection (most likely either mouseDown and/or keyDown methods you've overridden). I like to create a common method I can call to do all the bindings work. For example, for a custom control that uses a custom "checked_II" binding:


- (void)triggerChangeForChecked_II:(int)newState
{
if ([self observedObjectForChecked_II] != nil)
{
[[self observedObjectForChecked_II]
setValue:[NSNumber numberWithInt:newState]
forKeyPath:[self observedKeyPathForChecked_II]];
}

NSAccessibilityPostNotification ([self cell], NSAccessibilityValueChangedNotification);
}



Definitely check out the graphics and/or joystick bindings examples. Links are found in this list's archives and are on mmalc's pages. Virtually all of my bindings code came from the patterns used in the joystick example.


___________________________________________________________
Ricky A. Sharp         mailto:email@hidden
Instant Interactive(tm)   http://www.instantinteractive.com


_______________________________________________

Cocoa-dev mailing list (email@hidden)

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:
This email sent to email@hidden


References: 
 >Bindings with a custom view (From: Steve Israelson <email@hidden>)
 >Re: Bindings with a custom view (From: Ricky Sharp <email@hidden>)

  • Prev by Date: Re: Bindings with a custom view
  • Next by Date: PDFKit - CurrentPage with scale factor not in 100%
  • Previous by thread: Re: Bindings with a custom view
  • Next by thread: PDFKit - CurrentPage with scale factor not in 100%
  • Index(es):
    • Date
    • Thread