UITableView не обновлен - PullRequest
       4

UITableView не обновлен

2 голосов
/ 31 января 2012

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

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

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

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

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

Справочная информация: Табличное представление заполняется из словаря: appDelegate.currentFave. Табличное представление должно обновляться каждый раз, когда ViewBontroller вызывается 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;    
}

Ответы [ 4 ]

1 голос
/ 17 февраля 2012

Я нашел проблему. Я не правильно инициализировал и присваивал 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 голосов
/ 31 января 2012

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

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

0 голосов
/ 31 января 2012

Вы должны убедиться, что ваши соединения 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 голосов
/ 31 января 2012

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

...