title: NSInternalInconsistencyException when using KVO
body: <p>I'm trying to use a KVO example I got from an iPhone tutorial book, but get this exception</p>
  
  <pre><code>   Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '&lt;UINavigationController: 0x139630&gt;: An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
  Key path: dataUpdated
  Observed object: &lt;FilterDetailsController: 0x1b9930&gt;
  Change: {
      kind = 1;
  }
      Context: 0x0'
       Call stack at first throw:
      (
          0   CoreFoundation                      0x320d3987 __exceptionPreprocess + 114
          1   libobjc.A.dylib                     0x3271849d objc_exception_throw + 24
          2   CoreFoundation                      0x320d37c9 +[NSException raise:format:arguments:] + 68
          3   CoreFoundation                      0x320d3803 +[NSException raise:format:] + 34
          4   Foundation                          0x35c316e9 -[NSObject(NSKeyValueObserving) observeValueForKeyPath:ofObject:change:context:] + 60
          5   Foundation                          0x35bd4a3d NSKeyValueNotifyObserver + 216
          6   Foundation                          0x35bd46e5 NSKeyValueDidChange + 236
          7   Foundation                          0x35bcc3f5 -[NSObject(NSKeyValueObserverNotification) didChangeValueForKey:] + 76
          8   Foundation                          0x35c30d87 _NSSetObjectValueAndNotify + 98
          9   Lucid Dreaming App                  0x000108e3 -[FilterDetailsController adjustFilterDetails:] + 138
          10  CoreFoundation                      0x3207afed -[NSObject(NSObject) performSelector:withObject:withObject:] + 24
          11  UIKit                               0x323b3ea5 -[UIApplication sendAction:to:from:forEvent:] + 84
          12  UIKit                               0x323b3e45 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 32
          13  UIKit                               0x323b3e17 -[UIControl sendAction:to:forEvent:] + 38
          14  UIKit                               0x323b3b69 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 356
          15  UIKit                               0x323b43c7 -[UIControl touchesEnded:withEvent:] + 342
          16  UIKit                               0x323a9d4d -[UIWindow _sendTouchesForEvent:] + 368
          17  UIKit                               0x323a96c7 -[UIWindow sendEvent:] + 262
          18  UIKit                               0x3239499f -[UIApplication sendEvent:] + 298
          19  UIKit                               0x323942df _UIApplicationHandleEvent + 5090
          20  GraphicsServices                    0x35472f03 PurpleEventCallback + 666
          21  CoreFoundation                      0x320686ff __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 26
          22  CoreFoundation                      0x320686c3 __CFRunLoopDoSource1 + 166
          23  CoreFoundation                      0x3205af7d __CFRunLoopRun + 520
          24  CoreFoundation                      0x3205ac87 CFRunLoopRunSpecific + 230
          25  CoreFoundation                      0x3205ab8f CFRunLoopRunInMode + 58
          26  GraphicsServices                    0x354724ab GSEventRunModal + 114
          27  GraphicsServices                    0x35472557 GSEventRun + 62
          28  UIKit                               0x323c7d21 -[UIApplication _run] + 412
          29  UIKit  ...
  </code></pre>
  
  <p>I start by </p>
  
  <pre><code>[advancedController addObserver:self.navigationController forKeyPath:@"dataUpdated" options:0 context:nil];
  </code></pre>
  
  <p>within self.navigation controller, I have the observation method defined:</p>
  
  <pre><code>- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
  {
  
      NSLog(@"2 Observed change for: %@",keyPath);
  //    if (context == &lt;#context#&gt;) {
  //        &lt;#code to be executed upon observing keypath#&gt;
  //    } else {
          [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  //    }
  }
  </code></pre>
  
  <p>within advancedController I have a NSNumber property </p>
  
  <pre><code> @property(nonatomic,retain)NSNumber* dataUpdated;
  </code></pre>
  
  <p>When I hit a button, I expect the observer to fire.</p>
  
  <pre><code>  - (IBAction)adjustFilterDetails:(id)sender {
          self.dataUpdated = [NSNumber numberWithInt:[self.dataUpdated intValue]+1];
      }
  </code></pre>
  
  <p><strong>Do I need to implement some protocol or explicitly state that I will update the value? I read that NSKeyValueObserving is an "informal" protocol. Thank you for your help!</strong></p>
  
  <p><strong>I have figured out the answer to my own question.</strong> I had the KVO protocol method defined within a ViewController, however, I have accidentally registered the Navigation controller for the View controller to observe the value. The correct object is found by getting the view controller like this:</p>
  
  <pre><code> [advancedController addObserver:(RootViewController*)self.navigationController. topViewController forKeyPath:@"dataUpdated" options:0 context:nil];
  </code></pre>