2014-01-12 16 views
5

Ich erstelle eine Übung basierte App in iOS. Ich stelle fest, dass ich gerne eine Favoritenliste mit einschließen würde. Wie es derzeit aussieht, habe ich eine Übungsbibliothek, wo Sie eine Schaltfläche antippen und sie zu einer Favoritenliste hinzufügen können, auf die über einen Navigationscontroller zugegriffen wird. Ich bin in der Lage, Titel ordnungsgemäß an einen Shop zu übergeben, die dann in der Favoriten-Tabellenansicht platziert werden. Ich kann den spezifischen exerciseViewController laden, der auf dem Titel der Tabellenansichtzelle basiert und zwischen Durchlauf speichert. Ich habe jedoch ein Problem, wenn ich versuche, Übungen zu löschen. Ich kämpfe seit Stunden.Wie UITableView ordnungsgemäß neu geladen werden?

Dies ist das Szenario:

ich zwei Übungen zu meinen Favoriten hinzugefügt haben: exercise A, die in der ersten Reihe ist, und exercise B die in der zweiten ist. Wenn ich jedoch auf die Favoritenliste zugreife, wähle ich exercise A aus, um deren Details anzuzeigen, beschließe, sie zu ignorieren, und navigiere zurück (zurück) zur Favoritenliste, sie wird nicht korrekt aktualisiert. Während es korrekt die Anzahl der Zeilen lädt (die jetzt 1 ist), zeigt es immer noch exercise A Titel (es sollte exercise B Titel anzeigen). Aber wenn ich den ganzen Weg zur Startseite zurück navigiere und die Favoritenübung auswähle, wird sie korrekt angezeigt - jetzt wird nur noch der Titel exercise B angezeigt. Ich habe versucht, [[self tableview] reload] in viewWillAppear (dies scheint die häufigste Antwort zu sein), Schreiben von Benachrichtigungen, Protokolle usw. und habe immer noch dieses Problem. Die einzige Zeit, in der es richtig zu funktionieren scheint, ist, wenn die Favoritenliste über die Homepage aufgerufen wird und viewDidLoad aufgerufen wird.

Wie kann ich die Tabelle korrekt anzeigen lassen, wenn die Tabelle angezeigt wird und nicht geladen werden muss?

Favoriten Tableview

FavsVC.m 
- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self.tableView reloadData]; 
    NSLog(@"APPEARING"); 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"]; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"]; 
     NSArray *fav = [[NSUserDefaults standardUserDefaults] objectForKey:@"Favorites"]; 
     NSString *name = [fav objectAtIndex:indexPath.row]; 
     cell.textLabel.text = name; 
    } 
    return cell; 
} 

//This the method is in my store, and gets called when I click on an exercise to add or delete. 
- (id)addToFavorites:(NSString *)title 
{ 
    favoriteTitles = [[NSUserDefaults standardUserDefaults] objectForKey:@"Favorites"]; 
    if ([favoriteTitles containsObject:title]) { 
     NSLog(@"exercise removed"); 
     //[favoriteTitles removeObject:title]; 

     NSMutableArray *newArray = [NSMutableArray arrayWithArray:favoriteTitles]; 
     [newArray removeObject:title]; 
     [[NSUserDefaults standardUserDefaults] setObject:newArray forKey:@"Favorites"]; //newArray 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } else { 
     NSLog(@"exercise added"); 
     //[favoriteTitles addObject:title]; 

     NSMutableArray *newArray = [NSMutableArray arrayWithArray:favoriteTitles]; 
     [newArray addObject:title]; 
     [[NSUserDefaults standardUserDefaults] setObject:newArray forKey:@"Favorites"]; //newArray 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 
    return self; 
} 

Antwort

5

Sie schaffen keine neuen Zellen jedes Mal, das ist, warum Sie „die falschen Zellen“ holen am Ende. Sie verwenden wiederverwendbare Zellen, die nicht jedesmal in cellForRowAtIndexPath erstellt, sondern modifiziert werden. Der Grund dafür ist, dass die UITableView nur die Zellen speichert, die sich tatsächlich zu Speicherzwecken auf dem Bildschirm befinden. Benutze das stattdessen.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"]; 

     if (!cell) { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"]; 
      // Only create a new cell if it's nil 
     } 
     // Now you have a reference to the cell. Set its variables. 
     NSArray *fav = [[NSUserDefaults standardUserDefaults] objectForKey:@"Favorites"]; 
     NSString *name = [fav objectAtIndex:indexPath.row]; 
     cell.textLabel.text = name; 
     return cell; 
    } 
+0

Danke für die Hilfe haben, das ist mein Problem gelöst. – BradRS

+0

Vergnügen, aber fühlen Sie sich frei, es als die richtige Frage zu haken. – Martol1ni

0

Sie möchten benachrichtigt werden, dass Ihr View Controller präsentiert wird? Verwenden Sie einfach UINavigationControllerDelegate.

// Somewhere in a table view controller 
self.navigationController.delegate = self; 
// ------------------------------------------------------- 
- (void)navigationController:(UINavigationController *)navigationController  
     willShowViewController:(UIViewController *)viewController 
        animated:(BOOL)animated 
{ 
    // Your code to update the table view 
} 

Vergessen Sie nicht, Ihren Tisch View-Controller auf UINavigationControllerDelegate anzupassen.

Die andere Möglichkeit besteht darin, das erneute Laden der Eingabeaufforderung der Tabelle auszulösen, nachdem einige Änderungen an einem verwandten Inhalt vorgenommen wurden, in Ihrem Fall im Favoritenansicht-Controller.

Aber ich persönlich mag die erste Annäherung mehr, da Sie hier eine lose Kopplung haben.

0

Ich denke, das Problem ist die, wenn nicht-Anweisung ist die Zelle bereits verursacht Sie aktualisieren Sie nicht Ihre brauchen, wenn nicht-Anweisung Sie müssen nur aus den Daten der Tabelle laden

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

     UITableViewCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"]; 

//I would probably make a property for array... not create it here 
NSArray *fav = [[NSUserDefaults standardUserDefaults] objectForKey:@"Favorites"]; 
    if(fav){ 
     NSString *name = [fav objectAtIndex:indexPath.row]; 
    cell.textLabel.text = name; 
    } 
    return cell; 
} 

auch, wie sind Sie Deine Lieblingsansicht verwerfen?

wird Ihre viewWillAppear: Methode aufgerufen?

// die Spitze auch überprüfen sollte Standard JA sein, aber Ihre wach überprüfen von nib, wenn Sie eine

- (void)awakeFromNib { 

    [super awakeFromNib]; 

     self.clearsSelectionOnViewWillAppear = YES;  

} 
Verwandte Themen