Grundlegende Verständnis-Frage

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

  • Grundlegende Verständnis-Frage

    Hi,

    kurz vorweg, ich habe schon viel gesucht, bevor ich hier ankam ;(


    Aber ich glaube ich bin jetzt an dem Punkt wo ich direkte Aufklärung auf direkte Fragen brauche. (Auch wenns für viele PillePalle sein wird =) )




    ich habe das Problem, das eine Variable (selectedEvent) bei mir 2x was unterschiedliches ausgibt. Keine Ahnung ob ich damit richtig liege, aber ich vermute er gibt irgend eine Speicheradresse oder so aus? Die Variable is global gesichert und wurde zuvor erfolgreich von einem UITableViewController übergeben.Das erste NSLog bestätigt mir das!


    Wenn ich aber das "selectedEvent" vergleichen möchte schmiert die app ab. Deswegen habe ich es mit "NSNumber *zahl2 = ..." versucht. Was funktioniert, nur mit falschen Werten.


    Quellcode

    1. NSLog(@"Selected Event: %@\n\n",selectedEvent);
    2. int i = 0;
    3. for (EventsET *event in events) {
    4. NSNumber *zahl1 = [NSNumber numberWithInt:i];
    5. NSNumber *zahl2 = [NSNumber numberWithInt:selectedEvent];
    6. NSLog(@"%@",zahl2); // Hier kommt eine 8 oder 9-Stellige Zahl (statt 2-Stellig)
    7. if ([zahl1 isEqualToNumber:zahl2])
    8. {
    9. // Objecte dem Array allObjectsOfEvents hinzufügen
    10. // damit man über jede Funktion darauf zugreifen kann
    11. [self.allAttributesOfEvents addObject:event.nameAT];
    12. [self.allAttributesOfEvents addObject:event.datumAT];
    13. [self.allAttributesOfEvents addObject:event.idAT];
    14. NSLog(@"HIER GEHTS WEITER");
    15. }
    16. i = i +1;
    17. }
    Alles anzeigen



    Wäre echt sehr dankbar für gute Ratschläge. ;(
    Vielen Dank =)
  • Ich glaube, Du gehst davon aus, dass 'selectedEvent' ein Integer ist.
    Wenn Deine Logausgabe den richtigen Wert zurück gibt und Du das Ganze über eine TableView korrekt hast anzeigen lassen, ist diese Vermutung vermutlich falsch.
    Ich vermute, Du hast es mit einem NSString zu tun. Und wenn Du den mit einem NSNumber vergleichen möchtest muss das nicht klappen.

    Welche Meldung genau hast Du in der Logausgabe nach dem Absturz?
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • for (EventsET *event in events) {
    NSNumber *zahl2 = [NSNumber numberWithInt:selectedEvent];

    fällt dir da was auf?
    Du willst doch bestimmt event vergleichen und nicht selectedEvent
    Oder du sagst ihm was selectedEvent überhaupt ist
  • oh man gleich soviele neue Fragen =) Danke für die schnelle Antwort.

    Vielleicht vorweg die Grundidee:
    Ich habe eine SQLite-Datenbank mit CoreData erstellt (funktioniert 100%). Im ersten View werden stupide alle Daten ausgegeben. Beim anklicken einer Cell wird dann die ID an den EditViewController überreicht (selectedEvent). Das funktioniert auch, da ich dort genau den Wert ausgeben kann, den ich übermittel.
    Dann werden nochmal alle Daten aus der Datenbank gelesen und das erstellte Array wird durchgenommen (for (EventsET *event in events) {...}). Und innerhalb dieser Schleife soll der X-te Aufruf (selectedEvent) die zugehörigen Daten des Events in eine Variable(oder Array) speichern.

    Ich persönlich vermute das es deutlich einfacher geht, wenn man weiß wie. Ich brauche quasi nur den (vollständigen) Datensatz mit der ID des ausgewählten Events (selectedEvent).



    Also:

    Ich kann leider nicht sagen was das für ein Datensatz ist. Aber ausgegeben wird eine Zahl. Könnte durchaus ein String sein, da ich (unter anderem auch an anderen stellen) 7x ein gelbes Dreieck beim Compilieren habe.
    (inkompatible pointer typesinitializing 'NSString *' ... )



    @wolf_10de:
    ich möchte eigentlich nur die anzahl der durchläufe (i) mit dem ausgewähltem Event (selectedEvent) vergleichen, dann habe ich den Datensatz an der Stelle selectedEvent.



    Einfacher wäre direkt das Objekt, an der Stelle wo selectedEvent = id ist, aus der Datenbank zu laden. Aber da saß ich schon so lange dran, das ich es über den Umweg der Schleife mit Zähler und If-Abfrage versucht habe.


    Über folgenden Code durchlaufe ich alle Datensätze der Datenbank-Entität "EventsET". Wenn ich wüsste wie, würde ich auch auf die Schleife und If-Dings verzichten. Nimmt doch nur ne Menge Arbeit dem iPhone ab, wenn man das Objekt direkt ansprechen kann.

    Quellcode

    1. for (EventsET *event in events) {...}







    Ich hoffe ich habe soweit vorerst alle Fragen ausreichend beantwortet. Vielen Dank nochmal!
  • Core Data ist KEINE DATENBANK!!!™

    Du hast ein NSManagedObject vom Typ EventsET. (Zur Namensgebung sagen wir mal nix weiter. Außer vielleicht: ist doch keine Collection, die Einzahl wäre weniger verwirrend)

    Und das bedeutet, Du hast ein NSManagedObject vom Typ EventsET. Das heißt, [selectedEvent nameAT] liefert genau das, was Du erwartest.
    Fertig.

    Semantisch korrekt wäre Dein Vergleich also ungefähr so:

    C-Quellcode

    1. NSLog(@"Selected Event: %@\n\n",selectedEvent);
    2. for (EventsET *event in events) {
    3. if ([event isEqualTo:selectedEvent])
    4. {
    5. // Objecte dem Array allObjectsOfEvents hinzufügen
    6. // damit man über jede Funktion darauf zugreifen kann
    7. [self.allAttributesOfEvents addObject:event.nameAT];
    8. [self.allAttributesOfEvents addObject:event.datumAT];
    9. // Vergiss einfach die IDs, außer Du brauchst sie zur Synchronisation mit irgendwelchen Servern.
    10. NSLog(@"HIER GEHTS WEITER");
    11. }
    12. }
    Alles anzeigen


    Merkste selbst, oder? ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Marco Feltmann schrieb:

    Merkste selbst, oder? ;)

    Offensichtlich nicht.

    WENN [event isEqualTo:selectedEvent] und [event nameAT], DANN [selectedEvent nameAT].

    Der Vergleich ist also nicht falsch im Sinne von unterschiedliche Datentypen benutzt. Der Vergleich ist falsch im Sinne von vollkommen unnötig.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • die lösung so wie du es angeboten hattest, hat auch nicht funktioniert. und zwar nicht nur nicht funktioniert, sondern auch noch mit Fehlermeldung gar nicht erst kompiliert.

    Ich habe es folgendermaßen gelöst. hier der komplette Ausschnitt der Schleife:

    Quellcode

    1. int i = 0;
    2. for (EventsET *event in events) {
    3. // LOG-Ausgabe des gefilterten Objects
    4. // NSLog(@"Event: (ID# %@) %@ [%@]\n",event.idAT, event.nameAT, event.datumAT);
    5. // Kontroll-Ausgabe der selectedEvent
    6. // beim ersten Durchlauf der Schleife
    7. if(i == 0)
    8. {
    9. NSLog(@"SelectedEvent: %@",selectedEvent);
    10. }
    11. // String zum vergleichen von identifier und i
    12. NSString *zahl2 = [NSString stringWithFormat:@"%i",i];
    13. // Wenn der identifier und i gleich sind,
    14. // die Textfelder füllen
    15. // und alle Werte in Variablen/Array sichern
    16. if ([self.identifier isEqualToString:zahl2]) {
    17. // Kontroll-Ausgabe im NSLog ob auch die korrekten Daten ermittelt wurden
    18. NSLog(@"Event: (ID# %@) %@ [%@]\n\n",event.idAT, event.nameAT, event.datumAT);
    19. self.editNameTextField.text = ermittelterNameAT;
    20. [self.editDatumTextField setText:[dateFormatter stringFromDate:event.datumAT]];
    21. }
    22. i++;
    23. }
    Alles anzeigen

    Einfacher und sinnvoller wäre es sicherlich direkt zwei Integer oder NSNumber zu vergleichen anstatt zwei Strings mit Zahlen zu vergleichen =)Da mr allerdings die Zeit davon rennt, muss ich quick&dirty programmieren. Nur damit ich was zum Abgeben habe.
  • petatschok schrieb:

    die lösung so wie du es angeboten hattest, hat auch nicht funktioniert. und zwar nicht nur nicht funktioniert, sondern auch noch mit Fehlermeldung gar nicht erst kompiliert.

    Das liegt dann weniger an der angebotenen Lösung als viel mehr an Deiner Umsetzung.

    Wenn Du selectedEvent als NSManagedObject definierst, kannst Du natürlich nicht direkt auf nameAT zugreifen. Du müsstest Casten oder das Ding gleich als EventsET definieren.

    [object isEqualTo:anotherObject] ist dasselbe wie x = y in der Mathematik.

    Wenn Dir der Compiler was Anderes erzählt, dann liegt das an Dir.
    (beispielsweise weil Du weiter oben definiert hast x sei auf alle Fälle kleiner 0 und y kann gern größer 0 sein.)

    Hör um Himmels Willen auf irgendwelche Zeiger auf Strings die Zahlen darstellen zu übergeben und übergib einfach Zeiger auf das gewünschte Objekt.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • petatschok schrieb:

    Nur damit ich was zum Abgeben habe.

    Sofern die Abgabe bewertet wird solltest Du es lieber richtig™ machen.

    Wie übergibst Du denn selectedEvent an das Objekt, das diese Schleife ausführt?
    (Bitte den kompletten Verlauf von der Definition über die Zuweisung bis zur Übergabe.)

    Ich denke, Du hast in letzter Zeit viel mit Java/C# und SQLite gearbeitet. Das wird Dir hier zum Verhängnis, sorgt für Sorgenfalten und ausgerupfte graue Haare sowie einen ungerechtfertigten Hass auf Objective-C und Cocoa. :P
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Es ist meine letzte Abgabe die auch benotet wird. Allerdings glaube ich nicht, das der Prof es so eng sehen wird, wie es programmiert ist, sofern alles funktioniert. Es geht vielmehr darum ein(e) Idee/Konzept umzusetzen.
    ich versuch mal darauf zu antworten soweit ich es kann und verstanden habe. Vorweg, ich hab früher mehr mit PHP und MySQL gearbeitet. Mein Hass is eigentlich nicht so stark auf Cocoa usw. Es gibt glaub viele Gutes, soweit ich es gelesen habe.


    Ich habe 2 Views:
    TableView und Startbildschirm ist: EventListenerViewController
    StandardView und zweiter Bildschirm ist: EditEventViewController

    in der AppDelegate habe ich dann (versucht ^^) globale Variablen zu speichern, die für alle und jeden und immer und überall verfügbar sind.

    Quellcode

    1. @property (strong, nonatomic) EventListenerViewController *selectedEvent;





    In der TableView von EventListerViewController habe ich dann folgende Methode:

    Quellcode

    1. - (void)tableView:(UITableView *)
    2. tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    3. {
    4. // Das gewählte Event merken.
    5. // Globale Variable ändern und ausgeben
    6. AppDelegate *myAppDelegate = [[UIApplication sharedApplication] delegate];
    7. myAppDelegate.selectedEvent = [NSString stringWithFormat:@"%d",indexPath.row];
    8. NSLog(@"%@",myAppDelegate.selectedEvent);
    9. // Den Segue für die Detailansicht starten.
    10. [self performSegueWithIdentifier: @"EditEventsSegue" sender:self];
    11. }
    Alles anzeigen




    dann geht er auf den zweiten Bildschirm (EditEventViewController): und da steht folgendes im ViewDidLoad

    Quellcode

    1. - (void)viewDidLoad{ [super viewDidLoad]; self.ermittelterNameAT = @""; // vereinfachte Datumsausgabe NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd/MM/yyyy"]; AppDelegate *myAppDelegate = [[UIApplication sharedApplication] delegate]; EventListenerViewController *selectedEvent = myAppDelegate.selectedEvent; NSLog(@"EventID: %@",selectedEvent); // Objekt anlegen worin gespeichert werden soll NSManagedObjectContext *myContext = [CoreDataHelper managedObjectContext]; // Eine Abfrage auf die Entität EventsET // Ohne Filter - mit aufsteigendem Datum (Sortierung) NSSortDescriptor *eventIDSort = [[NSSortDescriptor alloc] initWithKey:@"datumAT" ascending:YES]; NSArray *sortierteAusgabe = @[eventIDSort]; NSArray *events = [CoreDataHelper fetchEntitiesforClass:[EventsET class] withPredicate:nil andSortDescriptors:sortierteAusgabe inManagedObjectContext:myContext]; self.identifier = selectedEvent; NSLog(@"%@",self.identifier); // Object aus der Datenbank filtern // solange durchlaufen bis der X-te == ausgewählte ID des Events int i = 0; for (EventsET *event in events) { // LOG-Ausgabe des gefilterten Objects // NSLog(@"Event: (ID# %@) %@ [%@]\n",event.idAT, event.nameAT, event.datumAT);
    2. // Kontroll-Ausgabe der selectedEvent // beim ersten Durchlauf der Schleife if(i == 0) { NSLog(@"SelectedEvent: %@",selectedEvent); }
    3. // String zum vergleichen von identifier und i NSString *zahl2 = [NSString stringWithFormat:@"%i",i]; // Wenn der identifier und i gleich sind, // die Textfelder füllen // und alle Werte in Variablen/Array sichern if ([self.identifier isEqualToString:zahl2]) { // Kontroll-Ausgabe im NSLog: selectedEvent NSLog(@"Event: (ID# %@) %@ [%@]\n\n",event.idAT, event.nameAT, event.datumAT); self.ermittelterNameAT = [NSString stringWithFormat:@"%@",event.nameAT]; [self.ausgewaehltesEventObject addObject:event.datumAT]; // NSLog-Kontroll-Ausgabe der Attribute NSLog(@"ermittelterNameAT: %@", self.ermittelterNameAT); NSLog(@"Identifier: %@",self.identifier); NSLog(@"Datum: %@",event.datumAT); // self.editNameTextField.text = self.ermittelterNameAT; [self.editDatumTextField setText:[dateFormatter stringFromDate:event.datumAT]]; } i++; }
    4. }
    Alles anzeigen




    in der Zeile "self.identifier = selectedEvent;" habe ich einen Hinweis:
    Inkompatible pointer Types assigning to 'NSString *' from 'EventListenerViewController *'




    Ich hoffe ich habe da jetzt nichts ausgelassen, oder scheint bei mir noch was verwirrend zu sein?
  • petatschok schrieb:

    in der Zeile "self.identifier = selectedEvent;" habe ich einen Hinweis:
    Inkompatible pointer Types assigning to 'NSString *' from 'EventListenerViewController *'

    Exakt dieses. Du machst da Dinge die so nicht sein sollten.

    1) Du wirst goldrichtig darauf hingewiesen, dass Du einen Zeiger auf EventListenerViewController definiert hast, aber einen Zeiger auf NSString speicherst.
    Lektion 1: Nimm alle Warnungen ernst, sie weisen Dich darauf hin, dass Du vermutlich etwas unglaublich Dummes tust.

    2) Du wirst sicherlich irgendwo die Referenzen auf deine EventsET vorhalten. Idealerweise in einem Array. Falls nicht: ändere das. ;) Aber mutmaßlich wirst Du irgendwo ein Label mit den Informationen des Events füttern.
    Und hier greifst Du dann in der didSelectRowAtIndexPath entsprechend ein.

    C-Quellcode

    1. // Weiter oben definierst du Folgendes um:
    2. @property (strong, nonatomic) EventListenerViewController *selectedEvent;
    3. // Hier gehts dann so weiter
    4. -tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    5. {
    6. // Das ist keine "Globale Variable" sondern nur eine Instanzvariable des App Delegate. Himmelweiter Unterschied. Und eigentlich auch nicht nötig, da Du sie dem Segue als eigene Instanzvariable übergeben könntest. :)
    7. AppDelegate *myAppDelegate = [[UIApplication sharedApplication] delegate];
    8. myAppDelegate.selectedEvent = [eventsArray objectAtIndex:[indexPath row]];
    9. NSLog(@"%@",myAppDelegate.selectedEvent);
    10. [self performSegueWithIdentifier: @"EditEventsSegue" sender:self];
    11. }
    Alles anzeigen

    Lektion 2: Objective-C hantiert im Gegensatz zu PHP sehr viel mit Zeigern. Du kannst Zeiger auf alles an alles übergeben.
    Hilf dir selbst und übergib die Zeiger, die Du brauchst, direkt an die Objekte, die damit arbeiten sollen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P