reloadData 没有调用 cellForRowAtIndexPath

Posted

技术标签:

【中文标题】reloadData 没有调用 cellForRowAtIndexPath【英文标题】:reloadData not calling cellForRowAtIndexPath 【发布时间】:2014-04-26 20:24:36 【问题描述】:

我的项目使用了一个拆分视图控制器,其中包含一个包含课程时间列表的表格视图和一个详细说明课程时间的主视图。当应用程序首次加载时,表格视图中没有条目,主视图显示登录屏幕。当用户登录时,表格视图应该重新加载包含每个课程期间标题的文本。我无法正确重新加载数据。

按下登录按钮时,会向 App 委托发送一条消息...

- (IBAction)login:(id)sender

    if([self.appDelegate validateUsername:self.usernameField.text validatePassword:self.passwordField.text]) 
        NSLog(@"Login Successful!");
        [self performSegueWithIdentifier:@"loginSegue" sender:sender];
    else 
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Login" message:@"Unsuccessful :(" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
    

...检查用户名信息是否有效。如果是,则在主视图中执行转场。 验证用户名方法如下所示:

- (BOOL)validateUsername:(NSString *)username validatePassword:(NSString *)password

    // The "username isEqualToString" is placeholder.  This message will request a login and proceed if the login is successful
    if([username isEqualToString:@"username"] && [password isEqualToString:@"password"]) 
        self.student = [SCHStudent newStudentWithName:@"Random Student"];
        [self loadData];
        return YES;
    else 
        return NO;
    

[self loadData] 加载一个类周期数组以显示在表格视图中:

- (void)loadData

    [self.student.classPeriods addObject:[SCHClassPeriod newClassPeriodWithTeacher:@"Teacher1" periodNumber:1]];
    [self.student.classPeriods addObject:[SCHClassPeriod newClassPeriodWithTeacher:@"Teacher2" periodNumber:2]];
    [self.student.classPeriods addObject:[SCHClassPeriod newClassPeriodWithTeacher:@"Teacher3" periodNumber:3]];
    [self.student.classPeriods addObject:[SCHClassPeriod newClassPeriodWithTeacher:@"Teacher4" periodNumber:4]];
    [self.student.classPeriods addObject:[SCHClassPeriod newClassPeriodWithTeacher:@"Teacher5" periodNumber:5]];
    [self.student.classPeriods addObject:[SCHClassPeriod newClassPeriodWithTeacher:@"Teacher6" periodNumber:6]];
    [self.tableViewController loadLoginData];

并且 [self.tableViewController loadLoginData] 在我的表视图控制器中找到,看起来像这样。 这就是我被困的地方

- (void)loadLoginData

    [self.tableView reloadData];
    NSLog(@"loadLoginData");

我知道正在调用此方法,因此重新调用 numberOfRowsInSection。

numberOfRowsInSection:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    self.classPeriods = self.appDelegate.student.classPeriods;
    NSLog(@"numberOfRowsInSection returns %ld", (long)self.classPeriods.count);

    // Return the number of rows in the section.
    return self.classPeriods.count;

cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"prototypeCell" forIndexPath:indexPath];
    SCHClassPeriod *tempPeriod = [self.classPeriods objectAtIndex:indexPath.row];
    NSLog(@"cellForRowAtIndexPath returns %@", tempPeriod.teacher);

    // Configure the cell...
    cell.textLabel.text = tempPeriod.teacher;

    return cell;

唯一没有被调用的消息是 cellForRowAtIndexPath。它最初没有被调用,因为 classPeriods 数组中没有对象。这是故意的。但是,我需要在调用 reloadData 时调用 cellForRowAtIndexPath ,即使 numberOfRowsInSection 也是如此。

抱歉代码转储。我想确保提供回答这个问题所需的所有信息。我已经研究这个问题几天了,所有与此类似的问题似乎都是针对每个项目的。

编辑: 控制台日志:

numberOfRowsInSection returns 0

numberOfRowsInSection returns 6

loadLoginData

Login Successful!

【问题讨论】:

您不应该为此使用应用程序委托。视图控制器应该自己获取数据,或者你应该有一个数据控制器来做。 注销您在 numberOfRowsInSection: 中返回的内容。当您期望它是其他东西时,它仍然是 0 吗? 应用程序首次启动时会记录 0。登录后返回 6。另外,感谢 Wain 的评论。解决这个问题后,我会清理我的代码。 【参考方案1】:

如果reloadData 没有调用cellForRowAtIndexPath,那么您还没有链接数据源或者没有与正确的表对话。

【讨论】:

或单元格标识符不匹配【参考方案2】:

我想通了。 我通过 Storyboard Connections Inspector 连接了所有内容,但教我这一点的教程也告诉我将其添加到班级的 viewDidLoad 中:

self.tableView.delegate = self;

self.tableView.dataSource = self;

当我删除这两行代码时,一切正常!

现在我在viewWillAppear 中调用[self.tableView reloadData] 方法,它甚至在通过segues 来回切换时也能正常工作。

希望这对任何人都有帮助!

【讨论】:

当我在 UItableView 上制作 viewController 这个解决方案对我来说很甜蜜。【参考方案3】:

在情节提要中,将 UItableview 中的 拖到名为 tableView 的属性中,这样当您调用 [self.tableView reloadData] 时,插座就会知道要重新加载哪个表

【讨论】:

表格视图属性是否会位于表格视图控制器的界面中? 经过进一步测试,问题不在于没有调用正确的表格视图。我能够使用正确显示的初始值加载表格视图,并且 reloadData 被发送到正确的对象。我认为威廉是对的,数据源没有正确链接。坏消息是我不完全确定如何做到这一点。如果有人能告诉我,那就太酷了。 @user3105870 你正在使用 UIViewController?您将需要拖动数据源,并委托给 ViewController 我正在使用 UITableViewController。现在我将 UITableViewController 设置为表视图的委托和数据源。 但是最重要的引用出口呢,在检查器选项卡中你应该这3个连接@user3105870

以上是关于reloadData 没有调用 cellForRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

.reloadData() 没有调用 NSTableView 委托方法

viewForHeaderInSection 没有在 reloadData 上被调用

reloadData 没有调用 cellForRowAtIndexPath

cellForRowAtIndexPath:reloaddata 未调用

tableView.reloadData() 不起作用,可能没有在主线程上调用

iOS - tableView 的 reloadData 不调用 cellForRowAtIndexPath