• 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
Undo the binding value
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Undo the binding value


  • Subject: Undo the binding value
  • From: "Liviu Andron" <email@hidden>
  • Date: Mon, 10 Mar 2008 01:52:48 +0200

Dear all,

The problem, shorty:
  I cannot undo a bounded control's value in the KVO events chain

////////////////////////////////////////////////////////////

A) The situation
	(I'm not using a Mac right now, so some names might be wrong.)
 - multiple nibs, some controls with bounded values. They go to the
"main" controller in the main nib using key paths like
this:	"preferences.component1.blabal1",
"preferences.component1.blabal2",
"preferences.component2.blabal1",
"someOtherPreferences.component1.blabal1" (through "base nib object
controller")
 - the main controller exposes methods like "preferences",
"someOtherPreferences" through a "base binding controller"
(NSUserDefaultsController ... see below)
	the binding controller isn't exposed to Interface Builder - can this
be a problem ?
 - settings aren't to be saved to the application defaults, the
binding controller knows better (the correct location)
 - modifying an exposed setting might require user interaction and possibly undo

////////////////////////////////////

B) derived NSUserDefaultSController solution


NSUserDefaultSController seemed to be the most promising solution
(initialValues seemed to be great), but I succeded only by using some
workarounds:
 - coudn't force the initialization using KVC (?):
   solution: enumerate de bindings from the view(s) and identify by
prefix (preferences, someOtherPreferences) => setObjectValue
 - I managed to avoid the final synchronize (with the application
defaults) only by catching the "application termination notification"
and remove the bindings added in the meantime

I can obtain the same behaviour by replacing NSUserDefaultSController with ...
	NSObject (and some NSMutableDictionarys, already necessary to load
the initial settings)
	(:) and not checking "Validates immediately" which throws some
message box with the error ... "Error")

////////////////////////////////////

C) The Big Bad problem

I cannot undo the modified value (in the user interface) if necessary
  => observeValueForKeyPath:ofObject:change:context: (or
setValue:forKeyPath in the "base nib object controller")
	I have the new value and I managed to know the old one

	-calling explicitly setValue:forKeyPath changes the value in the
controller (model), but not in the user-interface
		(I also managed to avoid the recursivity)
	-calling directly setObjectValue (yes, I managed to retrieve the
NSControl itself) changes the user interface, with or without the
previous step:
		- doesn't go through observeValue..., which is good
		- !!! ... but it skips the next user interface modification on the
same binding

The events path: 1) user changes something in NsControl A -> 2)
setValue:forKeyPath get notified -> 3) observerValue... (the base
controller) ->
4) [A setObjectValue:oldValue] (step 2 or 3) 5) user sees the old
value in A, but changes again -> no 2) or 3)

////////////////////////////////////

D) New solutions

I can implement some setPreferences, setSomeOtherPreferences methods,
but not in every nib controller for every setting.
I can try to show the controls as 'disabled' and require the user
interaction before => no undo will be generaly necessary, but:
	- an interface redesign is necessary
	- the situation can still appear in extreme cases

A final very low solution:
  - get the bindings to a dictonary, unbind and setAction/setTarget
	(that's it ... eliminate the bindings for good)

Thanks in advance,
	Liviu Andron
_______________________________________________

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

  • Prev by Date: Re: How to get the name of a method at runtime?
  • Next by Date: How to avoid deactivation of window below utility window
  • Previous by thread: Re: Displaying at appropriate time after text layout...?
  • Next by thread: How to avoid deactivation of window below utility window
  • Index(es):
    • Date
    • Thread