• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Daten wollen nicht ins NSMutableArray

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
@MacApple
wieso nicht? Ich habe 2 Klassen und Objekte die miteinander interagieren und auf Attribute der anderen zugreifen.
Würde ich alles in eine klasse packen und keine Objekte anlegen dann hätte es nix damit zu tun.
Objektorientierte Programmierung hat auch was mit Kapselung zu tun. Wenn man ein Objekt hat, mit dem man interagieren möchte, dann muss das funktionieren, ohne wissen zu müssen, wie ein Objekt intern arbeitet. Deinen OldViewViewController kann man nur sinnvoll benutzen, wenn man weiß, dass man die listItems Property erst einmal initialisieren muss. Es können auch nicht zwei oder mehr Objekte gleichzeitig mit OldViewViewController interagieren, ohne zu wissen, dass sie nicht alleine mit OldViewViewController interagieren. Das Array "hintenrum" zu verändern, hebelt zudem KVO aus.

MacApple
 

Pii

Rheinischer Krummstiel
Registriert
25.06.07
Beiträge
383
Ich habe eigentlich nichts anderes erwartet. Die "Controller"-Instanz existiert ja nur für die eine View, und entspricht eigentlich nicht der Funktion eines Controllers. Siehe meine Bemerkung oben.
 
Zuletzt bearbeitet:

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
naja viele denken, dass OOP so geht: man macht Objekte, die irgendwie sich erstellen und dann ist alles super. Jedoch musste ich selbst feststellen, dass dies nicht so ist. MacApple hat es komplett auf den Punkt gebracht. ein Objekt ist erst dann wirklich zu gebrauchen, wenn es so funktioniert, wie man es denkt. Soll heißen: Ich initialisiere ein Objekt und dann muss auch sofort alles vom Objekt so verfügbar sein, wie es sein soll ohne weitere Initialisierung (oder nur insofern, dass sich das Objekt dann selbst darum kümmert und nicht andere Objekte).
Zudem ist auch wichtig, dass Objekte eine festgelegte Funktion besitzen. Eine View ist nur für die Anzeige zuständig, ein Model enthält nur Daten, ein Controller verwaltet den ganzen Mist. Die Schlussfolgerung daraus ist, dass eine View keine Daten verarbeitet oder manipuliert, außer seine Anzeige. Ein Modell soll erst recht nicht tun, außer Daten zu enthalten. Ein Controller soll nichts anzeigen und keine Daten enthalten.
Nur so ist es letzen Endes möglich ein stabiles Programm zu schreiben. Wenn man zb was in einer View berechnen lässt, ist es nahezu nicht mehr möglich der View irgendwas mitzuteilen, sie hängt gewissermaßen. Das musste ich feststellen, als ich in einer View ein Fraktal berechnet habe, die View war nicht mehr zu gebrauchen, überhaupt nicht.

Ich hoffe ich habe alles im gewissem Maße korrekt ausgedrückt, sehe mich selbst noch sehr am Anfang von OOP (obwohl ich schon seit über einem Jahr mit OOP-Sprachen programmiere, aber ich weiche dem immer aus, weil es noch relativ kompliziert ist. Zb in PHP setze ich noch überhaupt kein OOP ein, weil ich da noch keine Anwendung dafür finde)
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
soll das heißen das ich überhaupt keine Chance habe die eingegebenen Daten vom OldView zum NewView zu übertragen, weil die Views keine Datenverwaltung unterstützen?
 

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
Natürlich nicht, aber du hast eine NewView, der du einen Array hinzugefügt hast. Somit kann deine NewView dies. Nur ist es meiner Meinung nach Sinnlos, dass eine View (dt: Anblick; Ansicht; Sicht; Blick; Aussicht; Ausblick) Controller (dt: Regelvorrichtung; Regler; Steuerbaustein; Steuereinheit) oder Model (dt: Leitbild; Muster; Modell; Vorbild; Vorlage) Aufgaben übernimmt.

Ich will nicht sagen, dass es Ausnahmen gibt, aber eigentlich sollte die NewView die Daten aus der OldView zum Beispiel direkt anzeigen, ohne sie zwischen zu speichern, was du ja unbedingt machen willst und was auch total unnötig ist)
 

nelfisch

Carola
Registriert
15.03.08
Beiträge
108
Sehe ich auch so, nehme besser einen eigenen View-Controller, dem du dann ein View zur Anzeige übergibst, dann hast du alles gut geordnet, alles sollte, wenn du nicht wieder vergisst was zu instanzieren, richtig funktionieren....Aber trotzdem auch noch mal von mir: die Investition in ein ordentliches Buch lohnt sich auf jeden Fall :)
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Ja könnte ich natürlich machen, aber bis ich das hinbekommen habe bis das Model, der View und der Controller richtig zusammen arbeiten ist Weihnachten. Das was ich da machen will ist eh nur für mich um zu lernen...da ist das dann eh halb so wild wenn das nicht 100%ig objektorientiert ist. Die App kann ich ja anschließend nochmal mit OOP machen so sehe ich dann auch den Unterschied. Aber könnt ihr mir denn nicht verraten wie ich das Problem lösen kann? Ich will doch nur die Daten aus dem Textfeld in einer neuen View anzeigen. das sind doch bestimmt nur wenige Zeilen.
 

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
ich denke mal, dass das eine Zeile sein wird. String aus dem Textfeld rausholen: [oldViewObject.textField stringValue]
Das nur noch in die Methode einbauen die zum Anzeigen in der View gebraucht wird, weiß aber nicht wie genau, müsste ich auch erstmal basteln, schätze aber das es so gehen wird:
[oldViewObject.listItems addObject:[oldViewObject.textField stringValue]];
das geht aber nur dann, wenn das listItems Object schon initialisiert ist.

Du musst noch im Hinterkopf behalten, dass du mit Zeiger arbeitest. Nicht mit Werten. Also in der Methode oben wird nur der Zeiger übergeben, dass heißt, wenn du das Stringobject vom TextFeld löscht, dann ist auch der Speicher an der Zeigerstelle leer, beachte aber, dass du oft nur den Zeiger löscht und nicht den Wert im Speicher. Auch solltest du jedesmal ein den Zugriff einer Objectes ankündigen und retainen, damit ein Object weiß wie viele andere Objecte auf ihn zugreifen und er genau weiß, wann er sich löschen darf.
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Hallo,

vielen Dank für deinen Lösungsvorschlag, aber irgendie funktioniert das bei mir nicht.
ich habe jett folgendes gemacht:
Code:
- (void)viewDidLoad 
{
    [super viewDidLoad];
    
    oldViewObject = [[OldViewViewController alloc] init];
    oldViewObject.listItems =[[[NSMutableArray alloc] init] autorelease];
    oldViewObject.textField = [[[UITextField alloc] init] autorelease];
    
    [oldViewObject.listItems addObject:@"Madrid"];   <--- Mit statischen werten ist das kein Thema
    [oldViewObject.listItems addObject:@"London"];
    [oldViewObject.listItems addObject:@"Rom"];
    [oldViewObject.listItems addObject:@"Berlin"];
    [oldViewObject.listItems addObject:@"Paris"];
    [oldViewObject.listItems addObject:@"Moskau"];
    //[oldViewObject.listItems addObject:oldViewObject.textField.text];      <---  (*)
    
    NSLog(@"TextField: %@", oldViewObject.textField.text);
    NSLog(@"ListItems: %@", oldViewObject.listItems);
}
Das alles steht natürlich in der NewView.m
Wenn ich die Zeile mit (*) aktiviere dann schmiert der Simulator nach Eingabe eines Wertes ab.
Wenn ich die deaktiviere läuft es, aber der Wert von oldViewObject.textField.text ist immer null.
Ich kann es mir nur so erklären das beim verlassen der OldView der text aus dem Eingabefeld gelöscht wird
und der Zeiger dann ins leere zeigt.
Ist das denn so oder liegt das Problem woanders?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Wenn ich die Zeile mit (*) aktiviere dann schmiert der Simulator nach Eingabe eines Wertes ab.
Das ist kein Wunder. Du erzeugst in viewDidLoad eine neue UITextField Instanz, obwohl Du die textField Instanzvariable als IBOutlet deklariert hast. Du solltest also dieses Outlet im Interface Builder per Connection bereits initialisiert haben. Diese Initialisierung überschreibst Du mit der neuen Instanz (falls das überhaupt funktioniert, denn ich habe in Deinen Codeschnipseln hier noch keine Property Deklaration für textField gesehen), d.h. die Instanz, die auf dem Bildschirm angezeigt wird und die Instanz, die Du in viewDidLoad erzeugst, haben nichts miteinander zu tun.

Wenn ich die deaktiviere läuft es, aber der Wert von oldViewObject.textField.text ist immer null.
Wo soll der Text auch her kommen? Du greifst ja nicht auf die Instanz zu, die auf dem Bildschirm angezeigt wird.

Ich kann es mir nur so erklären das beim verlassen der OldView der text aus dem Eingabefeld gelöscht wird
und der Zeiger dann ins leere zeigt.
Ist das denn so oder liegt das Problem woanders?
Das Problem sind wohl fehlende Grundlagen. Hast Du ein gutes Buch zum Thema?

MacApple
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Danke, das war gut erklärt. Nun habe ich die Zeile in der ich ein Neues TextFeild erzeuge rausgenommen, damit ich mir das ursprüngliche TextField nicht überschreibe. Fakt ist: die NewView.m kennt immer noch das Attribut textField und dieses ist nur in der OldViewViewController.h definiert, somit kann ich mir doch jetzt eigentlich sicher sein das ich das richtige TextField anspreche, da es nirgendwo anders deklariert wurde. Der Witz an der Sache ist das der Wert des TextFields immer noch null ist wenn ich was eingebe. Also scheint es doch ein anderes TextField zu sein was ich anspreche, aber welches?

Im Interface Builder hab ich hab ich das TextField auch mit dem FilesOwner verbunden, das Delegate ebenfalls, also daram kanns auch nicht liegen.
Übrigens.. den Wert des TextField mit OldViewViewController.textField.text zu ermitteln gibt ne Fehlermeldung nach dem Motto:.... not a structure or a unin.

Jedenfalls scheint es so als würde ich immer noch in keinster weise auf mein TextFeld zugreifen, obwohl er die Attribute textField usw. alle kennt.
Woran liegt das und wie kann ich jetzt auf mein TextField in der NewView zugreifen?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Übrigens.. den Wert des TextField mit OldViewViewController.textField.text zu ermitteln gibt ne Fehlermeldung nach dem Motto:.... not a structure or a unin.

Jedenfalls scheint es so als würde ich immer noch in keinster weise auf mein TextFeld zugreifen, obwohl er die Attribute textField usw. alle kennt.
Woran liegt das und wie kann ich jetzt auf mein TextField in der NewView zugreifen?
Aufgrund der Fehlermeldung kann ich nun davon ausgehen, dass Du im Moment auf gar kein UITextField zugreifst, weil Deine Klasse OldViewViewController keine Accessoren für das Textfeld hat. Du musst in OldViewViewController das Outlet für UITextField noch als Property deklarieren.

Das sind aber wirklich Grundlagen, die Dir noch fehlen. Schau Dir die noch mal an.

MacApple
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Dein nächster Fehler wird dann, wie glaube ich schon von jemandem erwähnt wurde, dass ein NSTextField keine -text - Methode versteht. -stringValue ist hier richtig.

Ich schlage dir mal Folgendes vor: Lies einfach ein einführendes Buch. Ich und Andere sagen es dir in jedem Beitrag hier. Du hast jedem Anschein nach einfach keine Grundlagen, OOC Kenntnisse hin oder her!

Gruss ppocket
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Dein nächster Fehler wird dann, wie glaube ich schon von jemandem erwähnt wurde, dass ein NSTextField keine -text - Methode versteht. -stringValue ist hier richtig.
Da lägest Du richtig, wenn er ein NSTextField hätte. Er hat aber ein UITextField. Es geht hier offensichtlich um ein iPhone Programm.

MacApple
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
achja, logisch... zu schnell überlegt. Tut mir leid...

Gruss ppocket
 

Pii

Rheinischer Krummstiel
Registriert
25.06.07
Beiträge
383
..., weil Deine Klasse OldViewViewController keine Accessoren für das Textfeld hat.
Eine Woche und 30 Beiträge später sind wir wieder an diesem Punkt. Mal sehen ob er jetzt das Buch in die Hand nimmt, und sich endlich die Grundlagen anliest.
 
Zuletzt bearbeitet:

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
weil ich eigentlich weiss, dass es ums iPhone geht. :)

Gruss ppocket
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Richtig es geht um eine iPhone Applikation.. und übrigens wieso geht ihr davon aus das mir propertys fehlen? meine aktuelle OldViewViewController.h hat noch niemand von euch gesehen, stimmts? Da stehen nämlich für jedes Outlet auch propertys drin und ja.... das habe ich aus einem Buch das sowas darein muss und in der .m stehen auch die passenden @synthesize-Befehle drin.
Wer will kann sich das ja mal anschauen:

OldViewViewController.h
Code:
#import <UIKit/UIKit.h>

@interface OldViewViewController : UIViewController 
{
    NSMutableArray *listItems;
    NSString *saveText;
    
    IBOutlet UITextField *textField;
    IBOutlet UIButton *newViewButton;
    IBOutlet UIBarButtonItem *fertig;

}
@property(nonatomic, retain) NSMutableArray *listItems;
@property(nonatomic, retain) UITextField *textField;
@property(nonatomic, retain) NSString *saveText;
@property(nonatomic, retain) UIBarButtonItem *fertig;
-(IBAction)buttonPressed:(id)sender;
-(IBAction)doneInput:(id)sender;

@end
Habe auch verschiedene Parameter für die propertys ausprobiert aber das macht die ganze Sache nur noch schlimmer.
Jedenfalls greife ich in der NewView auch nicht auf die Original ListItems zu und auf das TextField schonmal gar nicht.
Aber er kennt diese Attribute in der NewView obwohl die nur in der OldView definiert worden sind. das ist bestimmt nur noch ne Kleinigkeit.

EDIT: Wenn ich auf OldViewViewController.textField.text zugreifen will gibt es den Fehler: NewView.m:46: error: request for member 'text' in something not a structure or union
Alle drei Kontrukte sind farbig und werden auch über ESC angezeigt also kennt er die.
Wie kann ich den Fehler beseitigen?
 
Zuletzt bearbeitet:

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
übrigens wieso geht ihr davon aus das mir propertys fehlen?
Ich kann nicht für die anderen sprechen, aber ich hatte bisher nur den Code von Deinem Post #3 (da gibt's keine Property für UITextField) und die Fehlermeldung als Anhaltspunkt.

EDIT: Wenn ich auf OldViewViewController.textField.text zugreifen will gibt es den Fehler: NewView.m:46: error: request for member 'text' in something not a structure or union
Hast Du da wirklich
Code:
OldViewViewController.textField.text
stehen oder nicht doch eher
Code:
oldViewObject.textField.text
Im ersten Fall würdest Du nämlich auf das Klassenobjekt zugreifen und nicht auf die Instanz.

MacApple