Отображение нового представления при выборе строки в UITableView - PullRequest
1 голос
/ 06 июня 2009

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  UITableViewCell *targetCustomCell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];

  [tableView deselectRowAtIndexPath:indexPath animated:YES];
  NSLog(@"in didSelectRowAtIndexPath");

  ItemDetailsViewController *detailsController = [[ItemDetailsViewController alloc] initWithNibName:@"ItemDetailsView" bundle:nil];
  [self.navigationController pushViewController:detailsController animated:YES];
  [self.window addSubview:[detailsController view]];
  [detailsController release];
  detailsController = nil;
}

В контроллере ItemDetailsViewController у меня есть

- (void)viewDidLoad {
  [super viewDidLoad];
  NSLog(@"in ItemDetailsViewController.viewDidLoad ");
}

Я вижу обе строки журнала, но экран не меняется. Почему вид не меняется? Есть ли другой способ изменить вид?

Ответы [ 2 ]

4 голосов
/ 06 июня 2009

Что произойдет, если вы попытаетесь представить свой контроллер сведений, используя [selfsentModalViewController: detailsController animated: YES] вместо pushViewController контроллера навигации? Кроме того, добавление представления к окну не должно быть необходимым. Нажатие контроллера представления должно быть достаточно.

Попробуйте добавить NSLog ([описание self.navigationController]) и посмотрите, имеет ли self.navigationController значение nil. (Может случиться, если ваш текущий контроллер не является субконтроллером UINavigationController). Передача сообщения нулевому объекту просто молча завершается неудачей, поэтому есть большая вероятность, что проблема в этом.

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: обычно нет необходимости создавать подкласс UINavigationController. Проверьте эту страницу в документации Apple: Документы Apple: Использование контроллеров навигации Это объясняет настройку довольно хорошо. Если вы создаете свой «корневой» контроллер представления программно в делегате приложения, вам нужно сделать что-то вроде этого:

// set up main view controller
DrawingBrowserController *controller = [[DrawingBrowserController alloc] init];

// create a navigation controller that "wraps" the controller
navigationController = [[UINavigationController alloc] initWithRootViewController: controller];

[controller release];

// Add the navigation controller's view to the window
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];

По сути, вы «оборачиваете» свой корневой контроллер вида в контроллер навигации. Если вы используете Interface Builder, вы также можете настроить его там.

0 голосов
/ 06 июня 2009

Вы убедились, что ваш навигационный контроллер является корневым видом вашего окна? Обычно вы должны делать это следующим образом в методе applicationDidFinishLaunching:

[window addSubview:navigationController.view];    
[window makeKeyAndVisible];

Кроме того, вы должны удалить [self.window addSubview:[detailsController view]];, так как в этом нет необходимости.

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