2013-01-31 12 views
6

Kann eine Zellenansicht für die ausgewählte Zelle ersetzt werden? Ich habe meinen Controller als Datenquelle registriert und delegiere. Anfragen für Zellenansichten, Zeilennummern, Auswahlstatus usw. kommen alle gut herein. Bei den Callbacks für die Zellenauswahl versuche ich, dass die Tabellenansicht die Zelle mit einer neuen Ansicht neu lädt (nicht die eigentlichen Daten!). Grundsätzlich möchte ich, dass die Zellenansicht erweitert wird und mehr der zugrunde liegenden Daten angezeigt wird, wenn sie ausgewählt ist. Das Problem ist, dass ich keine Ahnung habe, wie ich die Tabellenansicht veranlassen kann, meinen Controller nach einer neuen Ansicht zu fragen. Ich kann sehen, dass die Ansicht die Zellenhöhe anfordert, aber nicht mehr.UITableView, Zellenansicht bei Auswahl ersetzen

Aufruf reloadData auf der Ansicht funktioniert, aber es ist ineffizient und kommt mit einer Reihe von eigenen Problemen (Animationsmöglichkeiten, Aufrechterhaltung der Auswahl Zustand, etc).

Antwort

14

Hier ist der Ansatz beschäftigen muss ich nehmen würde mach das.

@property (nonatomic, strong) NSIndexPath *selectedIndexPath; 

Setzen Sie eine Eigenschaft des Typs NSIndexPath auf Ihren Controller, um zu speichern, welcher Indexpfad ausgewählt wurde.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    self.selectedIndexPath = indexPath; 
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation: UITableViewRowAnimationNone]; 
} 

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

    if ([indexPath compare:self.selectedIndexPath] == NSOrderedSame) { 
     // Create your custom cell here and return it. 
    } 
    else { 
     // Should create a normal cell and return it. 
    } 
} 

Genau. Beachten Sie auch, dass Sie wahrscheinlich die Auswahl aufheben möchten. Hier ist der vollständige Code in Swift. Verwenden Sie selectedIndexPath in cellForRowAtIndexPath entsprechend.

// Auswahl Tableviewcontroller Import UIKit

Klasse SelectingTableViewController: UITableViewController
{ intern var selectedIndexPath: NSIndexPath? = Null

override func viewDidLoad() 
    { 
    super.viewDidLoad() 
    tableView.estimatedRowHeight = 68.0 
    tableView.rowHeight = UITableViewAutomaticDimension 

    self.clearsSelectionOnViewWillAppear = false; 
    } 

override func tableView 
    (tableView:UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath) 
     { 
     print("did select....") 

     // in fact, was this very row selected, 
     // and the user is clicking to deselect it... 
     // if you don't want "click a selected row to deselect" 
     // then on't include this clause. 
     if selectedIndexPath == indexPath 
      { 
      print("(user clicked on selected to deselect)") 
      selectedIndexPath = nil 
      tableView.reloadRowsAtIndexPaths(
       [indexPath], 
       withRowAnimation:UITableViewRowAnimation.None) 

      tableView.deselectRowAtIndexPath(indexPath, animated:false) 
      return 
      } 

     // in fact, was some other row selected?? 
     // user is changing to this row? if so, also deselect that row 
     if selectedIndexPath != nil 
      { 
      let pleaseRedrawMe = selectedIndexPath! 
      // (note that it will be drawn un-selected 
      // since we're chaging the 'selectedIndexPath' global) 
      selectedIndexPath = indexPath 
      tableView.reloadRowsAtIndexPaths(
       [pleaseRedrawMe, indexPath], 
       withRowAnimation:UITableViewRowAnimation.None) 
      return; 
      } 

     // no previous selection. 
     // simply select that new one the user just touched. 
     // note that you can not use Apple's willDeselectRowAtIndexPath 
     // functions ... because they are freaky 
     selectedIndexPath = indexPath 
     tableView.reloadRowsAtIndexPaths(
      [indexPath], 
      withRowAnimation:UITableViewRowAnimation.None) 

     } 

} 
2

Haben Sie versucht:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 

Dann sind Sie nur Ihre aktualisierte Zelle zum Nachladen angeben. Sie können auch Ihre Tableview sagen zu Auswahlstatus auf reload erinnern oder vergessen mit:

tableViewController.clearsSelectionOnViewWillAppear = NO; 

Dann werden Sie sich auch mit der Ansicht innerhalb

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
Verwandte Themen