uitableView reloadData не работает после установки соединения делегата, источника данных и владельца файла - PullRequest
2 голосов
/ 25 февраля 2012

Я погуглил и провел много исследований со своей стороны, чтобы выяснить, почему метод reloadData для tableview не будет работать.Я проверил все возможные решения, такие как источник данных установлен, делегат установлен, таблица подключена к владельцу файла.

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

- (void)onReservationListSuccess:(NSArray *)rData
 {
if ( rData != nil )
{
    resList = [[NSArray alloc] initWithArray:rData];

    if([resList count] > 0)
    {
        [self.tripsTableView reloadData];
        //[self.tripsTableView beginUpdates];
        //[self.tripsTableView reloadSections:[NSIndexSet indexSetWithIndex:0]
          //            withRowAnimation:UITableViewRowAnimationNone];
        //[self.tripsTableView endUpdates];
    }
    else
    {
        [tripsTableView reloadData];
        [tripsTableView setHidden:YES];
        [noTripsLabel setHidden:NO];
    }
}

if(fsnNeedsRefresh == YES)
{
    [[NSNotificationCenter defaultCenter] postNotificationName:UpdateFSNList object:nil];
    fsnNeedsRefresh = NO;
}
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
  {
   return 1;
  }

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
 {
int temp=[resList count];
NSLog(@"The no. of rows are %d", temp);
NSLog(@"Testing Purpose");
NSLog(@"The pnr details of the object is:%@",((TripData *)[resList objectAtIndex:0]).pnrDescription);
return 1;
 }


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
  NSLog(@"The cell for the row at indexpath is getting called");
static NSString *CellIdentifier = @"TripCellIdentifier";

TripCell *cell = (TripCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) 
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TripCell" owner:self options:nil];

    for(id oneObject in nib)
        if([oneObject isKindOfClass:[TripCell class]])
            cell = (TripCell *)oneObject;
}

// Set up the cell...
TripData *tripData = (TripData *)[resList objectAtIndex:indexPath.row];
cell.pnrLabel.text = tripData.pnr;
NSLog(@"The cell text is %@",tripData.pnr);
cell.pnrDescriptionLabel.text = tripData.pnrDescription;
NSLog(@"The cell text is %@",tripData.pnrDescription);
cell.pnrTypeLabel.text = tripData.pnrType;
NSLog(@"The cell text is %@",tripData.pnrType);

if(checkInAllowed)
{
    cell.checkInButton.tag = indexPath.row;
    [cell.checkInButton addTarget:self action:@selector(checkIn:) forControlEvents:UIControlEventTouchUpInside];
}
else
{
    [cell.checkInButton setEnabled:NO];
}

return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
// Navigation logic may go here. Create and push another view controller
TripData *tripData = (TripData *)[resList objectAtIndex:indexPath.row];

NSLog(@"%@", tripData.pnr);

if(tripData != nil)
{
    TripOverviewViewController *tripOverviewViewController = [[TripOverviewViewController alloc] initWithTrip:tripData];
    [self.navigationController pushViewController:tripOverviewViewController animated:YES];
    [tripOverviewViewController release];
}

[tableView deselectRowAtIndexPath:indexPath animated:NO];
}

1 Ответ

3 голосов
/ 25 февраля 2012

Из этой части кода я не могу точно сказать, почему это не работает, но я попытаюсь объяснить, как работает reloadData.

Во-первых, как работает UITableView: в основном, это прокрутка.Когда он рисуется, он проверяет, сколько строк у него есть, затем проверяет их высоту, а по размеру и позиции прокрутки решает, какие строки отображаются в данный момент.Затем он просит делегата вернуть UITableViewCell для каждой отображаемой строки.Когда таблица прокручивается, она удаляет скрытые ячейки из иерархии представления и добавляет появившиеся ячейки.

А теперь сложная часть - что делает reloadData?Он просто удаляет все UITableViewCell s из иерархии таблиц.Ничего более.Фактическое обновление выполняется, когда таблица рисуется впервые после reloadData.

Итак, я предлагаю - проверить, что ваша таблица не скрыта, и проверить ее фрейм.Кроме того, я вижу, что вы получаете доступ как к получателю свойства self.tripsTableView, так и к ивару tripsTableView.Это смущает.Они оба возвращают то же самое?

...