Objekt kann nicht zu NSMutableArray hinzugefügt werden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Objekt kann nicht zu NSMutableArray hinzugefügt werden

    Hallo OSX Entwickler,

    ich greife auf ein NSMutableArray eines Objekts eines anderen ViewController zu.
    Ich erzeuge ein iI_Picture Objekt (meine eigene Klasse) und will diese hinzufügen.
    Um das zu überprüfen, lass ich mir die Anzahl der Objekte im Array ausgeben und es kommt immer (null).

    Quellcode

    1. iI_MyPlanViewController *vcNewViewController = segue.destinationViewController; // Der ViewController wird über die Segue angesprochen
    2. iI_Picture *TitlePicture = [[iI_Picture alloc] init]; // Das iI_Picture wird erstellt
    3. TitlePicture.sName = @"Title Picture"; // Der Name des Pictures wird gesetzt
    4. TitlePicture.imgPicture = ivNewPicture.image; // Das Bild des Pictures wird gesetzt
    5. NSLog(@"%@", [vcNewViewController.MyPlan.maPictures count]); // Ausgabe: (null)
    6. [vcNewViewController.MyPlan.maPictures addObject:TitlePicture]; // Das Objekt wird hinzugefügt
    7. NSLog(@"%@", [vcNewViewController.MyPlan.maPictures count]); // Ausgabe: (null)
    Alles anzeigen


    Wieso kann ich nichts zu diesem Array hinzufügen?
  • Wahrscheinlich hast Du Dein Array nicht initialisiert und es ist deswegen nil. Übrigens ist die Ausgabe

    Quellcode

    1. NSLog(@"%@", [vcNewViewController.MyPlan.maPictures count]);
    falsch. Wenn die Anzahl der Elemente größer als 0 ist, gibt's einen Crash. Du solltest besser %u als Format verwenden.
    „Meine Komplikation hatte eine Komplikation.“
  • Ok, die Ausgaben sind jetzt: 0.
    Das NSMutableArray maPictures ist eine Property (retain) von MyPlan.
    Und MyPlan ist eine Property (retain) vom vcNewViewController.
    Und bei Properties muss man das Objekt doch nicht extra noch initialisieren, oder?
  • Danke, jetzt funktioniert es.

    Ich möchte dir mal meine Lernweise erläutern.
    Da es jetzt iOS 5 mit Xcode 4.2 gibt und es noch relativ neu ist, gibt es nur sehr wenige Tutorials zu diesem Gebiet.
    Ich schreibe gerade eine App und habe dabei einen klaren Plan, wie diese App sein soll.
    So kann ich am besten mit Learning-by-Doing das schreiben von Apps und die Benutzung von Objektive C erlernen.
    Bei dieser Array Frage, die meiner Meinung hätte funktionieren sollen, kann ich mich schlecht durch tausende Bücher wühlen.
    So frage ich lieber im Forum und bekomme eine schnelle und aktuelle Antwort.
  • Ich hab schon Bücher über Objektive C und so gelesen, der Großteil war aber zu Xcode 3.
    Ich arbeite mit ARC, Storyboards und Segues. Das gab es damals noch nicht.
    Eine App zu schreiben soll nicht nur einfach sein. Eine Herausforderung soll es schon geben.

    Ich hab noch mal ne Frage:
    Kann man eine IBAction machen, die auch bei einem deaktivierten Button ausgelöst wird?
  • Tja das ist der Nachteil des ARC. Es ist gut wenn man mit ARC arbeiten kann, weil es einem dann viel Tipparbeit abnimmt. Aber wenn man nicht weiß wie es ohne geht, dann weiß man auch nicht was sein App Speicehrtechnisch überhaupt so anstellt und dann kommen eben solche Sachen dabei raus, das die Leute Arrays nicht allozieren, In Subviews rumsuchen um irgendwelche Views zu finden die sie im IB angelegt haben etc.

    Wenn man nicht in der Lage ist alles was man mit dem IB macht auch programmatisch erstellen zu können, wird man immer vor Riesen Problemen stehen wenn man etwas machen möchte das der IB eben nicht anbietet oder in sonst einer Art etwas speziell ist. So wie bei dir jetzt. Wenn Du mit dem IB arbeiten willst ohne eine Ahnung von dem Code zu haben der daraus erzeugt wird, dann versuche auch nicht irgendwas ab der Norm zu machen. Denn dann must du scheitern.

    Ich finde Tool wie den IB, Storyboard, ARC super hilfreich, aber nur wenn man auch versteht was sie machen und wie sie es machen. Denn sonst kommt da nur schund bei raus.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Vyax schrieb:

    Ich hab schon Bücher über Objektive C und so gelesen, der Großteil war aber zu Xcode 3.
    Ich arbeite mit ARC, Storyboards und Segues. Das gab es damals noch nicht.

    Bis auf die Storyboards und Segues, die aber auch keine Raketenwissenschaft sind, haben Deine Probleme aber relativ wenig mit den genannten Themen zu tun.

    Inzwischen gibt es übrigens auch Bücher, die diese Themen abdecken.

    Vyax schrieb:

    Ich hab noch mal ne Frage:
    Kann man eine IBAction machen, die auch bei einem deaktivierten Button ausgelöst wird?

    Ist das nicht ein Widerspruch?
    „Meine Komplikation hatte eine Komplikation.“
  • Wiederspruch eigentlich schon, aber der Button könnte doch seinem Delegate eine Nachricht senden, falls er angetippt wurde, egal, ob aktiviert oder nicht.

    Der Sachverhalt ist so:
    Wenn der Button angetippt wird, soll geprüft werden, ob alle Eingaben getätigt wurden und dann soll ein neuer ViewController angezeigt werden.
    Wenn ich per Code den neuen ViewController anzeigen will, brauche ich diesen ViewController als Objekt und ich weis nicht, wie ich diesen als Objekt bekommen soll.
    In früheren Versionen von Xcode konnte man diesen als IBOutlet definieren, aber den File's Owner gibt es nicht mehr.
    So hab ich die beiden ViewController per Segue verbunden, die aber immer ausgelöst wird, wenn der Button angetippt wird.
    Also deaktiviere ich den Button so lange, bis man alle Eingaben getätigt hat.
    Wenn der Benutzer aber vorher auf den Button tippt, wundert er sich wahrscheinlich, warum nichts passiert.
    Somit will ich erreichen, dass beim Antippen des deaktivierten Buttons eine Meldung kommt.

    Gebt es eine solche Möglichkeit? Wie kann ich per Code den anderen ViewController ermitteln?
  • In der segue Aufrufmethode kannst du den ZielVC Abfragen und somit entweder diesen einer iVar von self zuweisen , oder einer iVar vom ZielVC Self zuweisen.
    Damit hast du Zugriff auf den anderen VC.

    Achte darauf keine Retain-Schleife aufzubauen (weak sollte hier das Zauberwort sein).

    Zum Thema Abfrage ob etwas eingeben wurde, bevor die Segue aufgerufen wird, hab ich ja was im anderen Thread was geschrieben.