未调用 cellForRowAtIndexPath 但调用 numberOfRowsInSection

Posted

技术标签:

【中文标题】未调用 cellForRowAtIndexPath 但调用 numberOfRowsInSection【英文标题】:cellForRowAtIndexPath not called but numberOfRowsInSection called 【发布时间】:2014-01-29 14:34:59 【问题描述】:

我有一个简单的问题,但我不明白是什么。 我有一个UIViewControler(称为RootController),它加载了一个包含tableViewUIView(称为SecondView)。问题是UIView 调用numberOfSectionsInTableViewnumberOfRowsInSection 但不调用cellForRowAtIndexPath 并且不显示表格视图。 RootViewController的代码是:

SecondView *secondView = [[seconddView alloc] initWithFrame:CGRectMake(0, 60, self.view.bounds.size.width, self.view.bounds.size.height)];
[self.view addSubview:secondView];

SecondView的代码是:

@interface SecondView () <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic,retain) UITableView *table;
@end

@implementation SecondView
@synthesize table;

- (id)initWithFrame:(CGRect)frame 
   self = [super initWithFrame:frame];
   if (self) 
   self.table = [[UITableView alloc] init];
   self.table.delegate = self;
   self.table.dataSource = self;
   [self addSubview:self.table];
   
 return self;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
  static NSString *CellIdentifier = @"Cell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
     
  cell.textLabel.text = @"Prova";
  return cell;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
   return 5;


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
   return 1;

你能帮我找出问题吗?谢谢。

【问题讨论】:

什么是table view frame? 前面的答案解决了,但真正的解释在这里:[***.com/questions/7712325/…[1]:***.com/questions/7712325/… 正确答案在这里***.com/questions/7712325/… 【参考方案1】:

需要设置UITableView的Frame

【讨论】:

你应该扩展你的答案——单行答案并没有真正的帮助。 我正在使用 UITableViewController。有同样的问题。我的解决方案是什么? 设置了框架 或者设置tableView的约束【参考方案2】:

我的问题是我有一个简单的类来实现我的委托和数据源,但是这个简单类的生命周期太短了。

我在做

MyDataSourceClass* myClass = [[MyDataSourceClass alloc] initWithNSArray:someArray];
tableView.dataSource = self.tableViewDataSource;
tableView.delegate = self.tableViewDataSource;
[tableView reloadData];

// end of function, myClass goes out of scope, and apparently tableView has a weak reference to it

需要做的事情

self.tableDataSource = [[MyDataSourceClass alloc] initWithNSArray:someArray];
tableView.dataSource = self.tableDataSource;
tableView.delegate = self.tableDataSource;
[tableView reloadData];
// now at the end of the function, tableDataSource is still alive, and the tableView will be able to query it.

请注意,上面的代码是来自内存的伪代码。从中汲取“确保您的数据源/委托寿命长”的概念,但不要复制粘贴它,因为您还需要做其他事情(例如设置框架等)。

【讨论】:

感谢“简单类的生命周期太短”,这是我的问题【参考方案3】:

如果在不同的线程上调用 reloadData,也会发生这种情况。确保它在主线程上运行,因为所有 UI 内容都必须在主线程上发生。

dispatch_async(dispatch_get_main_queue(),
            self.myTableView.reloadData()
        );

【讨论】:

【参考方案4】:

在 XCode6 中,当在 Storyboard 上的 tableView 上应用“添加缺少的约束”以调整视图时,我也遇到了同样奇怪的问题。

要解决 Storyboard 上的这个问题,首先要清除约束:

然后以下列方式应用约束:

【讨论】:

【参考方案5】:

您只能在调用 viewDidLoad 之后调用 viewcontroller 的视图。 您无法在 init 方法中与 self.view 交互

- (void)viewDidLoad 
    [super viewDidLoad];
    self.table = [[UITableView alloc] initWithFrame:self.view.bounds];
    self.table.delegate = self;
    self.table.dataSource = self;
    [self addSubview:self.table];

在您的情况下,您需要使用框架初始化您的表格视图(如上面代码中的建议)。只需确保在 viewController 的 viewDidLoad 中添加代码

SecondView *secondView = [[seconddView alloc] initWithFrame:CGRectMake(0, 60,     self.view.bounds.size.width, self.view.bounds.size.height)];
[self.view addSubview:secondView];

【讨论】:

【参考方案6】:

我和你有同样的问题:

我只有一个调用委托协议的方法,即 numberOfRowsInSection。同时我有第二种方法 cellForRowAtIndexPath 没有被调用。

这种行为的原因是我的 numberOfRowsInSection 返回了 0 行,而 cellForRowAtIndexPath 没有调用,因为它需要绘制 0 个单元格。

【讨论】:

【参考方案7】:

我会评论 Hussain Shabbir 的回答,以澄清它,但由于我还不能发表评论,所以我会发布一个答案。

我遇到了完全相同的问题。 numberOfRowsInSection 会触发,但cellForRowAt 不会。我撕开我的代码寻找原因,但原因不在代码中。

解决方案(对我而言)在情节提要中。我没有为表视图设置约束。 选择表格视图,单击“添加新约束”图标(看起来像一个方形 TIE 战斗机)并设置顶部、底部、前导和尾随的约束。然后cellForRowAt 将被调用,您的表格将被填充。

我希望这对某人有所帮助。

【讨论】:

【参考方案8】:

此解决方案专门针对我的情况,但可能对某人有所帮助。

我遇到了同样的问题。我使用的是计算属性而不是存储属性;所以每次我调用 tableView 时,我都会得到一个新的。

我有这个代码:

var tableView: UITableView
    let tableView = UITableView()
    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(SomeCell.self, forCellReuseIdentifier: cellID)
    return tableView

这是固定的代码:

lazy var tableView: UITableView = 
    let tableView = UITableView()
    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(SomeCell.self, forCellReuseIdentifier: cellID)
    return tableView
()

【讨论】:

【参考方案9】:

删除 UITableView 并在 ViewController 中重新添加

【讨论】:

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

未调用 cellForRowAtIndexPath

cellForRowAtIndexPath 方法未调用

未调用 cellForRowAtIndexPath 但调用 numberOfRowsInSection

未调用 UITableView 方法 cellForRowAtIndexPath

未调用 alertviewcontroller 中的 tableview 的“cellForRowAtIndexPath”

在 reloadData 后未调用 cellForRowAtIndexPath