2012-01-31 3 views
2

У меня есть приложение, состоящее из TabBar с несколькими TabBarControllers. Один контроллер содержит очень простую таблицу, которая должна отображать содержимое NSMutableDictionary. Когда вы нажмете соответствующую кнопку, словарь обновится в отдельном контроллере, и представление переключится на UITableViewController, отображая новую обновленную таблицу.UITableView не обновляется

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

Я попытался [self table.reloadData], и пока он вызван, изменения не отражаются на UITableView.

Есть ли у кого-нибудь предложения? Я рад опубликовать код, но я не уверен, что делать.

Обновление: таблица обновляется и обновляется должным образом только в первый раз, когда она отображается. Последующие дисплеи просто показывают исходное содержимое.

Фон: Табличное изображение заполняется из словаря: appDelegate.currentFave. Табличное представление должно обновляться каждый раз, когда ViewController вызывается TabBarController.

- (void)viewWillAppear:(BOOL)animated 
{ 
    NSLog(@"in viewWillAppear"); 

    [super viewWillAppear:animated]; 

    [self loadFavesFile]; 
    [self.tableView reloadData]; 
} 

// load the Favorites file from disk 
- (void) loadFavesFile 
{ 
// get location of file 
NSString *path = [self getFavesFilePath]; 

// The Favorites .plist data is different from the Affirmations in that it will never be stored in the bundle. Instead, 
// if it exists, then use it. If not, no problem. 
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { 

    // read Faves file and store it for later use... 
    NSMutableDictionary *tempDict = [NSMutableDictionary dictionaryWithContentsOfFile:path]; 
    appDelegate.sharedData.dictFaves = tempDict;  

    // grab the latest quote. Append it to the list of existing favorites 
    NSString *key = [NSString stringWithFormat:@"%d", appDelegate.sharedData.dictFaves.count + 1]; 

    NSString *newFave = [NSString stringWithFormat:@"%@", appDelegate.currentFave]; 
    [appDelegate.sharedData.dictFaves setObject:newFave forKey:key]; 

} else { 
    NSLog(@"Favorites file doesn't exist"); 
    appDelegate.sharedData.dictFaves = nil;  
} 
} 


// this gets invoked the very first call. Only once per running of the App. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
// reuse or create the cell 
static NSString *cellID = @"cellId"; 
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellID]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID]; 
} 

// allow longer lines to wrap 
cell.textLabel.numberOfLines = 0; // Multiline 
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; 
cell.textLabel.font = [UIFont fontWithName:@"Chalkduster" size:(16)]; 
cell.textLabel.textColor = [UIColor yellowColor]; 

// NOTE: for reasons unknown, I cannot set either the cell- or table- background color. So it must be done using the Label. 

// set the text for the cell 
NSString *row = [NSString stringWithFormat:@"%d", indexPath.row + 1]; 
cell.textLabel.text = [appDelegate.sharedData.dictFaves objectForKey:row]; 
return cell;  
} 

ответ

1

Я нашел проблему. Я неправильно инициализировал и назначил TableView в моем контроллере.См. Ниже

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]  style:UITableViewStylePlain]; 

    tableView.dataSource = self; 
    tableView.delegate = self; 
    tableView.backgroundColor=[UIColor blackColor]; 
    self.view = tableView; 
} 
0

Предполагая, что код, который вы поставили правильно, вы хотите использовать [self.table reloadData]. У вас есть . не в том месте.

+0

Опечатка с моей стороны. Извиняюсь. – Bassman

+0

Это должен быть комментарий, а не ответ –

0

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

Попробуйте войти в конструктор интерфейсов и щелкните правой кнопкой мыши владельца файла, это должно показать вам, если что-то не подключено должным образом.

+0

Я использую раскадровки, поэтому нет владельца файла. Но щелчок правой кнопкой мыши на контроллере просмотра показывает, что datasource & datadelegate установлены в UITableView. Это правильно, верно. – Bassman

0

Вы должны убедиться, что ваши соединения Interface Builder настроены правильно, но то, что эта проблема действительно звучит как то, что у вас есть UITableViewCell код установки в cellForRowAtIndexPath: внутри if(cell == nil) заявления. Который не должно быть. Позволь мне объяснить. Если у вас есть список ячеек, и вы хотите установить заголовки в каждую ячейку строки в массиве с именем myArray, прямо сейчас ваш (неправильный) код выглядит следующим образом:

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"]; 
    if (cell == nil) { 
     // No cell to reuse => create a new one 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cellIdentifier"] autorelease]; 

     [[cell textLabel] setText:[myArray objectAtIndex:[indexPath row]]]; 
    } 
    return cell; 
} 

Вы можете увидеть проблему с этой логикой? Ячейка получит только обновленный заголовок, если не будет найдена повторно используемая ячейка, которая в вашем случае будет похожа на ситуацию. Apple говорит, что вы должны создавать «новую» ячейку каждый раз, когда вызывается cellForRowAtIndexPath:, что означает, что вы установили весь свой код установки за пределами из if(cell == nil).

Продолжая этот пример, правильный код будет выглядеть следующим образом:

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"]; 
    if (cell == nil) { 
     // No cell to reuse => create a new one 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cellIdentifier"] autorelease]; 
    } 

    [[cell textLabel] setText:[myArray objectAtIndex:[indexPath row]]]; 
    return cell; 
} 

Таким образом, клетка получает назначение надлежащей строки ли не найдена многоразовая клетка и поэтому вызов reloadData будет иметь желаемый эффект.

+0

@ Rickay Я проверил свой код и назначил ячейку, как вы предлагаете. Есть ли что-то еще, что я ищу? Должен ли я размещать код? – Bassman

+0

Да, вы должны обязательно показать нам проблемный код –

+0

Я разместил часть своего кода выше, чтобы мы могли обсудить ..... – Bassman

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