У меня есть приложение, которое загружает данные из 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];
});
}];
также, когда я его отлаживаю. Я вижу, что данные, переданные каждой ячейке, верны. Может быть, я должен попытаться перерисовать клетки? Я пробовал сокет setNeedDisplay в cellForRowAtIndexPath, но ничего. –
Вы вызываете 'reloadData' перед установкой данных, которые необходимо перезагрузить. –
Что вы имеете в виду, задав данные? Как мне это сделать? –