Просмотр таблицы nil / not update

У меня есть табличное представление только с одной ячейкой. Когда я вызываю метод, я пытаюсь его обновить, и текст текстовой метки должен измениться. Однако это не так, оно меняется только в том случае, если отображается представление re.

Я добавил NSLog() во многих местах и ​​выработаны правильные методы и условия

Я пробовал несколько вещей:

 reloadData setNeedsDisplay setNeedsLayout reloadCell reloadRowsAtIndexPaths: withRowAnimation: 

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

Это самый подходящий код, который я могу вам дать:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { tableView.scrollEnabled = NO; UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier: @"cell"]; if (cell) { cell.selectionStyle = UITableViewCellSelectionStyleNone; if ([[TravelLogViewController locationArray] count]) { NSDictionary *flight = [NSDictionary dictionaryWithObjectsAndKeys:[[TravelLogViewController locationArray] lastObject], @"name", [[TravelLogViewController dateArray] lastObject], @"date", [[TravelLogViewController milesGainedIndex] lastObject], @"miles", nil]; cell.detailTextLabel.textColor = [UIColor blackColor]; cell.textLabel.numberOfLines = 2; cell.detailTextLabel.numberOfLines = 2; cell.textLabel.font = [UIFont fontWithName:@"Avenir" size: 14.0]; cell.detailTextLabel.font = [UIFont fontWithName:@"Avenir" size: 12.0]; cell.selectionStyle = UITableViewCellSelectionStyleNone; cell.textLabel.text = [flight objectForKey: @"name"]; cell.detailTextLabel.text = [NSString stringWithFormat:@"Flight Date: %@, Miles Gained: %.1f", [flight objectForKey: @"date"], [[flight objectForKey: @"miles"] doubleValue]]; cell.backgroundColor = [UIColor colorWithWhite:0.92 alpha:1]; // cell.backgroundColor = [UIColor clearColor]; } else { // This gets called when I want it to, but the textLabel text or detailTextLabel text is not changed cell.detailTextLabel.text = nil; cell.textLabel.text = nil; cell.textLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size: 18.0]; cell.textLabel.text = @"\n\n No Flights"; } } return cell; } 

ОБНОВИТЬ:

Я использую ARC, и я обнаружил, что представление таблицы равно нулю в то время, когда я пытаюсь обновить ячейку, но я пересмотрел свою ячейку и не знаю, почему !?

Я не собираюсь или не откладываю просмотр таблицы в любом месте, он все равно должен быть выделен

Кстати, у меня есть контроллер панели вкладок

ОБНОВИТЬ:

Я начал щедрость сейчас, через неделю, и я действительно чувствую, что этот вопрос требует больше внимания и ответов, я проверил свой код несколько раз, и я не понимаю, почему табличное представление не обновляется / равно nil .

ОБНОВИТЬ:

Хорошо, я забыл упомянуть, что пользователь может пролистнуть, чтобы удалить ячейку. Когда он это делает, он фактически не удаляет ячейку, она просто меняет свой текст (это часть, которую он не обновляет). Я поместил журналы в viewDidLoad и viewDidAppear и представление таблицы будет действительным, как только пользователь проведет удаление … вот мой код:

 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { TravelLogViewController *travel = [[TravelLogViewController alloc] init]; [travel manuallyDeleteTopCellData]; // Deletes some data in other view controller and calls the method `proceedWithDeletion` } } - (void)proceedWithDeletion { // Method is called from another view controller NSLog(@"%@", mostRecentFlight.description); // NIL HERE [mostRecentFlight reloadData]; [mostRecentFlight setNeedsDisplay]; [mostRecentFlight setNeedsLayout]; } 

TravelLogViewController

 - (void)manuallyDeleteTopCell { [TheMileIndexViewController deductDesiredMilesToIndex: [[milesGainedIndex lastObject] floatValue]]; [locationArray removeLastObject]; [milesGainedIndex removeLastObject]; [dateArray removeLastObject]; MenuMileIndexViewController *menu = [[MenuMileIndexViewController alloc] init]; [menu proceedWithDeletion]; } 

Итак, чтобы подвести итог, один вид загружается / появляется, представление таблицы действительно. Когда пользователь выполняет удаление, он фактически не удаляет строку, которую он просто вызывает другой контроллер представлений, называемый методом TravelLogViewController называемый TravelLogViewController где он удаляет некоторые данные, этот метод затем вызывает другой метод в моем исходном контроллере представления, называемом proceedWithDeletion где он должен перезагружать представление таблицы, но не (проблема). Причина этого в том, что в proceedWithDeletion с точки зрения таблицы вид таблицы равен нулю, но почему !?

Этот код может быть источником вашей проблемы:

 MenuMileIndexViewController *menu = [[MenuMileIndexViewController alloc] init]; [menu proceedWithDeletion]; 

Вы создаете совершенно новый MenuMileIndexViewController , не обращаясь к уже существующему экземпляру, который, как я полагаю, вы хотите сделать. Этот новый экземпляр не будет иметь доступ к исходному представлению таблицы, хранящемуся в mostRecentFlight . Внутри -manuallyDeleteTopCell вам понадобится ссылка на вызывающий экземпляр MenuMileIndexViewController .

Это может быть так же просто, как передать self -manuallyDeleteTopCellData и использовать эту переменную для последующего вызова -proceedWithDeletion on. Например:

 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { TravelLogViewController *travel = [[TravelLogViewController alloc] init]; [travel manuallyDeleteTopCellData:self]; } } - (void)manuallyDeleteTopCell:(id)sender { [TheMileIndexViewController deductDesiredMilesToIndex: [[milesGainedIndex lastObject] floatValue]]; [locationArray removeLastObject]; [milesGainedIndex removeLastObject]; [dateArray removeLastObject]; // MenuMileIndexViewController *menu = [[MenuMileIndexViewController alloc] init]; [sender proceedWithDeletion]; } 

Это слепой выстрел без кода, но если вы используете dequeueReusableCellWithIdentifier , это может вызвать проблему. Если у вас есть одна ячейка, вы можете создавать ее каждый раз в своем cellForRowAtIndexPath вместо повторного использования уже созданного. Не будет влиять на производительность с такой крошечной таблицей

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

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

 BOOL toggle = NO; - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier: @"cell"]; if (cell) { cell.selectionStyle = UITableViewCellSelectionStyleNone; if (toggle ) { NSDictionary *flight = @{@"name" : @"Bob", @"date" : @"Yesterday", @"miles" : @"3" }; cell.textLabel.text = [flight objectForKey: @"name"]; cell.textLabel.numberOfLines = 2; cell.detailTextLabel.numberOfLines = 2; cell.detailTextLabel.textColor = [UIColor blackColor]; cell.detailTextLabel.text = [NSString stringWithFormat:@"Flight Date: %@, Miles Gained: %.1f", [flight objectForKey: @"date"], [[flight objectForKey: @"miles"] doubleValue]]; } else { cell.textLabel.text = @"blank label"; cell.detailTextLabel.text = @"blank detail"; } } return cell; } - (IBAction)toggleValue:(id)sender { toggle = !toggle; NSLog( @"toggle is now %@", (toggle) ? @"YES" : @"NO" ); [tv reloadData]; } 

tableView:cellForRowAtIndexPath: логическое значение в tableView:cellForRowAtIndexPath: и используя предоставленный вами код, вы можете видеть, что строки (ы) действительно обновляют, как ожидалось, когда [table reloadData] .

Вы можете скачать образец проекта здесь (35KB): http://rdas.me/SampleProject.zip

Надеюсь, что это поможет вам. Если ничто другое не поможет вам изолировать, где проблема может быть на самом деле.

Удачи!

В вашей реализации TravelLogViewController в TravelLogViewController вы MenuMileIndexViewController новый MenuMileIndexViewController :

 MenuMileIndexViewController *menu = [[MenuMileIndexViewController alloc] init]; [menu proceedWithDeletion]; 

Это другой контроллер и не является должным образом инициализирован и не отвечает за представление на экране. В частности, у него нет такого же свойства mostRecentFlight . Чтобы TravelLogViewController вызывал ваш исходный контроллер, вам нужно передать его как параметр в manuallyDeleteTopCell и вызвать его обратно, например, следующим образом

 - (void)manuallyDeleteTopCell:(MenuMileIndexViewController *)origin { [TheMileIndexViewController deductDesiredMilesToIndex: [[milesGainedIndex lastObject] floatValue]]; [locationArray removeLastObject]; [milesGainedIndex removeLastObject]; [dateArray removeLastObject]; [origin proceedWithDeletion]; } 

И перепишите код вызова следующим образом:

 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { TravelLogViewController *travel = [[TravelLogViewController alloc] init]; [travel manuallyDeleteTopCellData:self]; } 

Предыдущие предложения:

  1. Убедитесь, что вы правильно установили розетку в Interface Builder. Вы говорите в комментарии, что вы это сделали, но в другой момент вы говорите, что используете контроллер панели вкладок. Убедитесь, что вы устанавливаете розетку на обычном контроллере просмотра (т. UIViewController Подклассе UIViewController ), который в настоящее время отображается и содержится в свойстве UITabBarController экземпляра UITabBarController вы используете. Не подклассифицируйте UITabBarController (см. Документацию Apple, которая явно запрещает ее). [ПРОВЕРЕНО]

  2. viewDidLoad метод viewDidLoad обычного контроллера представления и NSLog свойство self.tableView чтобы убедиться, что он не равен nil во время self.tableView этого метода. [ПРОВЕРЕНО]

  3. Напишите @synthesize mostRecentFlight = _mostRecentFlight; в @implementation TravelLogViewController и установить TravelLogViewController останова на свойстве в @interface . Кроме того, вручную реализовать метод setMostRecentFlight: для свойства mostRecentFlight и установить mostRecentFlight останова внутри этого метода. Эта точка останова будет вызываться, если вызывается сеттер, который поможет вам найти время, когда свойство установлено на nil .

  4. Предполагая, что свойство свойство не равно nil в методе viewDidLoad на шаге 2, просмотрите адрес объекта (начало описания, которое говорит (UITableView *) $1 = 0xXXXXXXXX где 0xXXXXXXXX является адресом). Установите точку останова, в которой вы хотите использовать объект позже в своем коде (когда свойство равно нулю). Введите в отладчик po 0xXXXXXXXX (с соответствующим адресом сверху). Какой ответ вы получаете?

Обычно я использую этот код:

 [_myTable beginUpdates]; [... update my cell, adding / removing / changing them ...]; [_myTable endUpdates]; 

Он работает с моими проектами с версии 5.0.

Согласно вашему комментарию, переменная tableView вы назвали reloadData on, была reloadData nil .

Общими причинами этого являются отсутствие ссылок на IBOutlet в случае использования ниба, слабых иваров с ARC или маскировки ivar с локальной переменной с тем же именем.

Я не могу найти что-то не так в вашем коде. Однако, пожалуйста, убедитесь, что вы установили источник данных в виде таблицы и делегировали (нужно установить где-нибудь в viewDidLoad / viewDidAppear / viewWillAppear):

 [tableView setDelegate:self]; [tableView setDataSource:self]; 

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

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [yourDataSource count]; } 

удачи!

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

- (UITableViewCell *)tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath )indexPath {

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PlayerCell"]; Player *player = [self.players objectAtIndex:indexPath.row]; cell.textLabel.text = player.name; cell.detailTextLabel.text = player.game; return cell; 

}

  • Что делает этот вид декларации параметров сигналом (быстрым)?
  • Есть ли способ полностью отключить приложение от iCloud?
  • Как автоматически создавать методы, такие как ViewDidLoad
  • Я пытаюсь интегрировать framework / kernel в простой файл .h и .m в ios?
  • NSString возвращает пустое значение из метода возврата
  • Ошибка прокрутки UITextView iOS9 xcode 7.1.1
  • Открытая анимация для изображения в UITableView в быстрой
  • iOS Swift Core Data генерирует NSManagedObject с пространством имен проектов
  • Xcode 6 Просмотр Отладка недоступна
  • IOS / Обновление до Xcode 8.3, вызывающее ошибки pngcrush libpng
  • Перемещение из одного текстового поля в другое во время следующей кнопки Нажмите в виртуальной клавиатуре
  • Interesting Posts

    Создайте библиотеку CocoaPods из репозитория openource

    UIPopoverPresentationController, показывающий полноэкранное модальное всплывающее окно

    Захват / сегментирование видео на iOS и воссоединение через HLS приводит к отключению звука

    animationWithFrame сбой в iOS 9.2.1

    Значение iphonesdk, удаляемое из атрибута с учетом плохого доступа

    Выполнить метод после задержки и отменить его

    Используйте AVFoundation для добавления изображения в видео, но уровень изображения не отображается правильно

    Любой способ управлять Quad LED индивидуально в iOS swift?

    Устранение пробела на UINavigationBar между левой частью панели и элементом leftBarButtonItem

    Что следует заменить CCTexture2D initWithImage?

    Являются ли отношения основных данных в реальном мире?

    Как избежать первоначального вызова viewWillAppear

    Отладчик Xcode 6.2 отсоединяется от устройства при сбое приложения

    ios7: Пользовательский стиль Push segue pre iOS7 почти работает

    Как объявить определения с экспоненциальным

    Давайте будем гением компьютера.