4

У меня есть UINavigationController, и у меня есть отдельные UIViews, которые я переключаю между использованием UISegmentControl. При включении мнений, я добавляю вид как подвид с точкой зрения моего навигационного контроллером:Не удалось pushViewController для subview

[self.view addSubview:segmentTab1.view]; 

и

[self.view addSubview:segmentTab2.view]; 

Затем в подпанелях, каждый имеет UITableView, но моя проблема в том, что Я не могу нажать новый viewController на просмотр в методе didSelectRowAtIndexPath.

Метод вызывается правильно и, устанавливая точки останова, я вижу, что метод pushing view также вызывается, но ничего не происходит. Это мой код для проталкивания его:

[self.navigationController pushViewController:detailsViewController animated:YES];

Я также попытался

[super.navigationController pushViewController:detailsViewController animated:YES];

Что я делаю неправильно - или просто не представляется возможным сделать это с подвидом?

ответ

6

Когда вы вызываете -pushViewController, какой контроллер просмотра сам? Если вы вызываете это из одного из ваших подзонов в закладках, у вас, скорее всего, нет ссылки на контроллер навигации с верхнего уровня, к которому вы добавили его. Вы можете проверить это, получив адрес памяти контроллера навигации в пределах верхнего уровня и сравнив его с тем, что у вас есть в подвью. Очевидно, если это нуль или не соответствует, то это ваша проблема.

Вы получаете только контроллер навигации «бесплатно», когда он добавлен в стек навигационной панели с -pushViewController, который не был добавлен таким образом.

+0

Точно - вызов pushViewController должен появиться из представления который сам был нажат на навигационный контроллер. Он не обязательно должен быть последним нажатым, но он должен быть в стеке навигационных контроллеров. – Amagrammer

+1

Уточнение: «должно возникнуть из вида CONTROLLER» - не вид. – Amagrammer

+0

Спасибо, Мэтт. И «Амараммер». У меня есть вкладки, в каждом из которых есть NavigationControllers, у которых есть nib и класс, прикрепленные к их представлениям. Я собираюсь настроить его, так что на каждой вкладке есть контроллер вида, и в каждом из контроллеров view я добавляю UINavigationController, который отключает его виды на основе segmentedControl и, надеюсь, я могу нажать на subviews, когда я туда доберусь:) – runmad

0

Не совсем ясно, какова ваша иерархия взглядов, но в общем случае, если ваше представление диспетчеров навигации не является первым подзором окна или элементом одного из представлений коллекции Apple (либо просмотр содержимого другого диспетчера навигации или представление содержимого контроллера таблеток), он не будет работать правильно.

1

Вместо

[self.view addSubview:segmentTab1.view]; 

и

[self.view addSubview:segmentTab2.view]; 

вы можете использовать

[self pushViewController: segmentTab1 animated: NO]; 

и

[self pushViewController: segmentTab2 animated: NO]; 

т o добавьте свой просмотрКонтроллеры в иерархию навигации и сделайте работу [super.navigationController pushViewController:detailsViewController animated:YES];.

+0

Не уверен, что это сработает, но если вы выберете виды в контроллере segmentController и используете TabBar, нажатие tabBarItem для этого представления приведет к возврату представления. Не выглядит так хорошо :( – runmad

+0

Я не уверен, что правильно понимаю это поведение. Возможно, вам стоит взглянуть на свойство * visibleViewController * на navigationController, и если оно соответствует просмотру, который вы пытаетесь нажать, толкайте его больше. – luvieere

0

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

Вы бы вызвать его таким образом:

[[((MyApplicationDelegate*)[UIApplication delegate]) navController] 
       pushViewController: viewControllerToPush animated: YES]; 

где в MyApplicationDelegate, NavController возвращает одноэлементный объект.

0
LogEntryDetailViewController *leController = [[LogEntryDetailViewController alloc] initWithNibName:@"LogEntryDetailView" bundle:[NSBundle mainBundle]]; 
    [leController setTitle:[NSString stringWithFormat:@"%@", [logEntriesArray objectAtIndex:row]]]; 
    [[self navigationController] pushViewController:leController animated:NO];  
    [leController release], leController = nil; 
2

У меня была аналогичная проблема при реализации общий заголовок для всех представлений После многих попыток, я установил его этим -

Во всех ViewController

- (void)viewWillAppear:(BOOL)animated { 

    [self.view addSubview:[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] view]]; 
    [[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] viewWillAppear:YES]; 

} 

У меня есть упомянутый следующий пост для реализации вида заголовка Common XIB in multiple View Controller in iPhone

[self.view addSubview:[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] view]];  // line will load the header subview 

[[(NavAppAppDelegate *) [[UAppication sharedApplication] delegate] headerview] viewWillAppear: YES]; // это вызов метода viewWillAppear HeaderController, где мы можем написать код, чтобы проверить, что пользователь зарегистрирован или нет, а также изменить кнопку входа в систему для выхода из системы и т. д.

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