2012-04-05 13 views
1

Ich habe benutzerdefinierte UITableViewCell s sowie Kopf- und Fußzeilen. Jeder von ihnen hat UITextField s in Spalten, die in einer Reihe stehen. Die Positionierung dieser Säulen wird prozentual nach der Breite der UITableView bestimmt. (d. h., so nutzt es den breiteren Bildschirm aus, wenn es in der Landschaft geöffnet wird).Neu zeichnen UITableViewCells auf Rotation

Das Problem, das ich habe, ist, wenn ich die Ansicht drehen, sobald der View-Controller geladen hat. Die UITableViewCell s verwenden immer noch die alte Positionierung.

Nachdem ich SO gesucht habe, habe ich jetzt die didRotateFromInterfaceOrientation: implementiert und Daten in dieser Methode neu geladen.

Dies hat jetzt die Kopfzeilen und Fußzeilen sortiert. Die UITableViewCell s sind jedoch immer noch in ihrem vorgedrehten Format. Gibt es eine Möglichkeit, die Tabelle zu zwingen, den gesamten Inhalt vollständig neu zu zeichnen?

EDIT: Mein tableView:cellForIndexPath: Code:

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

    static NSString *CellIdentifier = @"CustomCell"; 
    UITextField *TextField1, *TextField2, *TextField3, *TextField4, *TextField5; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    float width = (self.tableView.frame.size.width - 68); 

    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

      TextField1 = [[UITextField alloc] initWithFrame:CGRectMake(((width*position1)+10.0), 10.0, (width*width1), 31.0)]; 
      TextField1.tag = 1; 

      TextField2 = [[UITextField alloc] initWithFrame:CGRectMake((width*position2), 10.0, (width*width2), 31.0)]; 
      TextField2.tag = 2; 

      TextField3 = [[UITextField alloc] initWithFrame:CGRectMake((width*position3), 10.0, (width*width3), 31.0)]; 
      TextField3.tag = 3; 

       TextField4 = [[UITextField alloc] initWithFrame:CGRectMake((width*position4), 10.0, (width*width4), 31.0)]; 
      TextField4.tag = 4; 

      TextField5 = [[UITextField alloc] initWithFrame:CGRectMake((width*position5), 10.0, ((width*width5)-40.0-editingWidth), 31.0)]; 
      TextField5.tag = 5; 

      cell.accessoryType = UITableViewCellAccessoryNone; 

      [cell.contentView addSubview:TextField1]; 
      [cell.contentView addSubview:TextField2]; 
      [cell.contentView addSubview:TextField3]; 
      [cell.contentView addSubview:TextField4]; 
      [cell.contentView addSubview:TextField5]; 

      [TextField1 release]; 
      [TextField2 release]; 
      [TextField3 release]; 
      [TextField4 release]; 
      [TextField5 release]; 

     } else { 

      TextField1 = (UITextField *)[cell.contentView viewWithTag:1]; 
      TextField2 = (UITextField *)[cell.contentView viewWithTag:2]; 
      TextField3 = (UITextField *)[cell.contentView viewWithTag:3]; 
      TextField4 = (UITextField *)[cell.contentView viewWithTag:4]; 
      TextField5 = (UITextField *)[cell.contentView viewWithTag:5]; 

     } 

    // Configure the cell... 

    // Clear cell contents 
    TextField1.text = @""; 
    TextField2.text = @""; 
    TextField3.text = @""; 
    TextField4.text = @""; 
    TextField5.text = @""; 

    int sectionCount = 0; 
    sectionCount = [workoutSectionsMutableArray count]; 

    // Repopulate cells 

    NSMutableArray *cellDataArray = [self retrieveCellDataAtIndexPath:indexPath]; 

    TextField1.text = [[cellDataArray objectAtIndex:indexPath.row] 1]; 
    TextField2.text = [[cellDataArray objectAtIndex:indexPath.row] 2]; 
    TextField3.text = [[cellDataArray objectAtIndex:indexPath.row] 3]; 
    TextField4.text = [[cellDataArray objectAtIndex:indexPath.row] 4]; 
    TextField5.text = [[cellDataArray objectAtIndex:indexPath.row] 5]; 

    } 

    return cell; 

} 

Meine didRotateFromInterfaceOrientation: Methode:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation) fromInterfaceOrientation { 

    [self.tableView reloadData]; 
} 
+0

Setzen Sie einen Haltepunkt in Ihrer "Zelle für den Indexpfad", drehen Sie das Gerät und sehen Sie, (1) es wird aufgerufen, und (2) es erzeugt Textfelder der richtigen Breite. – dasblinkenlight

+0

Vielleicht könnten Sie den Code, wo Sie die Neupositionierung der Spalten tun, posten, es scheint, dass dies ein einfaches Problem sein sollte, zu beheben. – Darren

+0

Ich habe den Code wie gewünscht eingefügt. Wie Sie sehen können, habe ich die Zellen mithilfe von Berechnungen eingerichtet, die entweder für Hoch- oder Querformat ausgerichtet sind. Der Befehl [Daten neu laden] reicht jedoch nicht aus, um Zellen neu zu zeichnen, so dass die textFields ihr vorhandenes Layout beibehalten, während die Kopf- und Fußzeilen neu gezeichnet werden. –

Antwort

2

Wenn Sie anrufen reload auf der Tabellenansicht, die Tableview: cellForRowAtIndexPath: Methode wird auf aufgerufen werden Datenquelle. Da Sie die Zellen bereits initialisiert haben, wird der Code in Ihrer if-Anweisung nicht aufgerufen und die Textfelder werden nicht neu positioniert.

Die einfachste Lösung wäre, den Textfeldcode einfach aus der if-Anweisung zu entfernen. Ich bin mir nicht sicher, ob das einen spürbaren Leistungseinbruch verursachen würde oder nicht.

Übrigens, Ihr nameTextField, resistanceTextField usw., die Sie zu Ihrer Zelle hinzufügen, sind nicht initialisiert, aber ich nehme an, dass dies nur eine Verwechslung bei der Übertragung von Ihrem Code zu stackoverflow ist. Ich nehme an, dass es TextField1, TextField2 usw. sein soll, die Sie hinzufügen.

+0

Ja - das ist es. Ich habe die Frame-Definitionen außerhalb der if-Anweisung entfernt, und das hat perfekt funktioniert. Intuitiv dachte ich nicht, dass ich eine Unteransicht hinzufügen könnte, die keine Schlüsseleigenschaften wie Größe und Position hatte. Ja - die textField-Referenzen wurden nicht alle korrekt an SO übertragen. Jetzt aktualisiert Vielen Dank –

Verwandte Themen