uitableview cellforrowatindexpath未调用,但没有:调用section中的行

时间:2011-05-18 09:06:13

标签: iphone tableview

在我的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;
}

8 个答案:

答案 0 :(得分:5)

如果你的tableview的高度为0

cellForRowAtIndexPath将无法被调用

确保您的tableview始终具有可见的行

CGRect frame = self.tableView.frame;
frame.size.height = 100;
self.table.frame = frame;

答案 1 :(得分:2)

如果在numberOfRowsInSection方法中返回0行,则不会调用它。 请检查您返回的行数。

答案 2 :(得分:2)

鉴于您向我们展示的代码,我们只有几种可能性。 self.tweetsTableniltweetsnil,或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
}