• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

TableView: Erstes und Letztes Object verändern sich

GreenApple

Reinette de Champagne
Registriert
20.05.07
Beiträge
412
Hallo,
ich habe in meiner iPhone App ein TableView, der durch einen NSMutableArray gefüllt wird. Wenn ich jetzt, aber mehr als acht Objekte habe, verändern sich das erste und letzte, also irgendwie liegen die TextLabel übereinander. Ich habe mich durch etliche Seiten durchgewühlt und nur etwas von einer Möglichkeit mir removeObject gelesen, aber habe keine Ahnung wie ich sie einsetzen muss.
Bin für jede Hilfe echt dankbar!
 

philo

Roter Stettiner
Registriert
13.10.04
Beiträge
973
Code ist in solchen Fällen immer gut!
 

GreenApple

Reinette de Champagne
Registriert
20.05.07
Beiträge
412
Ja nur welchen, das Projekt ist nämlich eigentlich, schon fertig und ich bin jetzt nur noch am Füllen, und ich würde auch ungern mein ganzes Projekt preisgeben.

Edit, ich probier es mal hier mit:
self.rezepte = [NSMutableArray arrayWithObjects:rezept1,rezept2,rezept3,rezept4,rezept5,rezept6,rezept7,rezept8,rezept9,nil];

Und die Klasse sieht so aus:
Rezept *rezept1 = [[Rezept alloc] initWithName:name description:description info:info image:image imageSmall:imageSmall tweet:tweet];
 

philo

Roter Stettiner
Registriert
13.10.04
Beiträge
973
na den teil, wo der TableView gefüllt wird und deren Eigenschaften (über die Methoden) definiert werden.
 

GreenApple

Reinette de Champagne
Registriert
20.05.07
Beiträge
412
Meinst du diese Methode: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath?
 

philo

Roter Stettiner
Registriert
13.10.04
Beiträge
973
zB oder die:

Code:
UITableViewDelegate Methods
 

GreenApple

Reinette de Champagne
Registriert
20.05.07
Beiträge
412
Diese Teil, oder?


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
CheapEatAppDelegate *appDelegate = (CheapEatAppDelegate *)[[UIApplication sharedApplication] delegate];
return [appDelegate.rezepte count];
}


// Customize the appearance of table view cells.
- (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];
}

CheapEatAppDelegate *appDelegate = (CheapEatAppDelegate *)[[UIApplication sharedApplication] delegate];
Rezept *r = (Rezept *)[appDelegate.rezepte objectAtIndex:indexPath.row];

cell.imageView.image = [UIImage imageNamed:[r imageSmall]];
cell.selectionStyle = UITableViewCellSelectionStyleGray;


UILabel *mainLabel = [[UILabel alloc] initWithFrame:CGRectMake(62, 13, 220, 19)];
mainLabel.text = r.name;
mainLabel.font = [UIFont fontWithName:mad:"Helvetica Neue" size:19.0];
mainLabel.textColor = [UIColor colorWithRed:255.0/255.0 green:216.0/255.0 blue:0.0/255.0 alpha:1.0/1.0];
mainLabel.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
mainLabel.backgroundColor = [UIColor clearColor];

UILabel *detailLabel = [[UILabel alloc] initWithFrame:CGRectMake(59, 35, 230, 14)];
detailLabel.textAlignment = UITextAlignmentLeft;
detailLabel.font = [UIFont fontWithName:mad:"Helvetica Neue" size:11.0];
detailLabel.backgroundColor = [UIColor clearColor];
detailLabel.textColor = [UIColor lightGrayColor];
detailLabel.text = [r info];
detailLabel.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];

[cell addSubview:detailLabel];
[cell addSubview:mainLabel];

return cell;
}

- (UITableViewCellAccessoryType)tableView:(UITableView *)tv accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath {
return UITableViewCellAccessoryDisclosureIndicator;
}



// Override to support row selection in the table view.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
CheapEatAppDelegate *appDelegate = (CheapEatAppDelegate *)[[UIApplication sharedApplication] delegate];
Rezept *rezept = (Rezept *)[appDelegate.rezepte objectAtIndex:indexPath.row];

if(self.rezeptView == nil) {
RezeptViewController *viewController = [[RezeptViewController alloc] initWithNibName:mad:"RezeptViewController" bundle:[NSBundle mainBundle]];
self.rezeptView = viewController;
[viewController release];
}

if(self.tweetView == nil) {
TweetViewController *viewController = [[TweetViewController alloc] initWithNibName:mad:"TweetViewController" bundle:[NSBundle mainBundle]];
self.tweetView = viewController;
[viewController release];
}

[self.navigationController pushViewController:self.rezeptView animated:YES];
[self.rezeptView.titleLabel setText:[rezept name]];
[self.rezeptView.rezeptDescription setText:[rezept description]];
[self.rezeptView.rezeptInfo setText:[rezept info]];
[self.rezeptView.rezeptImage setImage:[UIImage imageNamed:[rezept image]]];
[self.rezeptView.rezeptLine setImage:[UIImage imageNamed:mad:"line.png"]];
}
 

philo

Roter Stettiner
Registriert
13.10.04
Beiträge
973
ändere male folgende Zeile:
Code:
Rezept *r = (Rezept *)[appDelegate.rezepte objectAtIndex:indexPath.row];
in
Code:
Rezept *r = (Rezept *)[appDelegate.rezepte objectAtIndex:[indexPath indexAtPosition:1]];

sag mal ob es gklappt hat, ich muss jetzt ins bett.Danke
 

philo

Roter Stettiner
Registriert
13.10.04
Beiträge
973
Screenshot wäre auch nicht schlecht. Mein Beitrag davor war glaube ich nicht wirklich hilfreich. Ich habe noch nie Zellen, so wie du gestyled, glaube aber, dass da was mit den Frames schief geht.
 

philo

Roter Stettiner
Registriert
13.10.04
Beiträge
973
Nur mal so nebenbei: Habe mal deine Code benutzt und Cells erstellt. Das Detail Label sitzt bei mir unschön auf der Linie und das Gelb ist auch nicht besonders schön...

EDIT: ansonsten geht es aber. keine Probleme mit mehr als 8 Cells. Schalte mal die Bilder aus und gucke, ob es vielleicht an denen liegt. Ich habe sonst kein Idee.

EDIT 2: jetzt sehe ich das Problem auch...sehr komisch. muss wohl nen Bug sein. Wo hast du denn was mit removeObject gelesen?
 
Zuletzt bearbeitet:

philo

Roter Stettiner
Registriert
13.10.04
Beiträge
973
Das ist zwar unsauber, aber wenn du jedes mal eine neue Cell erszeugst, dann treten zumindest bei mir die Probleme nicht mehr auf. Code siehe unten..hättest du aber wohl auch selbst hinbekommen ;)

Code:
    UITableViewCell *cell; //= [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    //if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
		cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    //}
 

GreenApple

Reinette de Champagne
Registriert
20.05.07
Beiträge
412
Hey,
ok danke für den Tipp ich werde ihn nachher mal ausprobieren. Bei dir liegt das DetailLabel wahrscheinlich auf der Linie, weil ich noch die rowHeight geändert habe auf 60.0.
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Wenn ich jetzt, aber mehr als acht Objekte habe, verändern sich das erste und letzte, also irgendwie liegen die TextLabel übereinander.
Das liegt daran, dass Du immer ein neues mainLabel und detailLabel der Zelle hinzufügst, egal ob die Zelle wieder verwendet wird oder nicht. Dadurch stapeln sich dann natürlich die Labels bei wieder verwendeten Zellen. Für Deinen Anwendungsfall gibt es im Table View Programming Guide for iPhone OS ein Beispiel, wie man das richtig macht.

Übrigens erzeugst Du mit Deinen mainLabel und detailLabel Speicherlecks, weil Du sie nicht released.

MacApple
 

philo

Roter Stettiner
Registriert
13.10.04
Beiträge
973
MacApple hat Recht!

Du solltest das Main und Detaillabel nur ein Mal erzeugen:

Code:
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
..
UILabel *mainLabel = [[UILabel alloc] .....
...
mainLabel.tag = 1;
[cell addSubview:mainLabel];
}

UILabel* mainLabel = (UILabel*)[cell viewWithTag:1];
mainLabel.text = ....
...

..

gerade selbt getestet und es geht!
Gruss
 

GreenApple

Reinette de Champagne
Registriert
20.05.07
Beiträge
412
OK danke, die einzelnen Zellen überschrieben sich jetzt zwar nicht mehr, aber ab der 9. Reihe wiederholen sich die Objekte, also anstatt dem 9. wird das 1. gezeigt, aber wenn ich darauf klicke komme ich zum richtigen View.

Aber schon Mal vielen Danke :)
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Dann hast du bestimmt einen Logikfehler in der Delegate...
 

GreenApple

Reinette de Champagne
Registriert
20.05.07
Beiträge
412
-
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *MyIdentifier = @"MyIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

CheapEatAppDelegate *appDelegate = (CheapEatAppDelegate *)[[UIApplication sharedApplication] delegate];
Rezept *r = (Rezept *)[appDelegate.rezepte objectAtIndex:indexPath.row];

if (cell == nil) {

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];

cell.imageView.image = [UIImage imageNamed:[r imageSmall]];
cell.selectionStyle = UITableViewCellSelectionStyleGray;

UILabel *mainLabel;
UILabel *detailLabel;

mainLabel = [[UILabel alloc] initWithFrame:CGRectMake(62, 13, 220, 19)];
mainLabel.text = r.name;
mainLabel.font = [UIFont fontWithName:mad:"Helvetica Neue" size:19.0];
mainLabel.textColor = [UIColor colorWithRed:255.0/255.0 green:216.0/255.0 blue:0.0/255.0 alpha:1.0/1.0];
mainLabel.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
mainLabel.backgroundColor = [UIColor clearColor];
mainLabel.tag = 1;

detailLabel = [[UILabel alloc] initWithFrame:CGRectMake(59, 35, 230, 14)];
detailLabel.textAlignment = UITextAlignmentLeft;
detailLabel.font = [UIFont fontWithName:mad:"Helvetica Neue" size:11.0];
detailLabel.backgroundColor = [UIColor clearColor];
detailLabel.textColor = [UIColor lightGrayColor];
detailLabel.text = [r info];
detailLabel.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
detailLabel.tag = 2;

[cell.contentView addSubview:detailLabel];
[cell.contentView addSubview:mainLabel];

}

return cell;

}

So sieht's jetzt bei mir im Moment aus.
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
So sieht's jetzt bei mir im Moment aus.
Du hast das von mir oben verlinkte Dokument nicht gelesen, oder? Du setzt jetzt nur den Inhalt der Zelle, wenn eine neue Zelle erzeugt wird. Bei einer wieder verwendeten Zelle gibst Du sie unverändert zurück. Logisch, dass sich dann alles wiederholt. Die Speicherlecks produzierst Du auch immer noch.

MacApple