• 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

NSTextField programmatisch erzeugen und platzieren

Zettt

Doppelter Melonenapfel
Registriert
16.10.05
Beiträge
3.374
Natürlich. ;)
Ich bin ja froh, wenn sich jemand überhaupt die Zeit nehmen kann mir weiter zu helfen.
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Ich verstehe schon nicht, wieso du beim Table-View versuchst, die Daten abzuholen.

Meinetwegen mache es auf die einfach Weise und gebe deiner selbst erzeugten Controllerklasse die Eigenschaft fürs Model. Das Table-View hält keine Daten, sondern holt sich dies ab.
 

Zettt

Doppelter Melonenapfel
Registriert
16.10.05
Beiträge
3.374
Ich verstehe schon nicht, wieso du beim Table-View versuchst, die Daten abzuholen.
Oh Sorry hab mich verschrieben. Das kommt davon wenn man den Source nicht vor den Augen hat. Hatte ich naemlich mal.
Da bin ich auch irgendwann mal draufgekommen, dass der TableView ja nur zum angucken da ist und der keine Daten haelt. :eek:

Habe ein Outlet auf den Controller gelegt. Also das hier.
Code:
IBOutlet NSArrayController *arrayController;
Und in der Implementierung:
Code:
NSArray * array = [arrayController arrangedObjects];

Meinetwegen mache es auf die einfach Weise und gebe deiner selbst erzeugten Controllerklasse die Eigenschaft fürs Model. Das Table-View hält keine Daten, sondern holt sich dies ab.
Du meinst bei den Attributes des Array Controllers bei Class einfach den Namen von Model eintragen?! Da habe ich bereits gemacht.

Ich schau mal ob ich nicht einfach die Source irgendwo hochlade.

EDIT: Hier runterladen.
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Es funktioniert auch mir im Log meinetwegen den count des array's auszugeben. Nur beim Zugriff per:
Code:
[array objectAtIndex:0];
Bekomme ich irgendwelchen Zeichensalat im Log angezeigt. Grundsätzlich mal bin ich doch nicht falsch dran oder?
Ich habe mir mal Dein „Bindingstest2” Projekt angeschaut. Grundsätzlich bist Du schon auf der richtigen Fährte, aber knapp daneben ist auch vorbei.

Also, Dein Array Controller verwaltet ja Objekte vom Typ Deiner Klasse „String”. Das bedeutet, dass das Array, was Dir mit
Code:
NSArray *controllerArray = [stringArrayController arrangedObjects];
zurückgegeben wird, eben Objekte vom Typ „String” enthält. Jetzt möchtest Du ja den String, der in den „String”-Objekten steckt mit der NSLog() Funktion ausgeben. Du versuchst das mit
Code:
NSLog(@"String: %s", [controllerArray objectAtIndex:0]);
Und hier liegt auch das Problem. Im Formatstring von NSLog() benutzt Du '%s'. %s ist ein Platzhalter für eine C-String. Ein C-String ist eine mit 0 terminierte Zeichenfolge (Typ char). Du benötigst aber einen Platzhalter für ein Objective-C-Objekt. Und der lautet %@.
Das ist jetzt nur die Halbe Miete, denn wenn Du den NSString aus dem Objekt String ausgeben willst, musst Du diesen über den Accessor holen. Somit ergibt sich folgender NSLog() Funktionsaufruf:
Code:
NSLog(@"String: %@", [[controllerArray objectAtIndex:0] newString]);
MacApple
 
  • Like
Reaktionen: Zettt

Zettt

Doppelter Melonenapfel
Registriert
16.10.05
Beiträge
3.374
Code:
NSLog(@"String: %@", [[controllerArray objectAtIndex:0] newString]);
Tatsaechlich!

Aber ich hab mir das auch schonmal gedacht, dass der String einfach das falsche Format hat, weil ich per %@ im Log zumindest schonmal etwas sah wie "<String:>".
Also hab ich versucht den String zu konvertieren und hatte sowas stehen wie
Code:
NSLog(@"String: %@", [controllerArray [NSString stringWithString:objectAtIndex:0]]);

Hast du vielleicht noch eine Dokumentations- oder Sonstwas-Seite die dieses Thema behandelt? Ich hatte mir naemlich bisher gemerkt, dass man ja immer Nachrichten an Objekte verschickt. Und das mit dem zusaetzlichen "newString" geht mir gerade nicht so rein, warum ich das machen muss.

EDIT: Wie bekomme ich das Warning noch weg?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Hast du vielleicht noch eine Dokumentations- oder Sonstwas-Seite die dieses Thema behandelt?
Ja, diese zum Beispiel.

Ich hatte mir naemlich bisher gemerkt, dass man ja immer Nachrichten an Objekte verschickt. Und das mit dem zusaetzlichen "newString" geht mir gerade nicht so rein, warum ich das machen muss.
Das mit dem Nachrichten schicken ist schon richtig. Die Nachricht an das Objekt aus dem Array ist „newString”. Das ist die Accessor-Methode Deiner String-Klasse. Den Code

NSString *aString = [[controllerArray objectAtIndex:0] newString];

könnte man auch so schreiben:

String *myStringObj = [controllerArray objectAtIndex:0];
NSString *aString = [myStringObj newString];


Ist es jetzt klarer?

EDIT: Wie bekomme ich das Warning noch weg?
Du musst noch die Headerdatei Deiner String-Klasse in MyController.m importieren.

MacApple
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Habe leider nicht die Zeit, mir die Sourcen genauer anzuschauen – meine Freundin kommt gleich aus dem Kurzurlaub wieder und ich muss die Bude noch auf Vordermann bringen. Aber generell: Du solltest durch den Array-Controller nicht Strings verwalten lassen. Da sollten Entitäten herein.
 
  • Like
Reaktionen: Zettt

Zettt

Doppelter Melonenapfel
Registriert
16.10.05
Beiträge
3.374
Eine Frage habe ich noch. Und zwar verstehe ich folgendes nicht.

Wenn ich das hier schreibe:
Code:
RandomThing *head = [[[[RandomThing init]alloc]autorelease]setRandomString:@"Head"];
bekomme ich einen Build Fehler. Wogegen das hier:
Code:
RandomThing *head = [[[RandomThing init]alloc]autorelease];
[head setRandomString:@"Head"];
Wunderbar kompiliert. Ich schreibe doch nur eine Zeile mehr?! oO

Uebrigens nochmal recht herzlichen Dank an alle Helfer. Die App ist fertig und schon bei Macupdate gelistet.xD
 

zottel

James Grieve
Registriert
11.07.08
Beiträge
133
autorelease gibt self zurück, setRandomString nicht, deswegen kannst Du das Ergebnis von autorelease an head zuweisen, das von setRandomString nicht.
 
  • Like
Reaktionen: Zettt

Zettt

Doppelter Melonenapfel
Registriert
16.10.05
Beiträge
3.374
Achso OK. Danke fuer die Hilfe und auch MacApple, dem ich gerade kein Karma geben kann. :(
 

sumpfmonsterjunior

Morgenduft
Registriert
17.03.05
Beiträge
167
Code:
RandomThing *head = [[[[RandomThing init]alloc]autorelease]setRandomString:@"Head"];
bekomme ich einen Build Fehler. Wogegen das hier:
Code:
RandomThing *head = [[[RandomThing init]alloc]autorelease];
[head setRandomString:@"Head"];
Wunderbar kompiliert. Ich schreibe doch nur eine Zeile mehr?! oO

Dass alloc gehört ganz in die Mitte der Klammern:

Code:
RandomThing *head = [[[[RandomThing alloc]init]autorelease]setRandomString:@"Head"];
RandomThing *head = [[[RandomThing alloc]init]autorelease];
[head setRandomString:@"Head"];

Den Rest (Rückgabe des Zeigers) weisst Du ja schon.

Gruß, SMJ