gpt4 book ai didi

objective-c - View Controller Nav : reloading all tableViewCells created from parsed JSON when clicked 中的 iOS 刷新按钮

转载 作者:可可西里 更新时间:2023-11-01 03:55:26 26 4
gpt4 key购买 nike

我有一个相当重要的概念性问题,很多人都问过,但没有一个现成的明确答案可以通过搜索找到。

我的应用程序很简单:几行 TableViewCells 填充了来自已解析的 JSON 提要的数据。单击单元格时,该单元格的信息将传递给 SecondViewController 并显示。 JSON 提要也存储到 .plist 中,在互联网不可用的情况下,TableViewCells 从 .plist 中填充。

这一切都很好。

但是,我最不需要的是 FirstViewController 顶部的刷新按钮,用于刷新 JSON 提要,以及表格中的所有单元格以及来自新变量的新数据。但是,我在实现时遇到了一个问题:

我的原始 JSON 调用和填充单元格的变量位于 ViewDidLoad 方法中。当 View 加载时,这些变量被“设置”并且不刷新。此外,我可以将 JSON 调用和变量移动到 viewWillLoad - 每次单击单元格后都会刷新表格,然后单击“返回”到 firstViewController - 这将成功更新 JSON 和单元格,但它确实会产生影响速度并在返回到 MainViewController 时使 View Controller “暂停”,这使得调用我的原始 JSON 并在 viewWillLoad 中设置我的变量成为一个不可行的选项。

我在 ViewDidLoad 中创建了一个重新加载按钮,它链接到一个 IBAction 方法“刷新”:

在 ViewDidLoad 中以编程方式创建按钮:

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

链接到的操作方法:

- (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];
}

在上面的代码中,您可以看到每次单击按钮时我都会重新调用 JSON,并使用新的 JSON 记录一条消息到控制台。这是工作。我什至重建了一本成功添加新内容的字典。

我的问题是:如何使 tableViewCells 也使用这些新数据“刷新”?我可以让按钮重新加载整个 View Controller - 这样它会再次调用 ViewDidLoad 吗?我是否需要重新考虑我的应用程序结构,或者将我的原始变量移出 viewDidLoad?

我一直在阅读 NSNotificationCenter 上的一些帖子,但它的实现仍然让我感到困惑,因为我对 iOS 开发还很陌生。

谢谢~


更新:


还没有更新。这是我使用 [self.tableView reloadData] 的完整刷新按钮代码;在我的 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];
}

我在 cellForRowAtIndexPath 配置单元格(更新:发布整个方法):

- (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;
}

在 didSelectRowAtIndexPath 上设置它:

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

因此,当单击我的刷新按钮时,表格应该*使用新的 json 进行刷新,但没有。我是否遗漏了一个步骤?

enter image description here

此外,这可能并不重要,但我正在更改每隔一行的颜色:

// 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]];
}

更新

enter image description here

最佳答案

需要调用reload方法。

[self.tableView reloadData];

这将触发 dataSourcedelegate 事件,并将刷新 UITableView

您可以在 UITableView Class Reference 中找到更多信息:

Call this method to reload all the data that is used to construct the table, including cells, section headers and footers, index arrays, and so on. For efficiency, the table view redisplays only those rows that are visible.

关于objective-c - View Controller Nav : reloading all tableViewCells created from parsed JSON when clicked 中的 iOS 刷新按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8608241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com