mehr fragen zur analoguhr

  • mehr fragen zur analoguhr

    mein timer-problem ist jetzt geloest, aber dafuer gibt es jetzt andere fragen.

    - in meinem uhr-projekt hab ich ein fenster mit CustomView und ein sheet fuer die preferences. das problem ist dass ich nicht weiss wie man von sheetController.m aus eine methode in myview.m aufruft.
    ich hab's mit [MyView setSec:sec]; versucht, aber das hat nur ne fehlermeldung produziert: SheetController.m:15: error: 'MyView' undeclared (first use in this function)

    - was muss ich tun um den timer loszuwerden so dass ich einen neuen timer mit einer anderen laufzeit anlegen kann? es reicht ja wohl nicht, der variablen einen neuen wert zuzuweisen, oder?

    - wie kriege ich es hin dass das programm beendet wird wenn ich den roten knopf anklicke?
    Mac Mini, 1.83 GHz Core 2 Duo, 2 GB, OSX 10.6.3, Xcode 3.2.2
    iPhone 3GS, 16 GB, OS 3.1.3
  • RE: mehr fragen zur analoguhr

    Original von harry
    mein timer-problem ist jetzt geloest, aber dafuer gibt es jetzt andere fragen.

    - in meinem uhr-projekt hab ich ein fenster mit CustomView und ein sheet fuer die preferences. das problem ist dass ich nicht weiss wie man von sheetController.m aus eine methode in myview.m aufruft.
    ich hab's mit [MyView setSec:sec]; versucht, aber das hat nur ne fehlermeldung produziert: SheetController.m:15: error: 'MyView' undeclared (first use in this function)

    Was willst Du denn damit machen.
    Hast Du bereits eine Referenz von Deinem CustomView oder Uhr-Fenster Controller zu dem SheetController? Von wo aus oeffnest Du das Sheet?
    Es waere denkbar, dass Du dem SheetController einen Delegaten verpasst und zwar den CustomView Controller. Im Prinzip hat dann der SheetController eine Referenz des CustomView Controllers als instanz Variable und kann damit also Methoden davon aufrufen.

    Original von harry
    - was muss ich tun um den timer loszuwerden so dass ich einen neuen timer mit einer anderen laufzeit anlegen kann? es reicht ja wohl nicht, der variablen einen neuen wert zuzuweisen, oder?

    Normalerweise ja. Du kannst, soweit ich das gesehen habe, einen neuen Timer mit einer der Convenient Allokatoren erzeugen und zuweisen, damit sind die Autoreleased.

    Original von harry
    - wie kriege ich es hin dass das programm beendet wird wenn ich den roten knopf anklicke?

    Roten Knopf? ;)


    Manfred
  • RE: mehr fragen zur analoguhr

    Original von asrael
    Was willst Du denn damit machen.

    in diesem sheet hab ich 2 checkboxen mit denen ich steuern will wie die uhr gezeichnet wird (mit oder ohne sekundenzeiger, springender oder kontinuierlicher minutenzeiger). das problem ist dass ich diese variablen nicht vom sheetcontroller in myview bekomme.


    Hast Du bereits eine Referenz von Deinem CustomView oder Uhr-Fenster Controller zu dem SheetController? Von wo aus oeffnest Du das Sheet?
    Es waere denkbar, dass Du dem SheetController einen Delegaten verpasst und zwar den CustomView Controller. Im Prinzip hat dann der SheetController eine Referenz des CustomView Controllers als instanz Variable und kann damit also Methoden davon aufrufen.

    huh? ich versteh bloss bahnhof...
    also das sheet erscheint wenn ich im menue preferences anwaehle und verschwindet wieder wenn ich den ok-knopf anklicke (das funzt richtig). beide methoden stehen im sheetcontroller.
    Mac Mini, 1.83 GHz Core 2 Duo, 2 GB, OSX 10.6.3, Xcode 3.2.2
    iPhone 3GS, 16 GB, OS 3.1.3
  • RE: mehr fragen zur analoguhr

    Original von harry
    huh? ich versteh bloss bahnhof...
    also das sheet erscheint wenn ich im menue preferences anwaehle und verschwindet wieder wenn ich den ok-knopf anklicke (das funzt richtig). beide methoden stehen im sheetcontroller.

    Hehe, war kein Absicht von mir Dich zu verwirren.
    Ok. normalerweise weis die eine Klasse bzw. Instanz von der Instanz einer anderen Klasse nichts und kann somit generell auch keine Methoden aufrufen.
    Wie bekommt man das also nun hin?
    Da gibt es zwei Moeglichkeiten, entweder ueber Klassen-Methoden. Klassen-Methoden koennen aufgerufen werden, obwohl keine Objekt-Instanz einer Klasse existiert. Das funktioniert aber nur, wenn kein Zugriff auf Instanz-Variablen gemacht wird.
    So hast Du es auch versucht, hat aber nicht hingehauen. Da gehoert noch mehr dazu.
    Die zweite Moeglichkeit ist, dass die eine Instanz der Klasse eine Referenz (als einen Pointer) zu der anderen Klasse haelt.Somit kann ich aus dem einen Objekt eine Methode des Objektes einer anderen Klasse aufrufen.

    In Deinem Fall, koenntest Du den zweiteren Weg gehen und im Interface Builder dem SheetController eine Variable verpassen, die Du mit dem CustomView Controller verbindest. Ueber diese Variable kannst Du dann von dem SheetController aus Methoden des CustomView Controller auf rufen.

    Es gaebe noch mehrere alternative Moeglichkeiten. Vor allem, weil es sich um Preferences handelt, koenntest Du mit Bindings arbeiten, und im CutomView Controller die Values der NSUserDefaults ueberpruefen. Aber ich weiss nicht, ob das nicht zu weit geht.

    Wenn Dir das mit dem Objekt-Zeugs nicht klar ist, solltest Du Dir entsprechende Literatur ueber Objekt-Orientierung zu gemuehte fuehren. Oder Du schaust in unser Entwicklerwelt-Wiki (hab grad die URL nicht zur Hand). Aber Du kommst ja von Java, da ist das ja nichts neues.



    Beste Gruesse,
    Manfred
  • RE: mehr fragen zur analoguhr

    Nein, einfach wieder zuweisen funktioniert nicht, siehe alten Thread. Du musst den Timer invalidieren. Ich glaube die Methode heißt -invalidate(NSTimer)

    Du kannst dir folgenden Setter bauen:

    Quellcode

    1. -(void)setTimer:(NSTimer*)timer {
    2. if( timer != _timer ) {
    3. _[timer invalidate];
    4. [_timer release];
    5. _timer = [timer retain];
    6. }
    7. }
    Hier ist es übrigens ratsamen einen if-Setter zu verwenden.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: mehr fragen zur analoguhr

    @Tom:

    Quellcode

    1. -(void)setTimer:(NSTimer*)timer {
    2. if( timer != _timer ) {
    3. [_timer invalidate]; // der Unterstrich darf natuerlich nicht vor die eckige Klammer
    4. [_timer release];
    5. _timer = [timer retain];
    6. }
    7. }


    Neum

    PS: Check mal deine Mails ;)
    "We can make all our dreams come true, but first we have to decide to awaken from them.", Josephine Baker
  • RE: mehr fragen zur analoguhr

    Original von Tom9811
    Nein, einfach wieder zuweisen funktioniert nicht, siehe alten Thread. Du musst den Timer invalidieren. Ich glaube die Methode heißt -invalidate(NSTimer)

    Ich habs nicht getestet. Wird stimmen was Du sagst. Sorry fuer die Falschauskunft.

    Manfred
  • RE: mehr fragen zur analoguhr

    Danke, selbstverständlich in die Klammer. Kann mal hier jemand completion und Syntax-Cheching einbauen. ;)

    Mail habe ich schon gelesen. Na, dann mach jetzt auch Werbung! ;)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: mehr fragen zur analoguhr

    Also unter Panther war es so. (Da habe ich Bauklötze gestaunt, als ich sah, wie immer mehr Timer in meiner Applikation feuerten, weil die nicht invalidiert wurden. Hatte ein bisschen was von amerikanischer Völkerrechtsverletzung.)

    Jemand sagte hier auch, dass es immer noch so sei.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: mehr fragen zur analoguhr

    Original von harry
    - wie kriege ich es hin dass das programm beendet wird wenn ich den roten knopf anklicke?


    Mach eine Klasse zum Delegate von dem Fenster und schreib dann in - (void)windowWillClose:(NSNotification *)notification;.
    "Wales is the land of my fathers. And my fathers can have it." - Dylan Thomas
  • RE: mehr fragen zur analoguhr

    Original von asrael
    In Deinem Fall, koenntest Du den zweiteren Weg gehen und im Interface Builder dem SheetController eine Variable verpassen, die Du mit dem CustomView Controller verbindest. Ueber diese Variable kannst Du dann von dem SheetController aus Methoden des CustomView Controller auf rufen.


    ich hab folgendes versucht: ich hab im sheetcontroller ein neues outlet "theView" angelegt und dann ein control-drag vom sheetcontroller zum CustomView (oder wars andersrum?) und mit theView verbunden. war das falsch? anscheinend, weil wenn ich compiliere beschwert sich xcode: SheetController.m:14: warning: no '-setSec:' method found :(
    Mac Mini, 1.83 GHz Core 2 Duo, 2 GB, OSX 10.6.3, Xcode 3.2.2
    iPhone 3GS, 16 GB, OS 3.1.3
  • RE: mehr fragen zur analoguhr

    Original von Tom9811

    Quellcode

    1. -(void)setTimer:(NSTimer*)timer {
    2. if( timer != _timer ) {
    3. _[timer invalidate];
    4. [_timer release];
    5. _timer = [timer retain];
    6. }
    7. }


    was hat es mit dem unterstrich auf sich?
    Mac Mini, 1.83 GHz Core 2 Duo, 2 GB, OSX 10.6.3, Xcode 3.2.2
    iPhone 3GS, 16 GB, OS 3.1.3
  • RE: mehr fragen zur analoguhr

    Die Instanzvariable heißt einfach _timer. Variablennamen dürfen auch einen Unterstrich enthalten. Man lässt Instanzvariablen gerne mit einem Unterstrich beginnen, um zu verdeutlichen, dass diese Variablen "objekt-interne" Variablen sind und man nur über Setter-Methoden auf sie zugreifen sollte/darf. Ist halt einfach ein recht verbreiteter Programmierstil.

    Michael
  • RE: mehr fragen zur analoguhr

    Original von harry
    ich hab folgendes versucht: ich hab im sheetcontroller ein neues outlet "theView" angelegt und dann ein control-drag vom sheetcontroller zum CustomView (oder wars andersrum?) und mit theView verbunden. war das falsch? anscheinend, weil wenn ich compiliere beschwert sich xcode: SheetController.m:14: warning: no '-setSec:' method found :(

    Ok, im Prinzip war das schon richtig.
    Hat denn der "theView" die -setSec: Methode? Wenn nein, beschwert sich der Compiler.
    Das Problem hier ist jetzt allerdings, dass der SheetController trotzdem noch nichts von der Methode -setSec: weis. Um die Methode dem SheetController bekannt zu machen, importiert man normalerweise die .h Datei (hier waere das wohl CustomView.h).
    Die wirst Du aber nicht haben, oder? Denn ich nehme an, Du hast keinen View gesubclassed, sondern einfach einen CustomView aus der Palette des IB genommen. Ist ja auch in Ordnung so. Nur kannst Du dann diesen View nicht nehmen um die Header-Datei dem SheetController zu importieren, weil Du keine hast.

    Hast Du denn keinen Controller zu dem CustomView? Ich hatte es so gemeint, dass der SheetController nicht Methoden des CustomViews direkt aufruft, sondern ueber einen Controller, den CutomView Controller. Falls Du den View doch gesubclassed hast und die -setSec: Methode in der Subclass eingebaut hast, reicht wenn die Header-Datei des CustomViews im SheetController importierst.


    Hmm, hab ich mich verstaendlich ausgedrueckt?

    Gruesse,
    Manfred
  • RE: mehr fragen zur analoguhr

    Nicht nur ein verbreiteter, sondern auch ein von Cocoa vorausgesetzteer. Zumindest in Panther sucht nämlich KVC für einen Schlüssel key nach einer Instanzvariable _key, wenn es keinen Setter gefunden hat. Ich glaube jedoch mich zu erinnern, dass auch nach einer ohne Unterzug geschaut wird, wenn es keine mit Unterzug gibt.

    Jo, ich habe es gerade noch einmal nachgeschaut: Es ist immer noch so.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: mehr fragen zur analoguhr

    Original von Tom9811
    Jo, ich habe es gerade noch einmal nachgeschaut: Es ist immer noch so.

    Richtig, mit 10.4 hat sich nur die Suchreihenfolge umgekehrt. Ab 10.4 wird erst nach Namen mit Unterstrich und anschließend nach Namen ohne diesen gesucht. Das war bei 10.3 noch anders herum. Vielleicht ganz gut zu wissen für "Performancefetischsiten". :D

    Michael
  • RE: mehr fragen zur analoguhr

    Vielleicht ganz gut zu wissen für "Performancefetischsiten".

    Ich weiß nicht, ob es Performance bringt, wenn man KVC erst sämtliche Methoden erfolglos durchsuchen lässt, um dann einen Aufruf von -accessInstanceVariableDirectly gefolgt von einem direkten Zugriff durchführen zu lassen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: mehr fragen zur analoguhr

    Original von asrael
    Original von harry
    ich hab folgendes versucht: ich hab im sheetcontroller ein neues outlet "theView" angelegt und dann ein control-drag vom sheetcontroller zum CustomView (oder wars andersrum?) und mit theView verbunden. war das falsch? anscheinend, weil wenn ich compiliere beschwert sich xcode: SheetController.m:14: warning: no '-setSec:' method found :(

    Ok, im Prinzip war das schon richtig.
    Hat denn der "theView" die -setSec: Methode? Wenn nein, beschwert sich der Compiler.
    Das Problem hier ist jetzt allerdings, dass der SheetController trotzdem noch nichts von der Methode -setSec: weis. Um die Methode dem SheetController bekannt zu machen, importiert man normalerweise die .h Datei (hier waere das wohl CustomView.h).
    Die wirst Du aber nicht haben, oder? Denn ich nehme an, Du hast keinen View gesubclassed, sondern einfach einen CustomView aus der Palette des IB genommen. Ist ja auch in Ordnung so. Nur kannst Du dann diesen View nicht nehmen um die Header-Datei dem SheetController zu importieren, weil Du keine hast.


    also: theView ist ein outlet im sheetcontroller, das per control-drag mit der instanz von MyView verbunden ist. und die setSec: methode steht im MyView. soweit richtig?
    wenn ich dann im sheetcontroller [theView setSec:seconds]; aufrufe (immernoch richtig?) dann beschwert sich der compiler dass er setSec: nicht findet. da muss also irgendwo ein fehler drinstecken, aber ich find einfach nicht raus wo :(

    das mit dem header importieren hab ich versucht, aber da schmeisst mir der compiler wieder ne fehlermeldung vor die nase :(

    ich hab ne subklasse von NSView, die heisst MyView in meinem projekt. und davon hab ich auch eine instanz. meinst du ich soll den CustomView rausschmeissen? und dann? ?( ?( ?( ?(
    Mac Mini, 1.83 GHz Core 2 Duo, 2 GB, OSX 10.6.3, Xcode 3.2.2
    iPhone 3GS, 16 GB, OS 3.1.3
  • RE: mehr fragen zur analoguhr

    Original von harry
    also: theView ist ein outlet im sheetcontroller, das per control-drag mit der instanz von MyView verbunden ist. und die setSec: methode steht im MyView. soweit richtig?

    Scheint soweit richtig zu sein, wenn die Instanz Dein CustomView ist und Du dieser Instanz auch die Klasse "MyView" zugewiesen hast.

    Original von harry
    wenn ich dann im sheetcontroller [theView setSec:seconds]; aufrufe (immernoch richtig?) dann beschwert sich der compiler dass er setSec: nicht findet. da muss also irgendwo ein fehler drinstecken, aber ich find einfach nicht raus wo :(

    In der Datei SheetController.m steht auch ein

    Quellcode

    1. #import "MyView.h"
    drin?

    Original von harry
    das mit dem header importieren hab ich versucht, aber da schmeisst mir der compiler wieder ne fehlermeldung vor die nase :(

    Und diese Fehlermeldung lautet wie?

    Michael
  • RE: mehr fragen zur analoguhr

    Original von Michael
    Original von harry
    also: theView ist ein outlet im sheetcontroller, das per control-drag mit der instanz von MyView verbunden ist. und die setSec: methode steht im MyView. soweit richtig?

    Scheint soweit richtig zu sein, wenn die Instanz Dein CustomView ist und Du dieser Instanz auch die Klasse "MyView" zugewiesen hast.

    ja, die custom class steht auf MyView. den CustomView hab ich aus der palette in mein fenster gezogen. haette ich das anders machen sollen?


    Original von harry
    wenn ich dann im sheetcontroller [theView setSec:seconds]; aufrufe (immernoch richtig?) dann beschwert sich der compiler dass er setSec: nicht findet. da muss also irgendwo ein fehler drinstecken, aber ich find einfach nicht raus wo :(

    In der Datei SheetController.m steht auch ein

    Quellcode

    1. #import "MyView.h"
    drin?
    ja, hab ich grade eingebaut. aber der compiler beschwert sich immernoch dass er die setSec: methode nicht findet :(


    Original von harry
    das mit dem header importieren hab ich versucht, aber da schmeisst mir der compiler wieder ne fehlermeldung vor die nase :(

    Und diese Fehlermeldung lautet wie?

    no such file or directory. die meldung kommt uebrigens nicht wenn ich myview.h importiere.
    Mac Mini, 1.83 GHz Core 2 Duo, 2 GB, OSX 10.6.3, Xcode 3.2.2
    iPhone 3GS, 16 GB, OS 3.1.3