【问题标题】:cellForRowAtIndexPath not being called after successful api call成功调用 api 后未调用 cellForRowAtIndexPath
【发布时间】:2014-04-30 20:34:13
【问题描述】:

在我的应用程序中(使用 Storyboard 仅供参考)我有一个包含 tableView 的 viewController。我的 viewController 访问一个 API 并返回我的 tableView 应该填充的项目数组。问题是,成功检索数组后,reloadData 方法不会触发对 cellForRowAtIndexPath 的调用。我已经正确设置了委托和数据源,但仍然没有运气。这是我的代码:

在我看来DidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView = [[UITableView alloc]init];
    self.tableView.dataSource = self;
    self.tableView.delegate = self;

    [[CCHTTPClient sharedClient] getItemsWithSuccess:^(NSArray *items) {

        self.items = items;
        [self.tableView reloadData];

    } failure:^(NSError *error) {
    }];
}

还有我的 numberOfRowsInSection:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.items count];
}

我还发现,如果我在之前的 VC 上进行了 API 调用,并在 viewController 被推送之前设置了 viewController 的项目数组,那么表格会正确填充。真的不确定这里发生了什么。任何帮助将不胜感激!

【问题讨论】:

  • 您确定items 不是nil 并且至少包含一个值吗?另外,一定要在主线程上调用reloadData
  • @rmaddy 是的,我在两者上都设置了断点。 items 包含一个值,就在重新加载表之前(在第一个线程上)

标签: ios objective-c uitableview uiviewcontroller


【解决方案1】:

如果您的控制器和表格视图是在情节提要中制作的,那么 self.tableView 应该是一个出口。您正在使用 alloc init 在 vi​​ewDidLoad 中创建一个不同的表视图,因此您在该视图上调用 reloadData,而不是您在屏幕上的视图。删除 alloc init 行,然后连接 IB 中的出口。

【讨论】:

  • GAH。我真笨,非常感谢你弄清楚这一点。我在 IB 中连接了插座,所以重新初始化它导致了错误。非常感谢!
  • 我认为这个故事的寓意是不要使用 SB。
【解决方案2】:

我怀疑这是由于从辅助线程调用reloadData 引起的。试试这个:

[[AGHTTPClient sharedClient] getItemsWithSuccess:^(NSArray *items) {
    self.items = items;

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.tableView reloadData];
    });
} failure:nil];

【讨论】:

  • 好答案,后台线程禁止 UI 更新。调度包装器确保重新加载在主线程 OP 上。
  • 感谢您的回答,但不幸的是我忘记指出我尝试过这个但它没有工作。还有其他想法吗?
  • @User3294729579346597634 其他想法?是的,请参阅我在问题下方的评论。
猜你喜欢
  • 2022-08-16
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多