Не могу понять, как использовать UINavigationControllerDelegate и pushViewController вместе в UIViewController - PullRequest
0 голосов
/ 07 марта 2012

У меня есть UIViewController, который соответствует нескольким делегатам - показано ниже:

@interface SpotController : UIViewController <UITabBarDelegate, UITableViewDelegate, UITableViewDataSource, MKMapViewDelegate, UIActionSheetDelegate, UINavigationControllerDelegate>

По какой-то причине часть NavigationControllerDelegate не работает.Я не уверен, что я делаю неправильно.В основном я пытаюсь нажать на новый ViewController, когда строка tableView выбран.У меня есть следующий код:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    NSIndexPath *selectedIndexPath = [tableView_ indexPathForSelectedRow];

    // do some stuff here to prep/set stuff on the destination VC

    DetailsVC *detailsVC = [self.storyboard instantiateViewControllerWithIdentifier:@"detailsVC"];
    [self.navigationController pushViewController:detailsVC animated:YES];
}

Итак, как я уже сказал, pushViewController не работает, то есть я не отправляюсь на целевой VC.Я просто не пойду никуда.

Примечание: этот точный код работал отлично, если я вставлял ViewController в NavigationController (IE Выберите VC в StoryBoard, затем Editor | Embed In | Navigation Controller). но я не хочу делать это таким образом .

Я также попытался создать @property типа UINavigationController, а затем распределить-инициализировать его в viewDidLoad.Я попробовал оба варианта init и initWithRootViewController:self этого метода, но ни один из них не работал.Не уверен, что я вообще все делаю правильно.

Возможно, мне нужно явно указать @property в качестве делегата?Не знаю, как это сделать, я пытался сделать следующее:

@synthesize navController = navController_;
- (void)viewDidLoad
{
    [super viewDidLoad];        
    navController_ = [[UINavigationController alloc] init]; // initWithRootViewController:self];
    [navController_ setDelegate:self];
}

Но все равно ничего.

PS - я использую Xcode 4.3 с ARC и раскадровкой.

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Вы не можете попросить навигационный контроллер выдвигать новые контроллеры представления, если его нет на экране.

Примечание. Этот точный код работал отлично, если я вставлял ViewController в NavigationController (IE Выберите VC в StoryBoard, затем Editor | Embed In | Navigation Controller). но я не хочу делать это таким образом .

Таким образом, ваш контроллер навигации существует и находится на экране.Почему вы не хотите делать это таким образом?

Я также попытался создать @property типа UINavigationController, а затем распределить-инициализировать его в viewDidLoad.Я пробовал как init, так и initWithRootViewController: собственные версии этого метода, но ни один из них не работал.Не уверен, что я все делаю правильно.

Это не сработает, поскольку навигационный контроллер не контролирует то, что на экране, он просто существует в памяти.

Короче говоря, вы не можете вставлять контроллеры представления в стек навигации и выключать его, если у нет активного стека навигации , и без встраивания вашего виртуального контейнера в контроллер навигации вы не сможетеИмеется.Пересмотрите свой дизайн.Вы должны встроить свой VC в контроллер навигации, если хотите использовать функции контроллера навигации.

1 голос
/ 07 марта 2012

Две мысли:

  • Во-первых, установите точку останова и пройдитесь по коду, чтобы убедиться, что экземпляр detailsVC создается правильно.Если detailsVC не создается, вы можете попытаться использовать / инициализировать detailsVC вместо использования раскадровки (кстати, я никогда не использовал раскадровку, поэтому я не знаю последствий этого).

  • Два, проверьте и убедитесь, что self.navigationController действительно возвращает объект.Опять же, вы должны установить точку останова и в консоли отладки набрать po [self navigationController] и посмотреть, что она возвращает.Если возвращается nil, то по какой-то причине ваш viewController не имеет своего свойства navigationController, которое может иметь отношение к настроенной вами иерархии контроллера представления.Вы можете попытаться исправить это или вручную передать и сохранить ссылку на контроллер навигации в вашем контроллере представления.

...