2009-05-14 5 views
1

я получаю EXEC_BAD_ACCESS при выполнении следующих шагов:EXEC_BAD_ACCESS при повторной загрузке UIViewController, содержащий UITableView

ШАГ 1: Нажмите на кнопку «Множества» из главного меню: Это удаление меню (UIView) и загружает результаты (UIView), которые впоследствии инициируют процесс заполнения UITableView со значениями. Здесь нет проблем.

  self.viewController4 = [[ScoresViewController alloc] initWithNibName:@"ScoresViewController" bundle:nil]; 
     [window addSubview:viewController4.view]; 
     [viewController.view removeFromSuperview]; 
     NSLog(@"LOADING SCORES SCREEN"); 

ШАГ 2: Нажмите на кнопку "меню" из экрана набрано: Это Удаляет результаты (UIView), и загружает меню (UIView) еще раз. Здесь нет проблем.

self.viewController = [[MainMenuViewController alloc] initWithNibName:@"MainMenuViewController" bundle:nil]; 
     [window addSubview:viewController.view]; 
     [viewController4.view removeFromSuperview]; 
     NSLog(@"Loading MAIN MENU"); 

ШАГ 3: Нажмите на кнопку «Счета» снова в главном меню: Опять же, это удаление меню (UIView), и загружает результаты (UIView), который впоследствии может инициировать процесс заполнения UITableView со значениями. Проблемный!

Приложение вылетает перед отображением экрана оценки (UIView). Используя отладчик, я проследил проблему до одной строки кода: cell.text = [self-> theScoresArray objectAtIndex: indexPath.row]; появляется в ниже рутина:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [theTable dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) 
{ 
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
} 
cell.text = [self->theScoresArray objectAtIndex:indexPath.row]; 
return cell; 
} 

Может ли это быть проблема с объектом indexPath не будучи должным образом выпущен в первый раз? Любое понимание было бы полезно. Спасибо за ваше драгоценное время.

ответ

1

Я думаю, что ваши проблемы лежат с использованием UIWindow ...

Вы не должны удалить/добавить мнение непосредственно к экземпляру UIWindow в вашем приложении.

Если вы планируете отображать более одного вида вы должны либо:

  1. Используйте UINavigationController или UITabViewController.
  2. Добавить и удалить subviews в UIView в вашем одиночном вид приложения.

UIApplication должен знать, кто на экране точка зрения и некоторые сообщения делегата могут быть потеряны, если вы не используете эти шаблоны (т.е. viewDidLoad, viewDidDisappear и т.д ..).

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

Похоже, что в вашем случае вы должны использовать UINavigationController, а также нажать и отобразить контроллеры представлений. Он управляет всей инициализацией и кэшированием и освобождением от вас. Это должно привести к меньшему количеству проблем.

Может показаться, что вы можете «катить себя», но борьба с SDK может быть сложнее, чем научиться использовать его соглашения.

+0

Вы были верны. Я пересмотрел свою структуру управления View, и проблема исчезла. Однако проблема в том, что это все еще загадка. Я ценю помощь. Благодарю. – RexOnRoids

+0

не проблема, это трудный урок. Apple делает много «за кулисами» с UIViewController, что заставляет вас использовать их соглашения. –

1

Вышел ли «theScoresArray» перед тем, как вы снова нажмете кнопку «Счет»? Наведите указатель мыши на «theScoresArray» и посмотрите, есть ли у него значения.

+0

Да, «theScoresArray» выпущен до удаления UIView из Superview. Могу ли я ошибиться при удалении просмотров из окна и добавлении их при каждом переключении экрана? UITableView содержится в UIScrollView, который принадлежит UIView. Я просто использую подкласс UIViewController, чтобы напрямую поговорить с указанным UITableView. – RexOnRoids

+0

Вам нужно добавить значение для «theScoresArray» после добавления subview для окна. [window addSubview: viewController4.view]; viewController4.theScoresArray = ... –

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