You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:异步请求完成后刷新表格

因为网络请求是异步的,就算获取了正确实例,进入页面时请求可能还没完成。我们可以用通知中心在数据加载完成后通知表格刷新:

  1. 在AppDelegate的请求回调里发送通知:
if(error == nil) {
    // ... 你的数据解析代码 ...
    // 注意:这里要修正填充逻辑,添加字典而不是字符串
    NSArray *ticketDicts = [[dics valueForKey:@"response"] valueForKey:@"text"];
    [self.tableDicsArrayTickets addObjectsFromArray:ticketDicts];
    // 发送数据加载完成的通知
    [[NSNotificationCenter defaultCenter] postNotificationName:@"TicketsDataLoaded" object:nil];
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:21:40