未调用 cellForRowAtIndexPath

Posted

技术标签:

【中文标题】未调用 cellForRowAtIndexPath【英文标题】:cellForRowAtIndexPath is not getting called 【发布时间】:2015-02-18 22:03:39 【问题描述】:

我有一个表格视图控制器,其中的单元格不显示: 我添加了 UiViewDataSource 和 UITableViewDelegate 如下所示:

myViewController:UITableViewController<UITableViewDataSource,UITableViewDelegate>

在故事板以及我设置的代码中

self.tableView.delegate =self;
self.tableview.datasource = self;

我的 numberOfRowsInSection 返回值 30(通过日志验证), numberOfSectionsInTableView 返回 1(通过日志验证)

我还打印了 tableView 页眉和页脚视图框架、高度和宽度,它们的值都是 0.0000

NSLog(@"The header frame size is%f" ,self.tableView.tableHeaderView.frame.size.height);
NSLog(@"The header frame size is%f" ,self.tableView.tableHeaderView.frame.size.width);
NSLog(@"The header frame size is%f" ,self.tableView.tableFooterView.frame.size.height);
NSLog(@"The header frame size is%f" ,self.tableView.tableFooterView.frame.size.width);

这是导航控制器的第一个控制器。 首先调用 numberOfSectionsInTableView 方法,然后调用 numberOfRowsInSection,然后调用 heightForRowAtIndexPath。

cellForRowAtIndexPath 方法包含:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    CustomCell *cell = (CustomCell *) [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    [cell configureCustomCell:[self.dataSource objectAtIndex:indexPath.row]];

    return cell;

configureCustomCell 配置单元格中的不同属性。

我尝试了类似问题中给出的所有解决方案,但似乎都没有奏效。我错过了什么?

【问题讨论】:

你怎么知道cellForRowAtIndexPath没有在numberOfRowsInSection之后被调用? 你能像使用页眉和页脚一样打印表格视图的大小吗?这些值也都是 0 吗? 我在所有方法中都设置了断点,代码永远不会到达 cellForRowAtIndexPath 中的断点。 我猜您永远不会调整表格视图的大小。您的表格视图只会尝试加载尽可能多的单元格以适合表格视图。如果您的尺寸是(0, 0),那么它不会尝试渲染任何单元格。 还有可能是你拼错了tableView:cellForRowAtIndexPath:的名字。 【参考方案1】:

如果您在 ViewController.h 文件中配置了UITableViewDataSourceUITableViewDelegate 协议,则无需使用self.tableView.delegate =self;

self.tableview.datasource = self;

如果您在情节提要中配置了 UITableView。 您需要使用您的tableView's 单元格属性配置您的CustomTableViewCell

第1步 选择您的 tableView Cell 并在身份检查器内部定义您的 CustomTableViewCell 类。

步骤 - 2 现在提供小区标识符。 (我用过“customCell”)

在 ViewController.m 文件中导入 CustomCell 类。刚刚根据您的参考创建了演示应用程序。希望它能解决您的疑问。

#import "ViewController.h"
#import "CustomTableViewCell.h" //CustomTableViewCell class

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad 

      [super viewDidLoad];
       // Do any additional setup after loading the view, typically from a nib.


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

     return 1;


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

    return 30; //used staticCells 30


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

    static NSString *cellIdentifier = @"customCell"; //as defined in cell identifier (as per step -2)

    CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
    if (cell == nil)
    
        cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    
    // configure your custom cell 

    return cell;


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


@end

【讨论】:

当然需要使用self.tableView.delegate = self; self.tableView.dataSource = self;。 TableView 无法进行心灵感应。如果您不以某种方式(通过情节提要或通过代码)设置delegatedataSource,它永远不会知道。我刚刚在一个空项目中检查了它,以防我错过了一些新功能。如果您不明确设置它们,它将不起作用。 是的,你是正确的以编程方式配置 UITableView 需要 self.tableView.delegate = self; self.tableView.dataSource = 自我;但如果我们使用故事板并配置 UITableView 则没有必要。我在我的项目中做同样的事情。 :) 是的,我现在看到,OP 说,他/她在故事板和编程中都说了。我对if you have configured UITableViewDataSource and UITableViewDelegate protocols inside your ViewController.h file, then there is no need... 这个短语感到困惑,因为它没有提到故事板,所以没有上下文它是不正确的。能否请您稍微纠正一下以避免混淆? @FreeNickname - 是的,当然!感谢提及它。 :)

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

未调用 cellForRowAtIndexPath

cellForRowAtIndexPath 方法未调用

未调用 cellForRowAtIndexPath 但调用 numberOfRowsInSection

未调用 UITableView 方法 cellForRowAtIndexPath

未调用 alertviewcontroller 中的 tableview 的“cellForRowAtIndexPath”

在 reloadData 后未调用 cellForRowAtIndexPath