2011-01-08 12 views
2

Ich habe eine TabelleView mit Zellen mit einem UITextField als Unteransicht für jede Zelle. Mein Problem ist, dass wenn ich nach unten scrolle, der Text in der ersten Zelle in der letzten Zelle dupliziert wird. Ich kann nicht für das Leben, wenn ich herausfinden warum. Ich habe versucht, die Zellen von den verschiedenen nibs zu laden und die textFields als ivars zu haben. Die UITextFields scheinen nicht das Problem zu sein, ich denke, es hat etwas damit zu tun, dass TableView die Zellen wieder verwendet.Die erste und letzte UITableViewCell ändert sich beim Scrollen

Die textFields haben alle eine Datenquelle, die den Text innerhalb des textFields verfolgt, und der Text wird jedes Mal zurückgesetzt, wenn die Zelle angezeigt wird.

Irgendwelche Ideen? Ich würde wirklich mehr Antworten für diese Frage schätzen.

UPDATE 2: Das ist der Code, den ich für eine benutzerdefinierte Zelle habe, die JournalCell genannt wird. Ich schätze das Feedback sehr.

Ich habe 8 Abschnitte mit je 1 Reihe. Die ersten 7 haben ein textField, die letzte eine Zelle, die sich wie ein Knopf verhält.

Ich bin für die Schaltfläche Zelle testen, wenn es den Abschnitt (7) entspricht, dann gibt es die Zelle zurück, wenn nicht, es geht weiter zum Rest. Könnte das sein?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

NSLog(@"Section %i, Row %i", indexPath.section, indexPath.row); 


if (indexPath.section == 7) { 

    static NSString *ButtonCellIdentifier = @"ButtonCellIdentifier"; 

    UITableViewCell *buttonCell = [self.tableView dequeueReusableCellWithIdentifier:ButtonCellIdentifier]; 

    if (buttonCell == nil) { 
     buttonCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ButtonCellIdentifier] autorelease]; 
     buttonCell.selectionStyle = UITableViewCellSelectionStyleBlue; 
     buttonCell.accessoryType = UITableViewCellAccessoryNone; 
     buttonCell.textLabel.text = sClearAll; 
     buttonCell.textLabel.textAlignment = UITextAlignmentCenter; 
     buttonCell.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.8]; 
     buttonCell.textLabel.backgroundColor = [UIColor clearColor]; 
    } 

    return buttonCell; 
} 

static NSString *TextCellIdentifier = @"JournalCellIdentifier"; 

JournalCell *cell = (JournalCell *)[self.tableView dequeueReusableCellWithIdentifier:TextCellIdentifier]; 
if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"JournalCell" owner:self options:nil]; 
    cell = customCell; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.accessoryType = UITableViewCellAccessoryNone; 

    cell.textField.autocapitalizationType = UITextAutocapitalizationTypeWords; 
    cell.textField.returnKeyType = UIReturnKeyNext; 
    cell.textField.clearButtonMode = UITextFieldViewModeWhileEditing; 
} 

switch (indexPath.section) { 
    case 0: 
     switch (indexPath.row) { 
      case 0: 
       cell.textField.autocapitalizationType = UITextAutocapitalizationTypeNone; 
       self.authorTextField = cell.textField; 
       self.authorTextField.text = [self.textFieldDictionary objectForKey:@"author"]; 
       NSLog(@"Reading Author:%@", [self.textFieldDictionary objectForKey:@"author"]); 
       break; 
     } 
     break; 

    case 1: 
     switch (indexPath.row) { 
      case 0: 
       self.yearTextField = cell.textField; 
       self.yearTextField.text = [self.textFieldDictionary objectForKey:@"year"]; 
       NSLog(@"Reading Year:%@", [self.textFieldDictionary objectForKey:@"year"]); 
       break;     
     } 
     break; 

    case 2: 
     switch (indexPath.row) { 
      case 0: 
       self.volumeTextField = cell.textField; 
       self.volumeTextField.text = [self.textFieldDictionary objectForKey:@"volume"]; 
       NSLog(@"Reading Volume:%@", [self.textFieldDictionary objectForKey:@"volume"]); 
       break;      
     } 
     break; 

    case 3: 
     switch (indexPath.row) { 
      case 0: 
       self.articleTextField = cell.textField; 
       self.articleTextField.text = [self.textFieldDictionary objectForKey:@"article"]; 
       NSLog(@"Reading Article:%@", [self.textFieldDictionary objectForKey:@"article"]); 
       break;   
     } 
     break; 

    default: 
     break; 
} 

return cell; 

}

+1

bieten einige Beispielcode, damit wir das Problem finden können;) –

+0

Sie haben einige Probleme bei der Wiederverwendung von Zellen richtig. posten Sie Ihre cellForRowAtIndexPath: Methode, damit wir helfen können, es zu beheben – Vladimir

+1

Ich aktualisierte den Beispielcode, um zu reflektieren, was ich für eine benutzerdefinierte Zelle verwende. –

Antwort

4

Wie Sie die Frage erraten, ist am meisten wahrscheinlich aus der konventionellen Wiederverwendung von Zellen in einem UITableView. Erstellen Sie ein NSMutableDictionary als eine Eigenschaft Ihrer Klasse. Wenn ein UITextField fertig bearbeitet wird, legen Sie den Wert für einen Schlüssel in Ihrem Wörterbuch fest.

Laden Sie dann in Ihrer cellForRowAtIndexPath-Methode den Wert des entsprechenden Schlüssels in das Wörterbuch.

Es wäre am idealsten, jeden Schlüssel in Ihrem Wörterbuch mit dem Format [indexPath section], [indexPath row] zu benennen, da dies bei der Einstellung und dem Abrufen von Werten hilfreich ist.

Hoffe, das hilft.

0

Versuchen Sie dieses Recht Einsetzen nach der Zelle allocing und vor jeder Zeichnung/Kennzeichnung tun/etc.

2

Die Antwort von Canada Dev wird wahrscheinlich Ihr Problem lösen, aber es ist nur eine Zwischenlösung und keine langfristige Reparatur.

Sie sollten es vermeiden, in der Methode cellForRowAtIndexPath: subviews hinzuzufügen.

Sie sollten stattdessen ein benutzerdefiniertes UITableViewCell (normalerweise durch Unterklassen von UITableViewCell) erstellen und dieses verwenden - andernfalls fügen Sie Subviews aus Zellen hinzu oder entfernen sie, wenn sie aus der Warteschlange entfernt werden.

Wenn Sie nicht sicher sind, was die Auslagerung von Zellen eigentlich bedeutet, sollten Sie wahrscheinlich die TableView-Dokumentation von Apple lesen. Verwenden Sie im Grunde eine UITableViewCell-Unterklasse, und Sie sind in einer viel besseren Position, als zu versuchen, alle Ihre Ansichten in Ihrer cellForRow-Methode hinzuzufügen.

+0

Ich verwendete eine benutzerdefinierte Zelle mit einer textField -Eigenschaft. Es machte das Gleiche. Im Grunde will ich nur ein UITextField in jeder Zelle, auf die ich über UITextFieldDelegate zugreifen kann. Wenn jemand einen Überblick über einen Beispielcode veröffentlichen kann, würde ich das sehr zu schätzen wissen. –

2

Müssen Sie wirklich jede Zelle und textField zu Ihrem viewController speichern und dann die Zelle daraus generieren, indem Sie Teile aus einer anderen Zelle einfügen?

vielleicht können Sie die gesamte Zelle in einer Eigenschaft speichern (zB self.authorCell) und dann einfach diese Zelle angezeigt werden:

if (indexPath.section == 0) { 
    return self.authorCell; // or cell = self.authorCell 
} 

und Sie können immer noch die textField zugreifen, indem Sie die Zelle Eigenschaft zuzugreifen:

self.authorCell.myTextField 

// EDIT: das Apple documentation für „die Technik für statische Zeilen Inhalt“ sieht

+0

Das könnte funktionieren. Ich werde es später versuchen. Ich habe versucht, die Zelle als diejenige festzulegen, die ich zurückgeben wollte. Ich sehe jetzt meinen Fehler. –

Verwandte Themen