EXEC_BAD_ACCESS после повторной загрузки UIViewController, содержащего UITableView - PullRequest
1 голос
/ 14 мая 2009

Я получаю EXEC_BAD_ACCESS при выполнении следующих шагов:

ШАГ 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 значениями. Проблемный!

Приложение вылетает перед отображением экрана Score (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 не был правильно выпущен в первый раз? Любое понимание будет полезно. Спасибо за ваше драгоценное время.

Ответы [ 2 ]

1 голос
/ 14 мая 2009

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

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

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

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

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

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

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

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

1 голос
/ 14 мая 2009

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

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