Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: OS X Entwicklerforum. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

  • »asyx« ist der Autor dieses Themas

Beiträge: 67

Wohnort: Düsseldorf

Beruf: Student

Hobbys: Programmieren, Computerspiele von Tetris über WoW bis Battlefield oder auch die Sims wenn die Langeweile zu groß ist.

  • Private Nachricht senden

1

Samstag, 9. Oktober 2010, 22:26

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-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
- (voidawakeFromNib {
    NSBundlebundle = [NSBundle mainBundle];
    filePath = [[bundle pathForResource:@"Contacts" ofType:@"plist"retain];
    contacts = [[[NSMutableArray allocinitautorelease];
    NSFileManagerfileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:filePath]) {
        NSMutableArraycontactsFile = [[NSMutableArray allocinitWithContentsOfFile:filePath];
        for (id contact in contactsFile) {
            [arrayContacts addObject:contact];
        }
    }
    [fileManager release];
}


ließt die Daten beim Start ein.

PHP-Quelltext

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


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

PHP-Quelltext

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


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

2

Samstag, 9. Oktober 2010, 22:44

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« (9. Oktober 2010, 22:50)


  • »asyx« ist der Autor dieses Themas

Beiträge: 67

Wohnort: Düsseldorf

Beruf: Student

Hobbys: Programmieren, Computerspiele von Tetris über WoW bis Battlefield oder auch die Sims wenn die Langeweile zu groß ist.

  • Private Nachricht senden

3

Samstag, 9. Oktober 2010, 23:07

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« (9. Oktober 2010, 23:12)


4

Samstag, 9. Oktober 2010, 23:20

Die plist erzeugst Du ja durch Speichern eines Arrays. Objekte aus NSMutableArrays entfernt man mit removeObjectAtIndex:. NSArrayController bietet auch eine Reihe von Möglichkeiten zum Entfernen von Objekten. Die kannst Du jetzt aber auch mal selber in der Dokumentation nachschlagen.

Michael

  • »asyx« ist der Autor dieses Themas

Beiträge: 67

Wohnort: Düsseldorf

Beruf: Student

Hobbys: Programmieren, Computerspiele von Tetris über WoW bis Battlefield oder auch die Sims wenn die Langeweile zu groß ist.

  • Private Nachricht senden

5

Sonntag, 10. Oktober 2010, 19:20

PHP-Quelltext

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


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-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
- (void)handleChangeSelection:(NSNotification*)note {
    NSMutableArrayarr = [arrayContacts arrangedObjects];
    NSInteger index = [arrayContacts selectionIndex];
    NSDictionarydict = [arr objectAtIndex:index];
    NSStringbday = [dict valueForKey:@"birthday"];
    NSDatetoday = [NSDate date];
    NSDateFormatterdfDay = [[[NSDateFormatter allocinitautorelease];
    NSDateFormatterdfMonth = [[[NSDateFormatter allocinitautorelease];
    NSDateFormatterdfYear = [[[NSDateFormatter allocinitautorelease];
    [dfDay setDateFormat:@"dd"];
    [dfMonth setDateFormat:@"MM"];
    [dfYear setDateFormat:@"yyyy"];
    NSStringdToday = [dfDay stringFromDate:today];
    NSStringmToday = [dfMonth stringFromDate:today];
    NSStringyToday = [dfYear stringFromDate:today];
    NSArraybdaySplitted = [bday componentsSeparatedByString:@"."];
    NSIntegerdBday = [bdaySplitted objectAtIndex:0];
    NSIntegermBday = [bdaySplitted objectAtIndex:1];
    NSIntegeryBday = [bdaySplitted objectAtIndex:2];
    NSIntegerintDtoday = [dToday intValue];
    NSIntegerintMtoday = [mToday intValue];
    NSIntegerintYtoday = [yToday intValue];
    NSIntegerintDBday = [dBday intValue];
    NSIntegerintMBday = [mBday intValue];
    NSIntegerintYBday = [yBday intValue];
    NSIntegermaxDayMonth;
    if(intDBday <= && ((intMBday intMtoday) == || (intMBday intMtoday) == 0)) {
        if (intMtoday == || intMtoday == || intMtoday == || intMtoday == || intMtoday == || intMtoday == 10 || intMtoday == 12) {
            maxDayMonth 31;
        } else {
            if (intMtoday == || intMtoday == || intMtoday == || intMtoday == 11) {
                maxDayMonth 30;
            } else {
                if (intMtoday == 2) {
                    if ((intYtoday 100) == 0) {
                        if ((intYtoday 400) == 0) {
                            maxDayMonth 29;
                        } else {
                            maxDayMonth 28;
                        }

                    } else {
                        if ((intYtoday 4) == 0) {
                            maxDayMonth 29;
                        } else {
                            maxDayMonth 28;
                        }

                    }

                }
            }

        }
        NSIntegertoEndOfMonth maxDayMonth intDtoday;
        NSIntegerindicatorValue toEndOfMonth intDBday;
        if (indicatorValue <= 7) {
            [getLevelIndicator setIntValue:indicatorValue];
        } else {
            [getLevelIndicator setIntValue:7];
        }
    } else {
        if (intDtoday intDBday) {
            [getLevelIndicator setIntValue:7];
        } else {
            NSIntegerindicatorValue intDBday intDtoday;
            [getLevelIndicator setIntValueindicatorValue];
        }
    }
}


Sehr viel Code und sehr viele Warnungen und 4 Errors. Hier mal nen Screenshot

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 =(.

6

Sonntag, 10. Oktober 2010, 19:59

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.

  • »asyx« ist der Autor dieses Themas

Beiträge: 67

Wohnort: Düsseldorf

Beruf: Student

Hobbys: Programmieren, Computerspiele von Tetris über WoW bis Battlefield oder auch die Sims wenn die Langeweile zu groß ist.

  • Private Nachricht senden

7

Sonntag, 10. Oktober 2010, 21:26

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« (10. Oktober 2010, 21:35)


Verwendete Tags

NSArrayController, NSTableView, plist, XML

Social Bookmarks