uitableview cellforrowatindexpath не вызывается, но нет: из строк в разделе вызывается - PullRequest
3 голосов
/ 18 мая 2011

в моем табличном представлении не вызывается ни одна строка в методе раздела, и он возвращает значение 17, но cellforrowatindexpath не вызывается. Я поставил точки останова в первой строке этого метода, но эта точка никогда не отображается при отладке, у меняпосле tableviewdelegate и datasource.and источника данных tableviews делегат правильно настроен в Int Builder.

Я также публикую часть кода

в моем 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 ]

5 голосов
/ 10 июля 2014

cellForRowAtIndexPath не будет вызван, если ваш просмотр таблицы имеет высоту 0

убедитесь, что в вашем табличном представлении всегда есть ВИДИМЫЕ строки

CGRect frame = self.tableView.frame;
frame.size.height = 100;
self.table.frame = frame;
2 голосов
/ 18 мая 2011

Учитывая код, который вы показали нам, есть только несколько возможностей.Либо self.tweetsTable равно nil, tweets равно nil, либо tweets не содержит элементов, и count возвращает ноль.Теперь я знаю, вы говорите, что все правильно, но явно что-то не так!Вы можете добавить немного защитного кода для обнаружения этих проблем.

-(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 не будет вызван.

2 голосов
/ 18 мая 2011

Он не будет вызван, если вы возвращаете 0 строк в методе numberOfRowsInSection.Пожалуйста, проверьте количество строк, которые вы возвращаете.

0 голосов
/ 10 января 2017

В моем случае я использовал собственный подкласс 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
}
0 голосов
/ 06 октября 2015

Вы можете использовать следующий код для перезагрузки вашего tableView

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
0 голосов
/ 04 июня 2013

В моих случаях я создал UITableView как свойство на моем контроллере представления, но я забыл добавить его как подпредставление к self.view

Странно, вы получите симптомы, описанные Суджит: numberOfRowsInSection будет вызван, но cellForRowAtIndexPath не будет!

Это была моя пропущенная строка:

[self.view addSubView:self.myTableViewProperty];

И для защиты от этого:

NSAssert(self.myTableViewProperty.superview != nil, @"The table view dose not have a superview");
[self.myTableViewProperty reloadData];
0 голосов
/ 21 октября 2012

Вот моя функция.После того, как я поместил «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);
}
0 голосов
/ 18 мая 2011

check this

или используйте код viewDidLoad в viewWillAppear

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...