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?
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
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie rufen Sie die reload-Methode.
Diese Feuer, die
dataSource
unddelegate
Veranstaltungen ein aktualisieren derUITableView
.Finden Sie mehr info in der UITableView Klasse Referenz:
Ich habe meinen Beitrag aktualisiert, um meine IBAction-code und ein paar mehr Infos. Vielleicht fehlt mir einige code? Ich kann verifizieren, dass die JSON geändert hat, durch ausführen der Anwendung wird dann die Aktualisierung der JSON-Quelle, und wenn ich auf die Schaltfläche "refresh" meine NSLog zeigt, dass der neue Knopf-Ausgänge neue Inhalte, aber die Zellen werden nicht aktualisiert.
InformationsquelleAutor Gustavo Barrientos