Objective C Observer problem



  • Hallo,

    jede Klasse erbt doch von NSObject und die hat eine addObserver Methode. Ich verwende die nun in meiner Klasse da ich Observer hinzufuegen moechte. Rufe ich die Methode nun bei der Instanzierung auf bekomme ich die Meldung:

    no visible @interface for declares the selector 'addObserver:forKeyPath'

    Kann mir einer helfen ?



  • Ahhh. Manchmal ist XCode echt nervig. Vorher hatte ich die Methode selbst geschrieben da gings net. Jetzt hab ich sie aus dem Context Menu ausgewaehlt und es geht.



  • Kann mir mal einer sagen welche Methoden man im Observer braucht und welche im Observable. Ich bin jetzt kurz davor es selbst zu implementieren da ich nicht versteh wie ich die eingebaute Observer Funktion nutzen muss. Ich will Key Value machen.



  • Ich denk mal das hier erklaert schon mal einiges. Schau ma mal ob ich damit zurechkomme. Was denkt ihr ?
    http://nshipster.com/key-value-observing/



  • Peter21 schrieb:

    Was denkt ihr ?

    Ich denke du solltest erst googeln und dann erst in einem Forum fragen.



  • im Subject muss ich addObserver implementieren und im Observer observeValueForKeyPath . In welchem parameter wird eigentlich der neue WErt uebergeben ? Ich dachte im context aber der ist scheinbar immer NULL





  • Ich verstehs trotzdem net. Wie muesste ich das unten implementieren ?

    class Observer
    {
    
    }
    
    class subject
    {
    
    property int value:  // den value will ich beobachten 
    
    }
    




  • Kann mir mal einer helfen. Ich hab jetzt in Subject die addObserver rein und iN Observer observeValueForKeyPath . Wenn ich jetzt die Property aendere sollte ja observeValueForKeyPath aufgerufen werden , was sie bei mir aber nicht tut. Hilfe waere jetzt echt nuetzlich bevor ich das ganze noch selbst implementiere ich glaub da waer ich schon laengst fertig.

    class Observer 
    { 
    (void)observeValueForKeyPath:(NSString *)keyPath
                          ofObject:(id)object
                            change:(NSDictionary *)change
                           context:(void *)context
    
    } 
    
    class subject 
    { 
      - (void)addObserver:(NSObject *)observer
             forKeyPath:(NSString *)keyPath
                options:(NSKeyValueObservingOptions)options
                context:(void *)context
    
    property int value:  // den value will ich beobachten 
    
    }
    


  • 1. Zeigst du nicht den Code der benötigt wird. Wie, Wo fügst du den Observer hinzu? Für welchen KeyPath? Wie sieht die observeValue... Methode aus?

    2. Ist das was du zeigst ein grauenvoller Mix aus Objective-C und C++ und ich meine hier nicht Objective-C++.

    In der Regel überschreibst du addObserver:ForKeyPath:Context: nicht.
    Du implementierst in der Observierenden Klasse die Methode observeValueForKeyPath:ofObject:change:context:

    In dem Change Dictionary steht der geänderte Wert. Context ist nur dann NULL, wenn du beim hinzufügen des Observers NULL übergeben hast. Du hast hier die Möglichkeit ein Objekt, solltest du es aus irgendeinem Grunde brauchen, weiter zu reichen.



  • @Peter21: Egal was du nimmst, nimm weniger. ObjectiveC programmiert nun wirklich kaum jemand, frag doch in einem Fachforum speziell dafür nach.


  • Mod

    LSDDSL schrieb:

    @Peter21: Egal was du nimmst, nimm weniger. ObjectiveC programmiert nun wirklich kaum jemand, frag doch in einem Fachforum speziell dafür nach.

    Ein berühmt berüchtigter Forennutzer, der derzeit gebannt ist, und für seine Lernresistenz, Merkbefreitheit, Google-Abstinenz, Selbstgespräche und unbrauchbaren Fragen bekannt ist, macht derzeit Objective-C. Ob da wohl möglicherweise ein Zusammenhang besteht, dass hier ein Unregistrierter mit einer einfach googlebaren, aber unbrauchbar formulierten, Frage zu Objective-C auftaucht und danach ein langes Selbstgespräch führt?



  • Jetzt wo ich addObserver nicht mehr überschreibe funktionierts auf einmal. Ist ja echt fies , so richtig lesen konnte ich diesen Punkt nirgends. Wahrscheinlich hatte ich also noch super addObserver aufrufen müssen. Diesen wichtigen Punkt hätte man doch in den vielen Tutorials erwähnen können .

    Man das ganze ist ja so einfach , da muss man als Programmierer ja gar nix mehr machen. So macht das ganze Programmieren ja keinen Spass mehr. Selbst das Observer Pattern muss man nicht mehr verstehen. Ist echt schade find ich. Gerade wenn man neu zum Programmieren anfängt wird man sich dann nicht mehr die Mühe machen um das Observer Pattern zu lernen.



  • Lustig wenn ich die property mit _property setze gehts nicht aber wenn ich explizit setProperty aufrufe dann wird die Veraenderung erkannt wie gibts das



  • Was ist der Unterschied ? Sollte nicht auch die vom compiler generierte Instanzvariable dasselbe machen wie explizit der setter



  • wieso muss ich die setter Methode explizit aufrufen . Kann mir das mal einer sagen . Wuerd mich mal intressieren.


Log in to reply