iOS Aktualisieren-button im View-Controller Nav: Neuladen alle tableViewCells erstellt von JSON geparst, wenn Sie geklickt werden

Ich habe eine ziemlich wichtige konzeptionelle Frage, die viele Menschen haben gefragt, aber es ist nicht eine leicht verfügbare klare Antwort durch die Suche gefunden werden.

Meine Anwendung ist einfach: Mehrere Reihen von TableViewCells gefüllt mit Daten aus einer geparsten JSON-feed. Wenn eine Zelle angeklickt wird, dass die Zelle die info wird an einen SecondViewController und angezeigt. Die JSON-feed gespeichert sind, ein .plist und in dem Fall, dass das internet nicht verfügbar ist, die TableViewCells sind gefüllt .plist.

Dies ist alles großartig.

Jedoch das Letzte, was ich brauchen, ist ein refresh-button am oberen Rand meiner FirstViewController zu aktualisieren Sie den JSON-feed und alle Zellen in der Tabelle mit den neuen Daten der neuen Variablen. Allerdings habe ich festgestellt, dass ein Problem mit der Umsetzung dieser:

Meine ursprüngliche JSON aufrufen und Variablen zum füllen der Zellen befinden sich in der ViewDidLoad-Methode. Wenn die view geladen wird, werden diese Variablen "set" und nicht mehr aktualisiert. Weiter kann ich die JSON-aufrufen und Variablen in viewWillLoad - aktualisieren Sie die Tabelle jedes mal nach dem Klick auf eine Zelle, und klicken Sie dann auf "zurück", um die firstViewController-dies wird aktualisieren Sie die JSON-Zellen und erfolgreich, aber es hat Auswirkungen auf die Geschwindigkeit und lässt den view-controller "pause", wenn Sie gehen zurück zum MainViewController, das macht Sie meine ursprüngliche JSON und festlegen von Variablen in viewWillLoad eine nicht überlebensfähige option.

Habe ich eine reload-button in ViewDidLoad, die mit eine IBAction-Methode "refresh":

Schaltfläche erstellen Programitically in ViewDidLoad:

//Reload issues button
UIBarButtonItem *button = [[UIBarButtonItem alloc]
                           initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
                           target:self
                           action:@selector(refresh:)];
self.navigationItem.rightBarButtonItem = button;
[button release];

Action-Methode es ist verbunden mit:

- (IBAction)refresh:(id)sender {

    myRawJson = [[NSString alloc] initWithContentsOfURL:[NSURL  
                                  URLWithString:@"http://www.yoursite.com/json.JSON"]  
                                  encoding:NSUTF8StringEncoding 
                                  error:nil];

    SBJsonParser *parser = [[SBJsonParser alloc] init];
    NSDictionary * myParsedJson = [parser objectWithString:myRawJson error:NULL];

//New updated dictionary built from refreshed JSON
    allLetterContents = [myParsedJson objectForKey:@"nodes"];

//Log the new refreshed JSON
    NSLog(@"You clicked refresh. Your new JSON is %@", myRawJson);

    //Maybe use the notification center?? But don't know how to implement.
    //[[NSNotificationCenter defaultCenter] addObserver:self 
                                            selector:@selector(refreshView:) 
                                            name:@"refreshView" object:nil];
    //[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshView" 
                                            object:nil];

    }

    [self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] 
                     withRowAnimation:UITableViewRowAnimationNone];

    [myRawJson release];
}

Im code oben sehen Sie, dass bin ich wieder-der Aufruf des JSON-jedes mal, wenn die Schaltfläche geklickt wird und die Protokollierung einer Nachricht auf die Konsole mit der neuen JSON. Das ist eine Arbeit. Ich habe auch neu gebaut, ein Wörterbuch, das erfolgreich hinzufügen der neuen Inhalte.

Meine Frage ist: Wie kann ich machen das tableViewCells "refresh" mit diesen neuen Daten? Kann ich einfach die Taste re-das laden der gesamten view-controller - so würde es nennen ViewDidLoad wieder? Muss ich das überdenken meiner apps Struktur, oder bewegen Sie meine original-Variablen aus viewDidLoad?

Habe ich gelesen, einige Beiträge über das NSNotificationCenter, aber die Umsetzung dieses immer noch verblüfft mich, wie ich bin ziemlich neu in der iOS-Entwicklung.

Dank~


Update:


Es ist immer noch nicht aktualisiert. Hier ist mein full-refresh button-code mit [self.tableView reloadData]; Aufruf am Ende meiner IBAction.

    - (IBAction)refresh:(id)sender {
        [DSBezelActivityView newActivityViewForView:        
                         self.navigationController.navigationBar.superview     
                         withLabel:@"Loading Feed..." width:160];

        myRawJson = [[NSString alloc] initWithContentsOfURL:[NSURL 
                     URLWithString:@"http://site.com/mobile.JSON"] 
                     encoding:NSUTF8StringEncoding 
                     error:nil];

        SBJsonParser *parser = [[SBJsonParser alloc] init];
        NSDictionary * myParsedJson = [parser objectWithString:myRawJson error:NULL];
        allLetterContents = [myParsedJson objectForKey:@"nodes"];

        BOOL isEmpty = ([myParsedJson count] == 0);

        if (isEmpty) {
            NSString *refreshErrorMessage = [NSString 
stringWithFormat:@"An internet or network connection is required."];
            UIAlertView *alert = [[UIAlertView alloc] 
                                 initWithTitle:@"Alert" 
                                 message: refreshErrorMessage 
                                 delegate:self 
                                 cancelButtonTitle:@"Close" 
                                 otherButtonTitles:nil];
            [alert show];
            [alert release];

            allLetterContents = [NSMutableDictionary 
                                dictionaryWithContentsOfFile:[self saveFilePath]];
            //NSLog(@"allLetterContents from file: %@", allLetterContents);

        } else {

        NSLog(@"Your new allLetterContents is %@",  allLetterContents);

          //Fast enumeration through the allLetterContents NSMutableDictionary
          for (NSMutableDictionary * key in allLetterContents) {
            NSDictionary *node = [key objectForKey:@"node"];
            NSMutableString *contentTitle = [node objectForKey:@"title"];        
            NSMutableString *contentNid = [node objectForKey:@"nid"];
            NSMutableString *contentBody = [node objectForKey:@"body"];
            //Add each Title and Nid to specific arrays
            //[self.contentTitleArray addObject:contentTitle];
            [self.contentTitleArray addObject:[[contentTitle 
                                     stringByReplacingOccurrencesOfString:@"&" 
                                     withString:@"&"] mutableCopy]];
            [self.contentNidArray addObject:contentNid];
            [self.contentBodyArray addObject:contentBody];
          }

        }

        [self.tableView reloadData];

        [DSBezelActivityView removeViewAnimated:YES];
        [myRawJson release];
    }

Ich bin der Konfiguration der Zelle an cellForRowAtIndexPath (Aktualisiert: Verfasst gesamte Methode):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
            cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
        }
    }

    //Configure the cell.
    cell.textLabel.text = [self.contentTitleArray objectAtIndex: [indexPath row]];
    cell.detailTextLabel.text = [self.contentNidArray objectAtIndex: [indexPath row]];
    return cell;
}

Einstellung auf didSelectRowAtIndexPath:

self.detailViewController.currentNodeTitle = [contentTitleArray 
                                             objectAtIndex:indexPath.row];
self.detailViewController.currentNodeNid= [contentNidArray 
                                          objectAtIndex:indexPath.row];
self.detailViewController.currentNodeBody = [contentBodyArray 
                                            objectAtIndex:indexPath.row];

Also beim Klick auf meine Schaltfläche aktualisieren, die Tabelle sollte* refresh mit der neuen json, aber nicht.. Bin ich fehlt ein Schritt?

iOS Aktualisieren-button im View-Controller Nav: Neuladen alle tableViewCells erstellt von JSON geparst, wenn Sie geklickt werden

Außerdem ist dies möglicherweise nicht wichtig, aber ich bin ändern der Farben für jede andere Zeile mit:

//Customize the appearance of table view cells.
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row % 2)
    {
        [cell setBackgroundColor:[UIColor colorWithRed:221.0/255.0 green:238.0/255.0 blue:255.0/255.0 alpha:1]];
        cell.textLabel.textColor = [UIColor colorWithRed:2.0/255.0 green:41.0/255.0 blue:117.0/255.0 alpha:1];
        cell.detailTextLabel.textColor = [UIColor colorWithRed:2.0/255.0 green:41.0/255.0 blue:117.0/255.0 alpha:1];

    }    else [cell setBackgroundColor:[UIColor clearColor]];
}

Update

iOS Aktualisieren-button im View-Controller Nav: Neuladen alle tableViewCells erstellt von JSON geparst, wenn Sie geklickt werden

Ich würde vermuten, ein problem mit cellForRowAtIndexPath: die Sie eingefügt haben nur ein kleines fragment.
Ich habe meine gesamte cellForRowAtIndexPath. Ich hatte nicht geschrieben das gesamte Verfahren, da es war komplett standard, ausser für das, was ich Hinzugefügt hatte. - vielen Dank
Haben Sie überprüft mit debugger, der [self.tableView reloadData]; wird immer erreicht, und dass tableView ist nicht null?
Derzeit gibt es Zellen mit Inhalt in meiner Sicht, so dass ich dachte, das bedeutete, dass tableView hatte Zellen und ist daher nicht null. Die folgenden Protokolle der NSLog, dass es größer als 0 ist: if (self.tableView - > 0) { [self.tableView reloadData]; NSLog(@"Ihre tableview ist größer als 0"); } -- also ja, ich denke, es ist nicht null. Eine weitere Sache, die ich bemerkte, war, dass, obwohl meine IBAction angeschlossen wird, bis zu der refresh-Methode mit code, der Kreis neben der Methode zeigt immer noch als nicht verbunden. Dies muss verursacht werden, wenn Sie eine Schaltfläche erstellen, mit code, anstatt die GUI. (screenshot anbei).

InformationsquelleAutor Pat | 2011-12-22

Schreibe einen Kommentar