2015-07-18 1 views
-2

У меня есть приложение, которое загружает данные из Parse.iOS - только некоторые ячейки загружаются в UITableView, а остальные не отображаются до тех пор, пока не прокручиваются через них.

-(void)viewWillAppear:(BOOL)animated{ 
      [self getData]; 
    } 

в методе GetData, после того, как все данные загружаются он вызывает self.tableView reloadData на главной теме:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView reloadData]; 
    }); 

Но только первые обновления клеток правильно, а остальные оставляют их заполнитель, пока я не прокручу их.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 

if (indexPath.row == 0){ 

    static NSString *CellIdentifier = @"Cell1"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    UIButton *signUp = (UIButton *)[cell.contentView viewWithTag:3]; 
    signUp.clipsToBounds = YES; 
    signUp.layer.cornerRadius = 8; 
    [signUp addTarget:self 
       action:@selector(toSignUp) forControlEvents:UIControlEventTouchDown]; 
    [signUp setHidden:NO]; 


    UILabel *spotsOutOf500 = (UILabel *)[cell.contentView viewWithTag:1]; 
    spotsOutOf500.text = [NSString stringWithFormat:@"%d/%d",onSpot,ofSpots]; 
    [spotsOutOf500 setHidden:NO]; 


    UILabel *spotsLeft = (UILabel *)[cell.contentView viewWithTag:2]; 
    spotsLeft.text = [NSString stringWithFormat:@"%d spots left",ofSpots - onSpot]; 
    if (ofSpots - onSpot < 0){ 
     spotsLeft.text = @"0 spots left"; 
    } 
    [spotsLeft setHidden:NO]; 

    return cell; 
} 

if (indexPath.row == 1){ 


    static NSString *CellIdentifier = @"Cell2"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    UIButton *getRobin = (UIButton *)[cell.contentView viewWithTag:102]; 
    getRobin.clipsToBounds = YES; 
    getRobin.layer.cornerRadius = 4; 
    [getRobin addTarget:self 
       action:@selector(getRobin) forControlEvents:UIControlEventTouchDown]; 

    UIButton *sendToFriend = (UIButton *)[cell.contentView viewWithTag:103]; 
    sendToFriend.clipsToBounds = YES; 
    sendToFriend.layer.cornerRadius = 4; 
    [sendToFriend addTarget:self 
        action:@selector(sendToFriend) forControlEvents:UIControlEventTouchDown]; 




    return cell; 


} 



static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 


PFObject *stock = stocks[indexPath.row-2]; 
    // int row = indexPath.row; 
    // NSLog (@"%@,%d",stock,row); 
UILabel *ticker = (UILabel *)[cell.contentView viewWithTag:1001]; 
ticker.text = stock[@"ticker"]; 

UILabel *dateAndTime = (UILabel *)[cell.contentView viewWithTag:1002]; 
dateAndTime.text = stock[@"dateAndTime"]; 



return cell; 

}

Я застрял на этом в течение 4 дней. Спасибо за помощь.

EDIT это метод GetData:

PFQuery *query = [PFQuery queryWithClassName:@"Stock"]; 
[query orderByDescending:@"createdAtEST"]; 
[query setLimit:25]; 
[query whereKey:@"live" equalTo:@"true"]; 

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 

    stocks = [NSMutableArray arrayWithArray:objects]; 
    for (int i = 0; i < stocks.count; i++){ 
     if (![stocks[i][@"sold"] boolValue]){ 
      [stocks removeObjectAtIndex:0]; 
      i--; 
     } 
     else{ 
      break; 
     } 
    } 

    for (int i = 0; i < stocks.count; i++){ 
     NSLog(@"%@",stocks[i][@"ticker"]); 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tableView reloadData]; 
    });   
}]; 
+0

также, когда я его отлаживаю. Я вижу, что данные, переданные каждой ячейке, верны. Может быть, я должен попытаться перерисовать клетки? Я пробовал сокет setNeedDisplay в cellForRowAtIndexPath, но ничего. –

+0

Вы вызываете 'reloadData' перед установкой данных, которые необходимо перезагрузить. –

+0

Что вы имеете в виду, задав данные? Как мне это сделать? –

ответ

0

Я установил его, установив макет раскадровки на любой x Любой

+0

Это не имеет смысла. Почему он работал до того, как после прокрутки. – SFF

+0

Я не уверен, но что-то с автозапуском –

0

Попробуйте позвонить [self getData]; в

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 

    [self getData]; 
} 

Кроме того, я хотел бы исправить cellForRow как этот

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *CellIdentifier1 = @"Cell1"; 
    static NSString *CellIdentifier2 = @"Cell2"; 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell; 

    if (indexPath.row == 0){ 

     cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1]; 
     if (cell == nil) { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier1]; 
     } 
     // Do your set up 
    } 
    else if (indexPath.row == 1) { 

     cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2]; 
     if (cell == nil) { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier2]; 
     } 
     // Do your set up 
    } 
    else { 

     cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     } 
     // Get data from your datasource 
     // Do your set up 
    } 

    return cell; 
} 
+0

Используя ваш метод, только видимые запасы были успешно загружены. Но, когда я прокручиваю вниз, все ячейки пусты. Только после прокрутки назад и затем вниз все данные появляются. –

+0

@LeonardoMurri Вы пытались вызвать 'getData' в' viewDidLoad' или 'viewDidAppear'? – SFF

+0

Да, я попробовал их все –

-1

Это в Swift Синтаксис , но я считаю, что те же атрибуты доступны.

На вашем Tableview, использовать атрибуты

tableview.beginupdates() и tableview.endUpdates()

Это должно обновить TableView динамически, без необходимости прокрутки. Предпочтительно добавлять их, когда новая ячейка вводится в представление таблицы. Надеюсь это поможет.

+0

Это ничего не делает ,,, –

0

Последняя строка в getData - это [self.tableView reloadData], а целая функция происходит в обратном потоке. Итак, я бы предположил, что вы пытаетесь манипулировать табличным представлением из двух потоков, что может привести к какой-то блокировке. Я бы удалил эту строку из getData или выполнил ее в основном потоке.

+0

Я сделал, такой же проблема. –

Смежные вопросы