当源为 NSURLConnection 并获取新数据时重新加载表格视图

Posted

技术标签:

【中文标题】当源为 NSURLConnection 并获取新数据时重新加载表格视图【英文标题】:reloading a tableview when source is NSURLConnection and gets new data 【发布时间】:2010-10-22 23:08:59 【问题描述】:

我使用 uitableview 的 tabController 应用程序获取 NSURLconnection 数据并尝试显示它。我无法弄清楚这个问题。如果我用数组替换连接,我将存储所有向下钻取的工作,但更新不会,所以我认为 tableView 的结果很好。但是:

如果我把 [[self.tableview] reloadData];在 -(void) connectionDidFinishLoading:

这会导致我的父行在视图上出现循环。当您选择一行时,它会重新填充同一行“标题”,而不是它的子行。如果我删除 [[self.tableview] reloadData]; tableDataSource3 是空的,没有用 URL 数据刷新,所以我需要它。我有 NSLogs 显示更新,所以我知道它正在更新。

如果我把 [[self.tableview] reloadData];在 ViewDidAppear 中:

在我移出表格并返回之前,视图是空的(该应用程序是一个带有 tableViews 的 tabcontroller)。如果我在数据库中添加一行并通过 NSURL 连接进行更新,tableView 将保持原样,但如果我选择一行,则更新的新数据将出现在推送的表中。

如果我把 [[self.tableview] reloadData];在 ViewWillAppear 中:

在我离开桌子并返回之前,视图是空的。但是,推送的子视图是空的。

有什么想法吗?

NSURLconnection方法到此结束

    -(void) connectionDidFinishLoading:(NSURLConnection *)conn3 

 ~ JSON STUFF~

  NSArray *test = [json objectForKey:@"Rows"];
  tableDataSource3 = [[NSArray alloc] initWithArray:test];


  [json release];
  [conn3 release];
  self.receivedData =nil;
  [[self tableview] reloadData];
    

这里是选择方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

  //Get the dictionary of the selected data source.
 NSDictionary *dictionary = [self.tableDataSource3 objectAtIndex:indexPath.row];

 //Get the children of the present item.
 NSArray *Children = [dictionary objectForKey:@"Children"];

 if([Children count] == 0) 

  ItemDetailViewController *dvController = [[ItemDetailViewController alloc] initWithNibName:@"ItemDetailView" bundle:[NSBundle mainBundle]];
  [self.navigationController pushViewController:dvController animated:YES];
  [dvController release];
 
 else 

   //Prepare to tableview.
  ThirdTab *rvController = [[ThirdTab alloc] initWithNibName:@"SecondView" bundle:[NSBundle mainBundle]];


  rvController.CurrentLevel3 += 1;


  rvController.CurrentTitle3 = [dictionary objectForKey:@"Title"];
  [self.navigationController pushViewController:rvController animated:YES];

  rvController.tableDataSource3 = Children;

  [rvController release];
 


【问题讨论】:

【参考方案1】:

有点难以追踪你在说什么......而且你的代码需要格式化(上图)

试试……

在 -viewDidLoad 中启动您的 NSURLConnection 请求 [[self tableView] reloadData]; 只能在 connectionDidFinishLoading: 中调用,或者在 NSURLConnection 请求之外对数据数组进行任何更新之后调用。 在connectionDidFinishLoading:self.tableDataSource3 = [[NSArray alloc] initWithArray:test]; before the [[self tableView] reloadData];

【讨论】:

@Jordan 是的,NSURL 从 viewDidLoad 开始 @Jordan 我在 connectionDidFinishLoading 结束时只有一次 reloadData。添加自我是个好主意,但我得到了相同的结果。谢谢 我感觉整个 didselectRowatIndexPath 对于 reloadData 调用是不正确的。我发布了一个新问题。

以上是关于当源为 NSURLConnection 并获取新数据时重新加载表格视图的主要内容,如果未能解决你的问题,请参考以下文章

GWT 阻止源为“http://localhost”的框架访问跨域框架

有一个有序数组,要求将一个新输入的数插入到数组中并保证插入新数后,数组仍有序。

停止/中止 NSURLConnection

NSURLConnection 启动 + 自动释放

iOS开发网络篇--NSURLConnection

当源表中不存在相关行时更新