Obj-C中UITableView无法加载MutableArray数据:控制器内数组为空
从你的代码来看,主要有三个核心问题导致进入TableViewController后数组为空,甚至后续还会引发崩溃,我逐个给你拆解:
1. 异步请求的时序问题(最直接原因)
你的网络请求是异步执行的,调用[dataTask resume]后,代码不会等待请求返回就继续执行后续逻辑。也就是说,当你启动应用后立刻跳转到HistoryViewController时,网络请求可能还在后台跑,此时tableDicsArrayTickets还没被填充数据,自然显示为空。
2. AppDelegate实例未正确获取
你在AppDelegate里定义了+(AppDelegate *)getInstance单例方法,但在HistoryViewController里,你只是声明了mainDelegate变量,却没有用这个方法(或者系统标准方式)获取正确的AppDelegate实例。如果直接初始化新的AppDelegate对象,你访问的mainDelegate.tableDicsArrayTickets根本不是AppDelegate中那个正在填充数据的数组。
3. 数组填充逻辑错误(隐藏坑)
看你请求完成后的代码:
[self.tableDicsArrayTickets addObject:[[dics valueForKey:@"response"] valueForKey:@"text"]];
这里你添加到数组的是一个NSString对象,但在HistoryViewController的cellForRow方法里,却用[[array objectAtIndex:indexPath.row] objectForKey:@"text"]去访问字典的key——NSString根本没有objectForKey:方法,就算数组有数据,这里也会直接崩溃。
具体修复方案
方案1:正确获取AppDelegate实例
在HistoryViewController的viewDidLoad里,替换成正确的实例获取方式:
- (void)viewDidLoad { [super viewDidLoad]; // 方式1:用你定义的单例方法 self.mainDelegate = [AppDelegate getInstance]; // 方式2:用系统标准方法(更推荐) // self.mainDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; }
方案2:异步请求完成后刷新表格
因为网络请求是异步的,就算获取了正确实例,进入页面时请求可能还没完成。我们可以用通知中心在数据加载完成后通知表格刷新:
- 在AppDelegate的请求回调里发送通知:
if(error == nil) { // ... 你的数据解析代码 ... // 注意:这里要修正填充逻辑,添加字典而不是字符串 NSArray *ticketDicts = [[dics valueForKey:@"response"] valueForKey:@"text"]; [self.tableDicsArrayTickets addObjectsFromArray:ticketDicts]; // 发送数据加载完成的通知 [[NSNotificationCenter defaultCenter] postNotificationName:@"TicketsDataLoaded" object:nil]; }
- 在HistoryViewController里监听通知并刷新表格:
- (void)viewDidLoad { [super viewDidLoad]; self.mainDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; // 注册通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshTicketTable) name:@"TicketsDataLoaded" object:nil]; } - (void)refreshTicketTable { [self.tableView reloadData]; // 这里可以打印数组确认数据 NSLog(@"当前数组数据:%@", self.mainDelegate.tableDicsArrayTickets); } // 记得在页面销毁时移除观察者,避免野指针 - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; }
方案3:修正数组填充逻辑
根据你的XML结构,确保添加到数组的是字典对象,而不是字符串。比如如果response下的text是一个字典数组,直接用addObjectsFromArray批量添加,而不是单个addObject。
内容的提问来源于stack exchange,提问作者SubXero14

