PROBLEM MIT BINDINGS..BITTE HELFEN!!

  • PROBLEM MIT BINDINGS..BITTE HELFEN!!

    Hallo liebes mac os x entwicklerforum!

    Ich bin ganz neu in dem thema und ich hoffe ganz stark, dass ich euch mit meiner frage nicht zu sehr nerve ;)
    Also ich muss in meiner Schule eine Diplomarbeit schreiben, also abschluss sozusagen :D
    Und wollte die eig. in Java schreiben, nur mein betreuungslehrer wollte, dass ich unbedingt das in cocoa also objective c realisiere ;)
    tja was soll man machen^^

    Also meine Arbeit handelt über ein Verwaltungssystem für 2 Firmen.
    Gestartet habe ich mit der Lagerverwaltung und da bin ich ja auch schon relativ weit (zum teil wegen der tollen hilfe die man in diesem Forum findet)

    Also ich stell da jetzt mal ein bild rein, damit ich das besser erklären kann :)


    [Blockierte Grafik: http://www.apox.at/Bild4.png]

    Also zur erklärung, ich kann verschiedene Lager anlegen, und zu den Lagern verschiedenste Produkte, und zu jeden Produkt hab ich eine Chronik wo die Stückzahl aufgezeichnet wird.

    Das alles wird auch mit den nsarraycontroller in die data core gebunden.
    nur das eine Problem ist jetzt, wenn ich wieder zu einem Produkt die Stückzahl erhöhe indem ich sage, + 502 Stück dann sende ich es an eine funktion weiter, die mir dann den aktuellen Lagerstand errechnet und diesen schreibe ich dann in das Textfeld Neue lagernde Menge. Gut, nachdem ich das gemacht habe wird aber nichts im Tableview aktualisiert, bzw. dann auch nicht in die core data gespeichert.

    Ich hab da jetzt ein bisschen gegooglelt und bin auf so ein konzept aufmerksam geworden, das key value observing...
    nur wie funktioniert das, wenn ich nur einen wert noch dazu speichern möchte, weil ja alle anderen werte mittels Textfelder an die core data gebunden sind.
    Oder gibt es eine Funktion, dass ich eine Tasteneingabe simuliere, sodass ich einfach ohne key value observing und ganz normal mittels Binding im Textfeld weiterarbeiten kann?!?!?!

    Ich hoffe, dass sich ein paar mit meiner problemerklärung auskennen :D

    DANKE
    lg. matthias
  • na gut, jetzt flüstere ich ;)

    2) mvc is mir schon bekannt
    3) accessoren benutzen wie meinst du? hab mir jetzt im band 1 die seite 222 und folgende durchgelesen, verstehe aber nicht wie ich das für meine lösung brauche...
    4) band 1
    5) gibts da wirklich nichts wie ich schon gefragt habe?!?!

    ich bin echt verzweifelt, den ich komme leider nicht mehr weiter :(

    danke danke danke....
    lg matthias
  • Hi,

    wenn Dir MVC bekannt ist, dann benutze es auch in Deiner Umsetzung :)
    Um Dein Problem zu lösen, musst Du alle Deine Daten in die Modelschicht packen, scheinst Du, da Du CoreData benutzt, ja auch zu tun. Wahrscheinlich solltest Du die betreffende Entity ableiten und zusätzliche Accesoren hinzufügen, mit denen Du Deine berechneten Werte einträgst/die davon abhängigen Werte aktualisierst (oder aber gleich eine neue Eigenschaft zum Entity im Modell-Designer hinzufügen).

    So wie es sich aus Deinen spärlichen Informationen anhört, handelt es sich bei "Lagernde Menge" anscheinend nicht um die Eigenschaft einer CoreData-Entity, denn sonst würde es automatisch über das Binding in der Tableview mittels des ArrayControllers aktualisiert werden. Falls doch, dann setze mal im IB "Continuously Updates Value" für Dein Textfeld. Ansonsten musst Du erst den Fokus auf ein anderes Control setzen, damit das NSView die Änderung abschickt.

    Zum Thema Accessoren: sämtlicher Zugriff auf Deine Modellschicht (im Prinzip auf jegliche Eigenschaften jeglicher Klassen) sollte ausschließlich über KVC-kompatible Accessoren erfolgen, denn dann profitierst Du automatisch vom KVO, d.h. Änderungen in der einen Schicht (z.B. View) werden den anderen Schichten bei Interesse (mittels Bindings) mitgeteilt. Steht aber alles in Band 1 oder sonstiger Einführungsliteratur (z.B. Apples Doku).

    Abgesehen davon, ist es ziemlich schwierig so in Blaue hinein zu helfen, ein bisschen mehr Codebeispiele wären hilfreich.

    Gruß, SMJ
  • 1) Du bindest alle Deine Core-Data Attribute an die Textfelder in Deiner Oberfläche. Das war's dann aber auch schon mit der "Oberflächenprogrammierung". In ein NSTextfeld "schreibst" Du gar nichts rein. Stattdessen errechnest Du die neuen Werte der Core-Data-Attribute. Das Aktualisieren der Felder machen dann die Bindings für Dich.

    2) Du überwachst alle Felder, die den Lagerbestand beeinflussen:

    Quellcode

    1. - (void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context

    Beachte, dass Du keine Many-Relationships überwachen kannst.

    3) wird eines der lagerstandsbeeinflussenden Felder geändert, wird von KVCO diese Methode aufgerufen:

    Quellcode

    1. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context


    4) erstelle eine Methode, die den Lagerbestand neu berechnet:

    Quellcode

    1. - (void)berechneBestandOderAehnlich

    Dabei ist ganz wichtig, dass Du nach der Berechnung des neuen Bestands den neuen Bestand KVC-kompatibel setzt, am besten mit setValue:forKey. Dann werden die Textfelder sicher aktualisiert, wurscht ob in einem NSView oder NSTableView.

    5) berechneBestandOderAehnlich rufst Du aus observeValueForKeyPath auf.

    Btw, Lagerverwaltung mit Core Data "in Action":
    sevenlakessoftware.com ;)


    No.
  • okok...
    Es tut mir jetzt schon leid, da ich wahrscheinlich ziemlich neben der spur stehe ;)
    aber dieses gebiet is für mich ganz neu...
    ja mvc müsste ich eig. schon hierbei verwenden, bin mir aber noch nicht ganz sicher ob unter cocoa das prinzip das selbe ist wie bei asp.net
    aber schätzungsweise schon ;)

    ok..also wie ich das richtig verstanden habe, werde ich einen observer verwenden.
    also noch mal zurzeit habe ich wie schon norbi auch gemeint hat, an der Oberfläche nur bindings erledgit.
    und meine frage ist jetzt, wenn ich auf das plus klicke, also für eine neue transaktion, dann mache ich mir ja ein neues objekt im arrayconroller und früge es dem hinzu oder?
    also wenn ich dieses objekt mache, hol ich mir ja die anderen daten ganz normal aus den textfeldern und eben 2 felder muss ich mir berechnen, und die werd ich mir wars. im code dann hinzufügen, also muss ich mir ja das aktuelle objekt holen...
    versteh ich das richtig?
    wenn ja, wie suche ich mir das aktuelle objekt heraus?

    danke!!!
  • hol ich mir ja die anderen daten ganz normal aus den textfeldern
    Du holst Dir gar nichts aus Textfeldern, sondern von den Attributen Deiner Core-Data Objekte.

    Die Synchronisierung zwischen Werten in Deinem Datenmodell und den Textfeldern in der Benutzeroberfläche erledigen komplett die Bindings für Dich. Da tust Du gar nix.

    also wie ich das richtig verstanden habe, werde ich einen observer verwenden
    Genau. Nichts anderen tun übrigens die Bindings auch.

    wenn ich auf das plus klicke, also für eine neue transaktion, dann mache ich mir ja ein neues objekt im arrayconroller und früge es dem hinzu oder?
    Wenn der Button die add:-Methode des ArrayControllers aufruft: ja.

    wie suche ich mir das aktuelle objekt heraus?
    Wenn ich Deinen Screenshot richtig lese, hast Du zwei Entitäten: Artikel und Lagerbewegungen, oder so. Artikelbewegungen hat eine To-Many-Relationship zu Lagerbewegungen. Richtig?
    Der Anfänger würde jetzt in Artikel eine Überwachung von lagerbewegungen.menge anlegen. Das geht aber nicht, weil Du to-Many-Relationships nicht überwachen kannst.
    Stattdessen legst Du in Lagerbewegungen einen Observer für das Mengen-Attribut an. Sendet der Observer eine Nachricht, dass das Mengenfeld geändert wurde, teilst Du das dem Artikel mit, der den neuen Lagerbestand berechnet. Den Artikel zu einer Lagerbewegung findest Du ja einfach über valueforkey:relationshipZumArtikel.

    Schau Dir dazu an:
    - observierung ein- und ausschalten: awakeFromNib, awakeFromInsert und willTurnIntoFault von NSManagedObject
    - removeObserver:... Observierung abschalten, wenn das Objekt freigegeben wird
    - "Set and Array Operators" - @sum Operator von Sets, zum Berechnen des Lagerbestands

    No.
  • NSArrayController hat die Eigenschaft selection, mit der bekommst Du das aktuelle Objekt (um genau zu sein ein KVC-kompatibles Proxy-Object), wenn Du im IB für den ArrayController "Select Inserted Objects" ausgewählt hast (dadurch werden neu hinzugefügte Objekte ausgewählt).

    Alternativ kannst Du das neue Object auch in einer eigenen Methode Deines Controllers mittels -newObject von NSObjectController erstellen (NSArrayController erbt von NSObjectController). Wie Du das im Einzelnen machst, steht weiter unten in Apples Guides.
    Deinen neuen Wert rechnest Du aus und trägst ihn dann in Deiner entspr. CoreData Entität (kommst über den NSArrayController dran) mittels KVC bzw. entspr. setter ein.

    Vielleicht hilft Dir das:
    developer.apple.com/documentat…le_ref/doc/uid/TP30001200

    und das:

    developer.apple.com/documentat…duction/introduction.html

    ja weiter, solltest Du lesen.

    Gruß, SMJ
  • RE: PROBLEM MIT BINDINGS..BITTE HELFEN!!

    guude,

    Original von matthias1990
    Also ich muss in meiner Schule eine Diplomarbeit schreiben, also abschluss sozusagen :D

    sorry fuer das OT aber die aussage oben verwirrt mich, und bitte um aufklaerung! :)
  • wow ja...es geht zurzeit mal!
    also ich kann jetzt mal werte ausrechnung und dem object hinzufügen :)
    das mit dem observing werd ich noch machen!
    schön langsam wird mir in dem bereich alles klar :)

    DANKE nochmals!!
    ohne euch?!? unmöglich....


    PS: thema bitte noch nicht schließen, vll hab ich ja in dem zusammenhang noch ein problem :D

    danke!
  • RE: PROBLEM MIT BINDINGS..BITTE HELFEN!!

    Original von matthias1990
    Also ich muss in meiner Schule eine Diplomarbeit schreiben, also abschluss sozusagen :D
    Und wollte die eig. in Java schreiben, nur mein betreuungslehrer wollte, dass ich unbedingt das in cocoa also objective c realisiere ;)
    tja was soll man machen^^

    Also, du schreibst eine Diplomarbeit in einer Schule, aber du studierst doch, oder wie jetzt?

    Ich frage deshalb, weil, wenn dein Betreuer an einer Hochschule (Uni, FH) arbeitet, dann sollte er eigentlich wissen, dass es bei wissenschaftlichen Arbeiten nicht auf das Instrument ankommt, das man verwendet, sondern auf die Methodik, Systematik und Logik.

    Kurzum, wenn dein Betreuer dir vorgibt womit du unbedingt zum Ziel kommen sollst, dann ist das meiner Meinung nach grundfalsch.
    Wenn du der Meinung bist, dass du dein Ziel besser mit Java erreichst, dann solltest du das auch mit Java machen. Wenn du es am besten mit BASIC erreichen kannst, dann eben damit, aber unter gar keinen Umständen solltest du dir vorschreiben lassen womit du zu arbeiten hast. Die einzige Ausnahme ist, wenn das Thema keine andere Form der Bearbeitung zulässt, aber so wie ich das hier verstehe ist, die Ausnahme nicht gegeben.

    Es wird sicher auch niemand von dir verlangen deine Unterschrift auf ein Blatt Papier mit einer Sprühdose zu setzen wenn es nicht unbedingt notwendig ist, du wirst dir das Schreibgerät dazu schon selbst aussuchen. Wenn du aber der Meinung bist, dass du deine Unterschrift am allerbesten sprühen kannst (ohne dass alles andere vollgeschmiert wird), dann wirst du das sicher so machen, oder?

    Ich hoffe ich konnte dir etwas Selbstbewusstsein einflößen und du sprichst noch mal mit deinem Betreuer darüber. Ich hoffe für dich, dass du dich durchsetzen kannst.
    Hoecker-Plot - eine neue Auswertungsmethode für Digitalproofs - http://www.hoecker-plot.de
  • ja das ist eben der punkt...ich bin in einer EDV HTL (Österreich) noch...
    und hierbei brauche ich vor meiner Matura (Österreich) eine Diplomarbeit noch.
    Und diese hätte ich mir eig. in Java vorgestellt...weil wir eben 3 jahre java in der Schule lernen und dann eben auf c# wechseln und soooo der unterschied is ja dann auch nicht.
    ok..so denkste :D

    als ich dann meine arbeit einem komitee von lehrern präsentiert hatte sagten sie, dass es Diplomarbeitswürdig ist, nur das ich das nicht in java realisieren werde sondern in objective c, da es etwas ganz neues ist (für unsere schule - sind eher ziemlich windows angehaucht :D )

    naja und da mein lehrer von der sprache nicht wirkich viel weiß, schlage ich mich mit 2 bücher und diesem forum herum :)

    hatte heuer in Hagenberg (Österreich/Oberösterreich), falls es jemand von euch kennt, ein 4 wöchiges praktikum. Hat mir dort sehr gut gefallen. und dort sprachen sie mich auch darauf an, warum ich das so mache :D

    aber ich glaube das es schon in die richtige richtung geht...also meine arbeit
  • Na wenn die wollen, dass Du ein Mac-Programm schreibst, dann würde ich das auch machen und versuchen, möglichst viele "exklusive" Apple-Technologien in das Programm einzubauen, die alle Lehrer mit Windows-Hauch so nicht kennen.

    Ich denke da an:
    - Core Animation
    - Quicktime
    - Collection Views
    - WebKit
    - PDFKit
    - Quarz Composer

    und Dir die Arbeit, so wie Du ja schon begonnen hast, mit Core Data und Bindings möglichst einfach zu machen.

    Wieviel Zeit hast Du denn dafür?

    No.
  • Also mir persönlich kanns ja egal sein, die Arbeit musst du schließlich machen. Wenn du das so akzeptierst, dann ist das auch OK.

    Vielleicht hast du ja auch Spaß daran Objective-C/Cocoa zu lernen (ziemlich sicher sogar), von daher möchte ich dir das auch nicht ausreden.

    ICH würde mir nur nicht vorschreiben lassen WIE ich das Thema meiner Diplomarbeit zu bearbeiten habe, sondern da würde ich knallhart danach gehen WAS ich bereits kann und ob das geeignet ist die Arbeit zeitoptimiert abzuschließen. Wenn das nicht reicht, dann muss ich mich eben in anderen Stoff einarbeiten.

    Viel Erfolg aber weiterhin.
    Hoecker-Plot - eine neue Auswertungsmethode für Digitalproofs - http://www.hoecker-plot.de
  • ich hab dafür jetzt noch bis etwa februar,
    aber da sollte die schriftliche auserbeitung auch dabei schon sein.
    -Core Animation
    - Quicktime
    - Collection Views
    - WebKit
    - PDFKit
    - Quarz Composer

    die punkte werd ich mir gleich ansehen!!!
    wir haben eh vor das wir pdfs generieren. ich schätze mal dafür ist die PDFKit bibliothek?!

    ja und ich muss ehrlich sagen, mich hat es richtig geschreckt, dass das mit de Bindings und Core Data so schnell geht.
    bin ja nur aus c# zum beispiel das serialisieren von objekten gewohnt oder ähnliches.
  • Das alleine schon, dass ich keine speichern buttons mehr verwende...(IST DOCH DER HIT)

    Wenn Du ein Lagerbuchungsprogramm schreibst, kann das die Sache aber auch nicht unbedingt vereinfachen. Du musst nämlich zu jedem Zeitpunkt, an dem sich lagerbuchungsrelevante Daten ändern (Buchungsmenge, Buchungswert, Buchungswährung, Mengeneinheit,...) die Lagerbuchung aktualisieren.

    Ich geb' Dir aber bei Deiner Meinung über das Framework natürlich recht... :)

    No.