UITableView не перезагружается правильно

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

Я использую [table reloadData] для перезагрузки таблицы в методе viewDidAppear:, поскольку он не работал в методе viewDidAppear:, а в другом случае я поместил его в действие кнопки.

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [contactsTableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    UILabel *label = (UILabel *)[cell viewWithTag:1001];
    label.text = [Array3 objectAtIndex:indexPath.row];

    return cell;
}

РЕДАКТИРОВАТЬ

Я объявляю массив ниже реализации, например: NSMutableArray * Array3; После этого в методе ViewDidLoad объявляю остаток массива: Array3 = [NSMutableArray arrayWithObjects: nil]; Затем я загружаю элементы в массив, вызывая функцию в методе ViewDidLoad, чтобы заполнить массив элементами.

РЕДАКТИРОВАТЬ 2 Показывая больше о том, как я заполняю массив - (void)viewDidLoad {

[super viewDidLoad];
Array3 = [NSMutableArray arrayWithObjects: nil];
 [self loadArray];

}
- (void) loadArray
//populate array in here.
// I use the add object method
//  [Array3 addobject:object];
{

person Lehman2020    schedule 10.07.2015    source источник
comment
Где вы загружаете/определяете/заполняете Array3? Ваше описание подсказывает мне, что источник данных заполняется асинхронно и не готов, когда вы впервые показываете контроллер представления.   -  person Brad Brighton    schedule 10.07.2015
comment
Я определяю его ниже своей реализации в файле .m. Вы знаете, как я могу это исправить?   -  person Lehman2020    schedule 10.07.2015
comment
Я не могу тебе сказать, потому что ты этого не показываешь. :-) Как этот массив получает элементы?   -  person Brad Brighton    schedule 10.07.2015
comment
Пожалуйста, проверьте предложение Я использую [table reloadData] для перезагрузки таблицы в методе viewDidAppear:, так как это не сработало в методе viewDidAppear: и в другом случае я поместил его в действие кнопки., особенно ваш viewDidAppear комментарий.   -  person SwiftArchitect    schedule 10.07.2015
comment
Затем я загружаю элементы в массив, вызывая функцию в методе ViewDidLoad, чтобы заполнить массив элементами. Это никому не говорит о том, как вы загружаете массив (например, является ли он синхронным или нет). Покажите метод, который вы вызываете внутри viewDidLoad. Покажите свой метод viewDidLoad, чтобы мы могли видеть, где вы вызываете метод, который загружает массив.   -  person Brad Brighton    schedule 10.07.2015
comment
Бред, я отредактировал свой пост.   -  person Lehman2020    schedule 10.07.2015
comment
Как насчет запуска [contactsTableView reloadData]; после [self loadArray]; в представленииDidLoad?   -  person HMHero    schedule 10.07.2015


Ответы (4)


  1. Сначала хорошие новости: ваш метод cellForRowAtIndexPath верен.

  2. Нет необходимости вызывать reloadData ни в -viewDidAppear:, ни в -viewWillAppear. Это замечание может оказаться неверным, если вы измените содержимое Array3, когда ваше представление закрыто, что является особым случаем.

Дело не в том, где вы определяете свой метод, а в том, где вы его вызываете. Разумным местом для заполнения содержимого Array3 является

required init(coder aDecoder: NSCoder!)

or

override func viewDidLoad()

Подводные камни

Кроме того, вам нужно, чтобы все ваши методы делегата (numberOfSectionsInTableView, numberOfRowsInSection, cellForRowAtIndexPath) возвращали согласованные значения в соответствии с вашим массивом. Простой метод состоит в том, чтобы использовать количество записей в массиве для управления numberOfRowsInSection.

Когда использовать reloadData?

Типичное использование reloadData показано ниже:

- (void)loadArray {
    //populate array in here.
    ...
    [self.tableview reloadData]; // Possibly postpone to main thread
}
person SwiftArchitect    schedule 10.07.2015
comment
Не могли бы вы расширить требуемую инициализацию (coder aDecoder: NSCoder!)? Я никогда не видел этого раньше (я использую Obj-C) - person Lehman2020; 10.07.2015
comment
Извините, я пытался заполнить свой массив методом -(void)loadView, но не могу заставить его работать. Теперь таблица вообще не отображается, когда я помещаю код в этот метод, а не в ViewDidLoad. Есть ли что-то, что я должен делать внутри ViewDidLoad? - person Lehman2020; 10.07.2015
comment
Спасибо! Это мне очень помогло, так как я исправил свою проблему - person Lehman2020; 10.07.2015

Дайте уникальный идентификатор ячейки, например, вы можете

NSString *cellIdentifier =[NSString stringWithFormate:@"%d",indexPath.row];

Может быть, это поможет вам...

person Mubin Mall    schedule 10.07.2015

Я думаю, что Array3 равно нулю при первой загрузке.

person iPeta    schedule 10.07.2015
comment
Да, изначально он равен нулю, но я заполняю его объектами в методе ViewDidLoad сразу после настройки массива. Я отредактировал свой пост, чтобы отразить это - person Lehman2020; 10.07.2015

Я считаю, что при начальной настройке Array3 вы должны выделить эту переменную в память, чтобы затем использовать ее в другой функции, например tableView:cellForIndexPath:

Поэтому вместо Array3 = [NSMutableArray arrayWithObjects: nil]; вы должны использовать Array3 = [[NSMutableArray alloc] init];

Поскольку вы оставляете его пустым массивом в этой строке кода, вы не будете использовать [[NSMutableArray alloc] initWithObjects: nil];, потому что это буквально одно и то же.

person ErickES7    schedule 10.07.2015