UITableView: Es fehlt eine Zeile

cropfaktor

Aktives Mitglied
Thread Starter
Mitglied seit
18.01.2008
Beiträge
1.148
Hi in die Runde,

bei meinen Versuchen mit dem UITableView-Element ist mir Folgendes aufgefallen: Es fehlt stets eine Zeile. Setze ich return = 1, wird gar nichts ausgegeben. Setze ich return = 5 dann werden nur vier Zeilen ausgegeben:
Code:
//1. Methode für UITableView
//Anzahl der Zellen: hier 5.
- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section {
    
    //Rückgabewert: 5 Zellen
    return 1;
}

//2. Methode für UITableView
//Wie soll jede Zelle aussehen
- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    
    //Deklaration einer lokalen Variable vom Typ UITableViewCell
    UITableViewCell *cell;
    
    //Erzeugen einer Instanz und Zuweisung der Objektvariablen
    cell = [UITableViewCell alloc];
    
    //es ist eine einfache Zelle, in der ein normaler Text angezeigt werden soll
    cell = [cell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    
    //Der reservierte Speicher soll am Ende wieder freigegeben werden
    cell = [cell autorelease];
    
    
    //Jede Zelle ein eigener Text
    switch (indexPath.row) {
        case 1:
            cell.textLabel.text = [NSString stringWithFormat:@"Erste Zelle"];
            break;
        case 2:
            cell.textLabel.text = [NSString stringWithFormat:@"Zweite Zelle"];
            break;
        case 3:
            cell.textLabel.text = [NSString stringWithFormat:@"Dritte Zelle"];
            break;
        case 4:
            cell.textLabel.text = [NSString stringWithFormat:@"Vierte Zelle"];
            break;
        case 5:
            cell.textLabel.text = [NSString stringWithFormat:@"Fünfte Zelle"];
            break;
            
        default:
            break;
    }
    
    //Anzeige
    return cell;
    
}
Was mache ich falsch :confused:

Danke
Andreas
 

oneOeight

Aktives Mitglied
Mitglied seit
23.11.2004
Beiträge
55.869
row beginnt normal bei 0 und nicht 1 ...
du musst deinen index also um 1 verschieben...
 

cropfaktor

Aktives Mitglied
Thread Starter
Mitglied seit
18.01.2008
Beiträge
1.148
Hatte ich auch dran gedacht, die Prüfung auf "0" (case 0) ergibt kein TRUE!
 

oneOeight

Aktives Mitglied
Mitglied seit
23.11.2004
Beiträge
55.869
prüfst du denn auch auf -1? müsste halt keine zeile ausgewählt sein...
 

cropfaktor

Aktives Mitglied
Thread Starter
Mitglied seit
18.01.2008
Beiträge
1.148
Ich muss nicht auf -1 prüfen, wenn ich 5 Zeilen definiert habe.
Dann geht es halt nicht und ich definiere immer eine Zeile mehr als ich brauche.

Logisch ist dass wahrlich nicht.
In VBA beginnt der Index stets auch bei 0 und da kann ich problemlos die Columns etc. mit einem Vergleich abfragen.
Wenn es unter C-Murks nicht geht, ist es mir auch Recht.

Selten so einen Murks erlebt.

Danke trotzdem
Andreas
 

little_pixel

Aktives Mitglied
Mitglied seit
06.06.2006
Beiträge
4.629
Hallo,

Code:
    //Deklaration einer lokalen Variable vom Typ UITableViewCell
    UITableViewCell *cell;
    
    //Erzeugen einer Instanz und Zuweisung der Objektvariablen
    cell = [UITableViewCell alloc];
    
    //es ist eine einfache Zelle, in der ein normaler Text angezeigt werden soll
    cell = [cell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    
    //Der reservierte Speicher soll am Ende wieder freigegeben werden
    cell = [cell autorelease];
Das wendest Du falsch an.
Mache so etwas:

Code:
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:PETableViewCellPreferencesReuseIdentifier];
    
    if(!cell)
    {
    
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:PETableViewCellPreferencesReuseIdentifier] autorelease];
    
    }
- hallo Tabelle, gib mir ein Cell Objekt mit der ID XYZ, wenn Du das Ding schon mal angelegt hast
- Prüfung, ja es gibt schon eine Cell, also nutze sie
- Prüfung, nö das Ding gibt es nicht also erzeuge eins

Du solltest -alloc -init auch immer zusammen verwenden, nicht getrennt.

Viele Grüße
 

cropfaktor

Aktives Mitglied
Thread Starter
Mitglied seit
18.01.2008
Beiträge
1.148
Danke Dir. Führt zwar bei mir zu Fehlermeldungen, werde ich aber mal aufzudröseln versuchen.

Und wieder ein Buch für die Tonne. Ich habe nur ein Buchbeispiel erweitert. Das originale Buchbeispiel gab auch stets eine Zeile zu wenig aus.

Danke
Andreas
 

cropfaktor

Aktives Mitglied
Thread Starter
Mitglied seit
18.01.2008
Beiträge
1.148
@oneOeight
Klar mache ich den Murks. Gehe ja momentan nur Buchbeispiele durch und versuche zu verstehen.
Trotzdem kapiere ich nicht, wie man in zig Büchern bei den einfachsten Dingen kapitale Fehler einbaut.

Es bleibt Murks. Bis ich alleine die "Animated View"-Nummer hinbekommen habe, ist seit SDK4 anders, verging auch so manche Stunde.

Andreas
 

oneOeight

Aktives Mitglied
Mitglied seit
23.11.2004
Beiträge
55.869
API changes sind aber auch kein murks, sondern sogar dokumentiert.
da muss man nur in die API gucken.

wenn du natürlich mit einem buch über 3.x versuchst 4 zu programmieren, wo ist da wohl der fehler? ;)
du kannst doch auch Xcode mit dem 3.x SDK laden und nehmen...
 

cropfaktor

Aktives Mitglied
Thread Starter
Mitglied seit
18.01.2008
Beiträge
1.148
Ja könnte ich, will ich aber nicht mehr, nachdem es gelegentlich mit dem 3.2er zu Problemen kam.

Habe mir:
"wenn ich z.b. mal http://developer.apple.com/library/i...Reference.html
betrachte, warum greifst du da mit .row drauf zu?"

angesehen und höre jetzt erst einmal an dieser Stelle auf.
Keine Ahnung, was mir da was sagen soll. Wenn ich das kapiere, brauche ich auch die Seite nicht mehr.

VBA war ein Klacks dagegen und es geht halt nicht und gut ist.
Der eine will "row" in seinen Beispielen, Du als Profi stellst das in Frage, höchstwahrscheinlich zu Recht und ich frage mich, wo dass alles hinführen soll.
Lernst du es, ist es falsch, und spätestens in ein paar Monaten gibt es ein neues SDK und das Gelernte wandert in die Tonne.

Danke für die Geduld und die Tipps, aber ab hier hört es auf für mich.
Andreas
 

little_pixel

Aktives Mitglied
Mitglied seit
06.06.2006
Beiträge
4.629
Ich denke, dass Du das alles zu extrem siehst.
Cocoa/Objective-C geht halt nicht in drei Minuten mal locker von der Hand.

Viele Grüße
 

cropfaktor

Aktives Mitglied
Thread Starter
Mitglied seit
18.01.2008
Beiträge
1.148
Nö, sehe ich nicht und bin täglich seit zwei Monaten jeweils 6 - 8 Stunden dran.
Wenn gelieferte Beispiele zu Fehlermeldungen führen, nahezu jedes Buch hinsichtlich der Codes nicht stimmt, dann frage ich mich, wo etwas nicht stimmt.

Wenn ich mir da die Literatur zu Access und VBA so ansehe, dann habe ich einen guten Vergleich hinsichtlich Qualität und Didaktik.

Und ich erwarte gar nicht, dass es locker von der Hand geht. Nur es geht oftmals nicht weiter, weil nichts stimmt.

Egal unsere OSX Programme laufen soweit und dann geht es halt irgendwann auf die iPads oder auch nicht.

Suche mir jetzt im Netz ein funktionierendes Beispiel und werfe den Buchmüll in die Tonne.

Viele Grüße
Andreas
 

oneOeight

Aktives Mitglied
Mitglied seit
23.11.2004
Beiträge
55.869
Keine Ahnung, was mir da was sagen soll. Wenn ich das kapiere, brauche ich auch die Seite nicht mehr.
Ja nun, das ist ein Objekt und das hat seine Get-Methoden.
Wenn man jetzt sauber Objekt-Orientiert arbeitet, greift man nur über diese Methoden auf das Objekt zu.
Die Class Reference listet da jetzt keine row Methode, kann aber natürlich sein, dass diese von einem anderen Objekt vererbt wird.
 

cropfaktor

Aktives Mitglied
Thread Starter
Mitglied seit
18.01.2008
Beiträge
1.148
so, habe den Vorschlag von little_pixl mal aufgegriffen und es bleiben vier Zeilen:
Code:
//1. Methode für UITableView
//Anzahl der Zellen: hier 5.
- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section {
    
    //Rückgabewert: 5 Zellen
    return 5; //da die Zellenzählung bei 0 beginnt
}

//2. Methode für UITableView
//Wie soll jede Zelle aussehen
- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *keineAhnung = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:keineAhnung];
    
    if(!cell)
    {
        
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:keineAhnung] autorelease];
        
    }
      
    //Anzeige
    cell.textLabel.text = @"Hallo Zeile";
    return cell;
    
}
:confused:
 

cropfaktor

Aktives Mitglied
Thread Starter
Mitglied seit
18.01.2008
Beiträge
1.148
:hamma::hamma::hamma:

Es war doch ganz gut eine Pause einzulegen. Eben reichlich Probleme mit einer defekten Access-Datenbank gehabt und die Lösung bei Access sieht halt so aus: Entkerne die defekte DB, erstelle eine neue und füge die Teile ein.

Xcode neues Projekt erstellt:
Code:
// Anzahl der Zellen
- (NSInteger)tableView:(UITableView *)tableView 
 numberOfRowsInSection:(NSInteger)section {
    return 5;
}



// Alles nur Ansichtssache
- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] 
                 initWithStyle:UITableViewCellStyleDefault 
                 reuseIdentifier:CellIdentifier] autorelease];
    }
    
    //Jede Zelle ein eigener Text
    switch (indexPath.row) {
        case 0:
            cell.textLabel.text = [NSString stringWithFormat:@"Erste Zelle"];
            break;
        case 1:
            cell.textLabel.text = [NSString stringWithFormat:@"Zweite Zelle"];
            break;
        case 2:
            cell.textLabel.text = [NSString stringWithFormat:@"Dritte Zelle"];
            break;
        case 3:
            cell.textLabel.text = [NSString stringWithFormat:@"Vierte Zelle"];
            break;
        case 4:
            cell.textLabel.text = [NSString stringWithFormat:@"Fünfte Zelle"];
            break;
            
        default:
            break;
    }
    
    //Anzeige
    return cell;
}
Im "alten" Projekt läuft es nicht und im neuen "läuft" es schon.

So jetzt den Urcode mal eingesetzt, der wirklich nicht besonders geschickt programmiert war: läuft tadellos. Natürlich beginnend mit "case 0".

Merke: Funktioniert etwas nicht, wenn es funktionieren sollte, neues Projekt. :p

Werde mal Rechte reparieren oder XCode neu aufsetzen.

Es geht voran
Andreas
 

little_pixel

Aktives Mitglied
Mitglied seit
06.06.2006
Beiträge
4.629
Werde mal Rechte reparieren oder XCode neu aufsetzen.
Brauchst Du nicht (es sei denn Du hast Zeit für so Zeugs).

Ich denke, ich weiß Dein Problem:

Klicke im Menü "Clean" und baue das Produkt neu.

Bzw. stelle mal das vermutlich "defekte" Projekt hier rein.
Dann kann man mehr sagen.

Viele Grüße
 

cropfaktor

Aktives Mitglied
Thread Starter
Mitglied seit
18.01.2008
Beiträge
1.148
Ok, werde mal mi Clean arbeiten. Ansonsten stelle ich es gerne ein.
Dachte schon, dass ich komplett daneben liege.

Danke
Andreas
 
Oben