在我的tableview中调用section方法中没有行,它返回值17,但是cellforrowatindexpath没有被调用。我已经在这个方法的第一行放了断点但是这个点在调试时从不显示,我有跟随tableviewdelegate和datasource.and tableviews数据源,委托在Int构建器中正确设置。
我也发布了一些代码
在我的viewcontroller.m
中-(void)viewDidLoad
{
tweets=[[NSMutableArray alloc]init];
[self updateStream:nil];
[self.tweetsTable setDelegate:self];
[self.tweetsTable setDataSource:self];
}
-(NSInteger)tableView:(UITableView *)tweetsTable numberOfRowsInSection:(NSInteger)section {
return [tweets count];
}
-(UITableViewCell *)tableView:(UITableView *)tweetsTable cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"twitCell";
TwitCell *cell = (TwitCell *)[tweetsTable dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = (TwitCell *)[[[TwitCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
cell.tweet = [tweets objectAtIndex:indexPath.row];
[cell layoutSubviews];
return cell;
}
答案 0 :(得分:5)
cellForRowAtIndexPath
将无法被调用
确保您的tableview始终具有可见的行
CGRect frame = self.tableView.frame;
frame.size.height = 100;
self.table.frame = frame;
答案 1 :(得分:2)
如果在numberOfRowsInSection方法中返回0行,则不会调用它。 请检查您返回的行数。
答案 2 :(得分:2)
鉴于您向我们展示的代码,我们只有几种可能性。 self.tweetsTable
为nil
,tweets
为nil
,或tweets
不包含任何元素,而计数返回零。现在我知道你说一切都是正确的,但显然有些事情发生了!您可以添加一些防御性代码来检测这些问题。
-(void)viewDidLoad
{
tweets=[[NSMutableArray alloc]init];
[self updateStream:nil];
NSAssert(self.tweetsTable, @"self.tweetsTable must not be nil.");
[self.tweetsTable setDelegate:self];
[self.tweetsTable setDataSource:self];
}
-(NSInteger)tableView:(UITableView *)tweetsTable numberOfRowsInSection:(NSInteger)section {
NSAssert(tweets, @"tweets must not be nil here");
NSUInteger n = [tweets count];
if(n == 0)
NSLog(@"WARNING: %@ returning 0", __PRETTY_FUNCTION__);
return (NSInteger)n;
}
如果你这样做,其中一个断言发射,你就会知道你的问题所在。如果没有断言触发,那么在你所显示的代码范围之外会发生一些事情(例如,某些东西很快被释放或者内存被破坏)。哦,最后一件事 - 你能看到屏幕上的空表视图吗?如果您的表格不可见,则不会调用AFAIK cellForRowAtIndexPath
。
答案 3 :(得分:0)
检查this
或者在viewWillAppear中使用viewDidLoad代码
答案 4 :(得分:0)
这是我的功能。我将“dispatch_async(dispatch_get_main_queue()...
”放在“tweets = [NSJSONSerialization.....
”内后,就可以了。
tweets = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&jsonError];
if (tweets) {
// We have an object that we can parse
NSLog(@"%@", tweets);
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}
else {
// Inspect the contents of jsonError
NSLog(@"%@", jsonError);
}
答案 5 :(得分:0)
在我的情况下,我在视图控制器上创建了一个UITableView
作为属性,但我忘了将其作为子视图添加到self.view
奇怪的是,你会得到sujith描述的症状:numberOfRowsInSection
将被调用,但cellForRowAtIndexPath
不会!
这是我遗漏的一句话:
[self.view addSubView:self.myTableViewProperty];
并为此辩护:
NSAssert(self.myTableViewProperty.superview != nil, @"The table view dose not have a superview");
[self.myTableViewProperty reloadData];
答案 6 :(得分:0)
您可以参考以下代码重新加载tableView
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
答案 7 :(得分:0)
在我的情况下,我使用的是UITableView的自定义子类,我没有调用super super.layoutSubviews()
override func layoutSubviews() {
super.layoutSubviews() // Forgotten to call super implementation
self.layer.borderColor = Constants.primaryColor.cgColor
self.layer.borderWidth = Constants.primaryBorderWidth
self.indicatorStyle = .white
}