【问题标题】:cellForRowAtIndexPath not called; sections returns 1 and rows returns 4未调用 cellForRowAtIndexPath;部分返回 1,行返回 4
【发布时间】:2010-12-09 03:19:34
【问题描述】:

在 Data 类中解析 JSON 数据后,我在同一个 Data 类的 fillArrays 方法中设置了 UIViewController 的 NSArray *headlines 属性。在我的 UIViewController 的 viewDidAppear 方法中,我在我的 UITableView 上调用了 reloadData。 numberOfSectionsInTableView 触发并返回 1,然后 numberOfRowsInSection 触发并返回数组计数 4(对于数组中的 4 个字符串)。但是,控制永远不会到达 cellForRowAtIndexPath 并且我很难理解为什么,特别是因为我有有效的部分和行。单元格全部可见。

我已将 UITableViewDataSource 和 UITableViewDelegate 协议添加到 UIViewController 接口,并在 viewDidLoad 中将 UITableView 的委托和数据源设置为 self(这也通过调用的行数和节数方法进行验证)。

我想知道是否与我在 Data.m 中重新初始化 UIViewController 以设置其属性有关。

在 Data.m 中:

- (void)fillArrays:(NSArray *)jsonObjs {
    NSLog(@"fillArrays");               
    HeadlinesRootViewController *hrvc = [[HeadlinesRootViewController alloc] init];
    hrvc.headlines = [self getJsonValuesForKey:@"headline" inArrayOfObjects:jsonObjs];
    [hrvc viewDidAppear:NO];
}

在 ViewController.m 中:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad");
    // Table view
    headlineTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 180, self.view.bounds.size.width, 300) style:UITableViewStylePlain];
    [headlineTableView setDelegate:self];
    [headlineTableView setDataSource:self];
    // Temporary
    self.headlines = [[NSMutableArray alloc] initWithObjects:@"headline1", @"headline2", @"headline3", @"headline4", nil];



    [self.view addSubview:headlineTableView];
    self.headlineTableView = headlineTableView;
    [headlineTableView release];
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"viewdidappear");
    NSLog(@"headlines: %@", self.headlines); // Returns an array of 4 headlines
    if( [self.headlines count] != 0 ){
        [self.headlineTableView reloadData];
    }
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    NSLog(@"numberOfSectionsInTableView: 1");
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"numberOfRowsInSection: %d", [self.headlines count]);
    return [self.headlines count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"cellForRowAtIndexPath");
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.text = [[NSString alloc] initWithFormat:@"%@", [self.headlines objectAtIndex:indexPath.row]];

    return cell;
}

【问题讨论】:

  • 你可能想发布一些代码

标签: iphone objective-c cocoa-touch uitableview


【解决方案1】:

在 fillArrays 中,您创建了另一个视图控制器 - 但您永远不会对它或它的视图做任何事情,您永远不会看到那个视图。您也永远不会手动调用 viewDidAppear,这会在显示视图控制器视图时自动发生(但仅在导航控制器的上下文中)。

通常流程是,您创建一个视图控制器,然后将该视图添加为当前视图的子视图,或者通过导航控制器将其作为新窗口推送。我很确定您的整个问题是它们的表从未添加到任何人实际看到的视图中,因此该表调用其他方法但从不调用 cellForRow,因为它的 layoutSubviews 代码根本没有被调用。

【讨论】:

  • 就是这样。我正在创建 UIViewController 的副本。我所要做的就是通过一个方法参数将对我现有的引用传递给 Data 类。感谢大家对我的第一个问题的帮助。
【解决方案2】:

您是否已将您的tableView 添加到UIViewController 的视图中?

它发生在我身上,当我添加这个时

[self.view addSubview:table];
[table release];

然后cellForRowAtIndexPath 开始工作了。

【讨论】:

  • 漂亮而简单。我认为这就是肯德尔在上面的意思,但这对我来说很有意义。谢谢!
【解决方案3】:

为了谷歌:

如果tableView:numberOfRowsInSection 因任何原因返回零,tableView:cellForRowAtIndexPath 将不会被调用,因为没有行可以调用它。

【讨论】:

  • 对于其他在家跟随的人,请确保您在 numberOfRowsInSection 中确保您的布尔逻辑是正确的。我是一位经验丰富的 iOS 开发人员,我刚刚花了一个小时试图弄清楚为什么我的单元格不显示:结果是我的 else 条件在长时间检查结束时设置了 rows=0乙>。哇!
【解决方案4】:

检查以确保 tableView 委托和 dataSource 指向 viewController

【讨论】:

    【解决方案5】:

    我看不出代码有什么问题,你有没有用断点验证过 cellForRow 永远不会到达(即使我看到你有一个日志语句)?

    另外,我会尝试进行健全性检查以在 rowsInSection 中显式返回“1”,并在 cellForRow 中返回的单元格中硬编码一个字符串。

    如果一切都失败了,从 XCode 模板创建一个新的表视图控制器并将你的调用放在那里 - 然后当它工作时,回到你的代码没有的原因。

    另外,很高兴看到您的 viewDidLoad 设置代码(请添加到上面的答案)。

    【讨论】:

      【解决方案6】:

      如果您在 viewDidLoad 中设置委托和数据源,那么这可能是您的错误的根源。可以在 init 中设置数据源和委托吗?

      【讨论】:

      • 当我将 UITableView 代码从 viewDidLoad 移动到 init 时,不幸的是,甚至没有调用 numberOfSectionsInTableView。
      【解决方案7】:

      我不确定您是否将 UITableView 作为子视图添加到 UIViewController.view。无论如何,这是我的方法。

      在这种方法中,我发现在将 UITableView 添加为子视图后将 UIViewController.view 发送到后面之前,执行并没有进入 cellForRowAtIndexPath。

      走到这一步只是问题的一部分。此时,我的其他视图控制器似乎不再响应触摸事件。我发现当我还将 UITableView 作为子视图添加到 rootViewController 时,我的所有视图都获得了适当的触摸事件。

      【讨论】:

        【解决方案8】:

        非常感谢 pxl。当我将 UITableView 初始化从 viewDidLoad 移动到:

        - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil"
        

        每当我删除或更新 UITableView 重新加载到我的 UIView 的某些行时,它都能完美运行。

        【讨论】:

          【解决方案9】:

          斯威夫特版本

          添加self.table.layoutIfNeeded(),然后添加self.tableView.reloadData()

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-29
            • 1970-01-01
            • 1970-01-01
            • 2013-02-06
            • 1970-01-01
            • 2017-12-27
            • 1970-01-01
            相关资源
            最近更新 更多