2016-03-24 10 views
0

Ich habe eine UITableView, die als ein Formular fungieren. Es hat ungefähr 20 Zellen (mit statischem Inhalt aber dynamischen Zellen). Also hatte ich ein Array mit den Feldern und laden Sie es in der Tabellenansicht. Irgendwann wird der Benutzer drücken Sie die Schaltfläche "Senden" und ich brauche alle Textfelder Werte, die in den Tabellenansicht Zellen eingegeben. Also habe ich ein für jedes Textfeld in jeder Zelle erstellt und ich es in der cellForRowAtIndexPath: zuweisen.UITableview - Einstellung einer Eigenschaft für Zelle ist mit wiederverwendbaren Zellen durcheinander

if (indexPath.row==RPCVehicleType || indexPath.row==RPCExcess || indexPath.row==RPCDrivers){ 

    static NSString *tableIdentifier = @"TextFieldArrowCell"; 

    TextFieldArrowCell *cell = (TextFieldArrowCell*)[tableView dequeueReusableCellWithIdentifier:tableIdentifier]; 

    if (cell == nil) { 
     cell = [[TextFieldArrowCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:tableIdentifier]; 
    } 

    switch (indexPath.row) { 
     case RPCVehicleType: 
      self.typeOfVehicleTextfield = cell.valueField; 
      break; 
     case RPCExcess: 
      self.excessTextfield = cell.valueField; 
      break; 
     case RPCDrivers: 
      self.driversTextfield = cell.valueField; 
      break; 
     default: 
      break; 
    } 

    return cell; 

Das Problem mit diesem Code ist, dass, wenn ich nach unten scrollen werden die Zellen wiederverwendet werden und die Eigenschaften messed sind. Also, wenn ich das erste Mal tun [self.excessTextField setText:@"123"] ist es in Ordnung, aber nach dem Scrollen und erneut ausführen kann ich andere Textfelder des gleichen Typs der Zelle zu diesem Wert ändern. Problemumgehung, um dieses Problem zu beheben?

Update: versucht, diesen Ansatz mit dem gleichen Ergebnis:

-(UITextField*)getTextFieldForRow:(NSInteger)row{ 

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0]; 
TextFieldArrowCell *cell = [self.tableV cellForRowAtIndexPath:indexPath]; 

return cell.valueField; 

}

+0

Vielleicht sollten Sie gemeinsamen Ansatz verwenden und speichern Sie Ihre Daten zu und Array und füllen Sie Ihre Tabellenansicht damit, basierend auf 'indexPath' wie folgt: 'someTextField = backingArray [indexPath.row]' – schmidt9

+0

Das ist kein Problem. Das mache ich. Das Problem ist das Speichern von Daten aus der Tabellenansicht – BlackM

+0

Ich nehme an, Sie erhalten die gleichen Werte, weil Sie auf die gleichen Objekte verweisen. Versuchen Sie 'self.typeOfVehicleTextfield = [cell.valueField mutableCopy]' – schmidt9

Antwort

2

Sie können nur Daten von sichtbaren Zellen abrufen (unsichtbare Zellen existieren nicht oder sie haben ungeeignete Daten).

Es gibt mehrere Möglichkeiten, dies zu tun. Für Sie wäre die beste Lösung Delegieren (UITextFieldDelegate). Sie können Informationen zu Änderungen in UITextField erhalten, sodass Sie Ihr Datenmodell aktualisieren können.

In tableView:cellForRowAtIndexPath: übergeben Sie korrekte (tatsächliche) Daten an Tabellenzelle (dieser Teil des Codes, den Sie bereits haben).

0

I 2 mögliche Ansätze sehen kann, Ihr Problem zu lösen.

Mögliche Lösung 1

Ihre eigene Zelle verwenden, ohne sie wiederverwenden, in diesem Fall werden Sie immer Zugriff auf die im Textfeld gespeicherten Informationen haben.

Hier ist ein Beispielcode in Swift, leicht übersetzbar zu Objective-c

var myCellArray:[TextFieldArrowCell?] = Array.init(count: 3, repeatedValue: nil) 

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { 

     if (myCellsArray[indexPath.row] == nil) { 
      myCellsArray[indexPath.row] = UITableViewCell(style: .Default, reuseIdentifier: "TextFieldArrowCell") as! TextFieldArrowCell 

     //Config the cell 

     } 
     return myCellsArray[indexPath.row] 
    } 

Am Ende in dem Speicher-Knopf einfach Ihre Array konsultiert, und die Daten des Textfeldes lesen.

Mögliche Lösung 2

Wenn die Zelle für die Wiederverwendung vorzubereiten, die Daten speichern.

Sie können diese Funktion zu einem Zellenobjekt hinzufügen. Wenn die Zelle also erneut verwendet werden soll, müssen Sie die Daten überprüfen und woanders speichern.

override func prepareForReuse(){ 
    // save data here an then.... 
    super.prepareForReuse() 
} 
0

Angenommen, Sie haben eine Reihe von Objekten, wo jedes Objekt Feld in Ihrem Tableview zu bilden, entspricht. Wenn Sie eine Zelle aus der Warteschlange entfernen, müssen Sie Ihrer UITableViewCell-Unterklasse ein entsprechendes Objekt zuweisen. Jetzt machen Sie Ihre UITableViewCell eine Empfängerunterklasse für

UITextFieldTextDidChangeNotification

und Änderungen an Ihrem Modell speichern.

I.e. es würde ungefähr so ​​aussehen.

@interface MyObject: NSObject 
@property (strong, nonatomic) NSString *someValue; 
@end 

// Dequeue your cell.. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; 
    // Assign an object to your cell 
    cell.object = arrayOfObjects[indexPath.row]; 
    return cell; 
} 

// Register cell as an observer 

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 

    if (self = [super initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier]) { 
    // Your init code 
    [[NSNotificationCenter defaultCenter] addObserverForName:UITextFieldTextDidChangeNotification 
               object:self.textField 
                 queue:[NSOperationQueue mainQueue] 
                 usingBlock:^(NSNotification * _Nonnull note) { 

                  if ([note.object isEqual:self.textField]) { 
                   self.object.value = self.textField.text; 
                  } 
                 }]; 

    } 
} 
+0

Können Sie bitte erläutern? Ich habe nicht verstanden, wie man diesen Code mit der Tabellenansicht funktioniert – BlackM

+0

Der Code ist für das Objekt oder die Zelle? Es scheint Objekt – BlackM

+0

Nein, dieser Code ist Pseudocode für 3 verschiedene Teile Ihres UITableView. Im ersten Teil wird beschrieben, wie Ihr Modell aussehen soll (das, in dem Ihre Daten gespeichert werden sollen). Der zweite Teil beschreibt, wie Sie Ihr Objekt Ihrer UITableViewCell-Unterklasse namens MyCell zuweisen sollten. Im dritten Teil wird beschrieben, wie Sie Änderungen an Ihrem UITextField mit NSNotificationCenter abfangen und diese Änderungen in Ihrem Modell speichern sollten. Dieser Ansatz speichert alle UITextField-Änderungen in MyObject-Modellen, die am Ende in einem Array in Ihrem ViewController enthalten sind. –

0

jede Zelle eine diffrent identifire wie tableIdentifier = provied [string string: "CelllD% @", indexpath.row]. Hoffe das wird dir helfen.

+0

Das wird nicht funktionieren. Ich muss die Zellen im Storyboard klonen und die verschiedenen Bezeichner einstellen. Daher ist es besser, in diesem Fall statische Zellen zu verwenden – BlackM