pushViewController ничего не делает для didSelectRowAtIndexPath в UITableView - PullRequest
4 голосов
/ 16 сентября 2009

У меня есть UITableView, и я настроил didSelectRowAtIndexPath, который вызывается (я проверял это с помощью NSLog) каждый раз, когда пользователь нажимает на строку.

Однако я хочу перезагрузить тот же самый вид и изменить другие данные. Например, я отображаю содержимое каталога на удаленном веб-сервере, и как только пользователь нажимает на строку, я хочу перезагрузить представление и отобразить содержимое выбранного каталога (строки).

Я использую этот код:

FirstViewController *fvController = [[FirstViewController alloc] initWithNibName:@"MainWindow" bundle:[NSBundle mainBundle]];
 fvController.currentDirectory = currentDirectory;
 [self.navigationController pushViewController:fvController animated:YES];
 [fvController release];
 fvController = nil;

Однако это ничего не делает, и программа продолжает работать. Я предполагаю, что мне не хватает соединения в IB?

Ответы [ 3 ]

6 голосов
/ 16 сентября 2009

Причина, по которой ничего не происходит, заключается в том, что self.navigationController - это nil, возможно, потому, что вы никогда не устанавливали его. Ваши инстинкты хороши: когда «ничего не происходит», это почти всегда означает, что что-то является nil, и причина № 1 для того, чтобы быть nil, заключается в том, что вы не подключили это в IB.

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

FirstViewController *fvController = [[FirstViewController alloc] initWithNibName:@"MainWindow" bundle:[NSBundle mainBundle]];
fvController.currentDirectory = currentDirectory;

Я рекомендую что-то похожее на это:

FirstViewController *fvController = [[FirstViewController alloc] initWithDirectoryPath:currentDirectory];

Вам, конечно, нужно будет написать -initWithDirectoryPath:, чтобы позвонить -initWithNibName:bundle:. Это выдвигает имя NIB внутри контроллера представления, который управляет им, позволяет сделать -currentDirectory доступным только для чтения или личного доступа, чтобы никто не мешал ему за спиной контроллера представления, и, как правило, облегчает понимание и поддержку кода.

1 голос
/ 08 февраля 2011

Попробуйте сначала нажать RootViewController.

Например:

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootViewController]; 

[self.window addSubView:navController];

Затем сначала перейдите к RootViewController и нажмите на ViewController по вашему желанию, так что свойство ViewController 'navigationController' не будет равно нулю.

0 голосов
/ 17 сентября 2009

Спасибо за ваши предложения, Роб. Оказалось, что мне нужно было СОЗДАТЬ ЧИСТОТУ (из меню сборки), а затем собрать проект. По какой-то причине XCODE не обнаружил связь между моим tableView и элементом UI, и его значение было NIL.

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