NSTableView in plist "dumpen" bzw Zeilen einzeln auslesen

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

  • NSTableView in plist "dumpen" bzw Zeilen einzeln auslesen

    Hallo!

    Ich versuche mich seit einiger Zeit an Cocoa und Objetive-C. Vorher habe ich 2 Jahre C# mit .Net benutzt (natürlich auf der Dose) und davor PHP. Eigendlich dachte ich mir ja "kannse einen C-Dialekt, kannst du alle"... naja... fast...
    Nachdem ich mich zum kauf eines iMacs 27" mit i7 entschieden habe, möchte ich als primäres OS doch lieber das Mac OS X bzw. das iPhone nehmen. Mein größtes Problem ist aber momentan das NSTableView. Unter .Net gibt es sowas ähnliches. DataGridView. Ein DGV hat eine DataSource und die kann ich mit Datenbanken oder XML-Files verknöppeln. Eigendlich ne runde Sache. Nach einigem googlen kam ich auf den NSArrayController als DataSource gekommen. Mitlerweile kann ich Dateien hinzufügen, aus dem NSTableView löschen (bzw. aus dem ArrayController)

    PHP-Quellcode

    1. - (void) awakeFromNib {
    2. NSBundle* bundle = [NSBundle mainBundle];
    3. filePath = [[bundle pathForResource:@"Contacts" ofType:@"plist"] retain];
    4. contacts = [[[NSMutableArray alloc] init] autorelease];
    5. NSFileManager* fileManager = [NSFileManager defaultManager];
    6. if ([fileManager fileExistsAtPath:filePath]) {
    7. NSMutableArray* contactsFile = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
    8. for (id contact in contactsFile) {
    9. [arrayContacts addObject:contact];
    10. }
    11. }
    12. [fileManager release];
    13. }
    Alles anzeigen


    ließt die Daten beim Start ein.

    PHP-Quellcode

    1. - (IBAction)pushSave:(id)sender {
    2. NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
    3. [txtName stringValue], @"name",
    4. [txtFirstName stringValue], @"firstName",
    5. [txtNumber stringValue], @"number",
    6. [txtBirthDay stringValue], @"birthday",
    7. nil];
    8. [arrayContacts addObject:dict];
    9. NSFileManager* fileManager = [NSFileManager defaultManager];
    10. if ([fileManager fileExistsAtPath:filePath] || [fileManager isWritableFileAtPath:filePath]) {
    11. [[arrayContacts arrangedObjects] writeToFile:filePath atomically:YES];
    12. }
    13. [fileManager release];
    14. }
    Alles anzeigen


    ist für das Speichern nach dem erstellen eines NEUEN Eintrags.

    PHP-Quellcode

    1. - (IBAction)pushRemove:(id)sender {
    2. [arrayContacts remove:self];
    3. }


    für das Löschen des makrierten Eintrages.
    So... Wie bekomme ich jetzt den zu löschenden Eintrag aus der plist und wie komme ich an jeden einzelnen Datensatz um ihn ggf. an einen Server oder eine Datenbank zu schicken. Kann ich Arrays so ausgeben wie in C? z.B. für Spalte 3 Reihe 5 tableViewDatensaetze[3][5]; oder so?

    MfG Asyx
  • Auf die Elemente in einem NSArray (NSMutableArray erbt von NSArray) greift man mit objectAtIndex: zu. Das wären dann die Zeilen (ein Datensatz) Deiner Tabelle. Wie Du dann auf die Spalten zugreifst, hängt davon ab, was Du in dem Array gespeichert hast. Hier hast Du ja NSMutableDictionaries verwendet. Also musst Du dann mit der entsprechenden Methode von NSDictionary (NSMutableDictionary erbt von NSDictionary) objectForKey: die Werte der Spalten auslesen.

    Michael

    PS. In Deiner awakeFromNib Methode in Zeile sieben erzeugst Du ein Speicherleck.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Michael ()

  • Danke! Damit kann ich schonmal die Datensätze auslesen. Wie ist das jetzt mit dem Löschen aus der plist?

    Danke für die info mit dem Speicherleck. Kann man das mit Tools testen? Bei .Net fliegen unerreichbare Variablen oder Instanzen einfach von selbst und spätestens beim schließen raus. Darum achte ich da wenig drauf.

    Edit: Am einfachsten ist sicher, die plist zu löschen und neu zu schreiben. Aber das funktioniert nicht. Ich muss die plist einmal per hand manuell anlegen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von asyx ()

  • PHP-Quellcode

    1. - (IBAction)pushRemove:(id)sender {
    2. [arrayContacts remove:self];
    3. NSFileManager* fileManager = [NSFileManager defaultManager];
    4. if ([fileManager fileExistsAtPath:filePath] || [fileManager isWritableFileAtPath:filePath]) {
    5. [[arrayContacts arrangedObjects] writeToFile:filePath atomically:YES];
    6. }
    7. [fileManager release];
    8. }


    das klappt ganz gut. Jetzt hab ich aber noch einen NSLevelIndicator. Der soll die verbliebenen Tage bis zum Geburtstag einer Person anzeigen. Momentan habe ich das so "gelöst":

    PHP-Quellcode

    1. - (void)handleChangeSelection:(NSNotification*)note {
    2. NSMutableArray* arr = [arrayContacts arrangedObjects];
    3. NSInteger index = [arrayContacts selectionIndex];
    4. NSDictionary* dict = [arr objectAtIndex:index];
    5. NSString* bday = [dict valueForKey:@"birthday"];
    6. NSDate* today = [NSDate date];
    7. NSDateFormatter* dfDay = [[[NSDateFormatter alloc] init] autorelease];
    8. NSDateFormatter* dfMonth = [[[NSDateFormatter alloc] init] autorelease];
    9. NSDateFormatter* dfYear = [[[NSDateFormatter alloc] init] autorelease];
    10. [dfDay setDateFormat:@"dd"];
    11. [dfMonth setDateFormat:@"MM"];
    12. [dfYear setDateFormat:@"yyyy"];
    13. NSString* dToday = [dfDay stringFromDate:today];
    14. NSString* mToday = [dfMonth stringFromDate:today];
    15. NSString* yToday = [dfYear stringFromDate:today];
    16. NSArray* bdaySplitted = [bday componentsSeparatedByString:@"."];
    17. NSInteger* dBday = [bdaySplitted objectAtIndex:0];
    18. NSInteger* mBday = [bdaySplitted objectAtIndex:1];
    19. NSInteger* yBday = [bdaySplitted objectAtIndex:2];
    20. NSInteger* intDtoday = [dToday intValue];
    21. NSInteger* intMtoday = [mToday intValue];
    22. NSInteger* intYtoday = [yToday intValue];
    23. NSInteger* intDBday = [dBday intValue];
    24. NSInteger* intMBday = [mBday intValue];
    25. NSInteger* intYBday = [yBday intValue];
    26. NSInteger* maxDayMonth;
    27. if(intDBday <= 7 && ((intMBday - intMtoday) == 1 || (intMBday - intMtoday) == 0)) {
    28. if (intMtoday == 1 || intMtoday == 3 || intMtoday == 5 || intMtoday == 7 || intMtoday == 8 || intMtoday == 10 || intMtoday == 12) {
    29. maxDayMonth = 31;
    30. } else {
    31. if (intMtoday == 4 || intMtoday == 6 || intMtoday == 9 || intMtoday == 11) {
    32. maxDayMonth = 30;
    33. } else {
    34. if (intMtoday == 2) {
    35. if ((intYtoday % 100) == 0) {
    36. if ((intYtoday % 400) == 0) {
    37. maxDayMonth = 29;
    38. } else {
    39. maxDayMonth = 28;
    40. }
    41. } else {
    42. if ((intYtoday % 4) == 0) {
    43. maxDayMonth = 29;
    44. } else {
    45. maxDayMonth = 28;
    46. }
    47. }
    48. }
    49. }
    50. }
    51. NSInteger* toEndOfMonth = maxDayMonth - intDtoday;
    52. NSInteger* indicatorValue = toEndOfMonth + intDBday;
    53. if (indicatorValue <= 7) {
    54. [getLevelIndicator setIntValue:indicatorValue];
    55. } else {
    56. [getLevelIndicator setIntValue:7];
    57. }
    58. } else {
    59. if (intDtoday > intDBday) {
    60. [getLevelIndicator setIntValue:7];
    61. } else {
    62. NSInteger* indicatorValue = intDBday - intDtoday;
    63. [getLevelIndicator setIntValue: indicatorValue];
    64. }
    65. }
    66. }
    Alles anzeigen


    Sehr viel Code und sehr viele Warnungen und 4 Errors. Hier mal nen Screenshot [Blockierte Grafik: http://img704.imageshack.us/i/levelindicator.png/] [Blockierte Grafik: http://img704.imageshack.us/i/levelindicator.png/] [Blockierte Grafik: http://img704.imageshack.us/img704/6753/levelindicator.png]

    Uploaded with ImageShack.us

    Was heißt das jetzt im Klartext. Die Warnungen sagen mir so gut wie gar nichts und warum ich einen NSInteger nicht mit einem anderen NSInteger addieren oder den "%" operrator anwenden... Irgendwie macht mich xCode schon wieder traurig =(.
  • NSInteger ist keine Klasse, sondern meines Wissens nach nichts anderes als long int. objectAtIndex liefert dir aber eine Objektreferenz zurück. Das erklärt schonmal die ersten drei Warnungen (meinst du vielleicht statt NSInteger NSNumber? NSNumber ist nämlich eine Klasse)
    Die nächsten 6 Warnungen kommen daher, dass dir die Methode intValue einfach einen int zurückliefert und keinen Zeiger. also statt NSInteger* nur NSInteger. Gleiches gilt für maxDayValue, toEndMonth, usw. Wenn du das als normalen NSInteger und nicht als Pointer deklarierst sollten sich nochmal diverse Warnungen und Fehlermeldungen aus dem Staub machen. Mach das mal und schau, wie viele Meldungen noch übrigbleiben.
  • Ja, Pointer wurden in .Net auch entfernt, weil sie zu fehleranfällig waren... So langsam habe ich das gefühl, als wäre die .Net Framework wie Malen nach Zahlen xD Man kann wenig falsch machen und muss nur in der lage sein von 1-x zu zählen xD

    Ich mach einfach mal.

    Edit: JUHU es funktioniert =D Habe einfach alle NSInteger* zu NSInteger geändert und alles, was dann noch eine Warnung war, ist jetzt NSNumber*. Ich glaube so langsam habe ich es Verstanden. Nur noch Datenbankanbindung und dann das selbe fürs iPhone, dann habe ich mein standard erstes Programm für eine neue Sprache fertig =D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von asyx ()