2012-02-24 3 views
2

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

После этого, когда я пытаюсь перезагрузить табличное представление, нет. метода rows вызывается, но ячейка для 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]; 
} 

ответ

3

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

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

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

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

+0

Большое спасибо за объяснение. Я изменил приведенную выше строку на [tripTableView reloadData] и dont увидит любые изменения. Я отлаживал и обнаружил, что в самом первом методе я сохраняю некоторый результат в массиве rData, а метод reloadData вызывает no. строк, где я могу печатать содержимое из rData. Но он не вызывает cellForRowIndexPath, и если я просматриваю табличное представление, данных в массиве rdata вообще нет. – jeevangs

+0

Единственное объяснение, которое я вижу, это то, что таблица считает, что строки не должны отображаться. Вы возвращаете 1 из numberOfSections и 1 из numberOfRowsInSection, поэтому всегда должно отображаться 1 строка. Правильно ли установлено свойство 'rowHeight'? Не скрыта ли ячейка с помощью прокрутки? – Sulthan

+0

u r справа. Должна отображаться только 1 ячейка, и ячейка видна. Никаких проблем с этим. Моя единственная забота заключается в том, что ячейка для строки по указателю не получила правильное название. в любом случае, я попытаюсь выяснить, где я иду не так. Если вы встретитесь, пожалуйста, дайте мне знать. – jeevangs