未调用 cellForRowAtIndexPath 但调用 numberOfRowsInSection
Posted
技术标签:
【中文标题】未调用 cellForRowAtIndexPath 但调用 numberOfRowsInSection【英文标题】:cellForRowAtIndexPath not called but numberOfRowsInSection called 【发布时间】:2014-01-29 14:34:59 【问题描述】:我有一个简单的问题,但我不明白是什么。
我有一个UIViewControler
(称为RootController
),它加载了一个包含tableView
的UIView
(称为SecondView
)。问题是UIView
调用numberOfSectionsInTableView
和numberOfRowsInSection
但不调用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 但调用 numberOfRowsInSection
未调用 UITableView 方法 cellForRowAtIndexPath
未调用 alertviewcontroller 中的 tableview 的“cellForRowAtIndexPath”