Переключение между UIViewControllers с помощью UISegmentedControl

#ios #objective-c #uiviewcontroller #uisegmentedcontrol

#iOS #objective-c #uiviewcontroller #uisegmentedcontrol

Вопрос:

Правильно, я рассмотрел несколько вопросов SO по этому вопросу, и мне трудно найти правильное решение здесь.

Требования

У меня есть приложение на основе UITabBar. На одной из вкладок вверху находится UINavigation контроллер с UISegmentedControl , позволяющий пользователю переключаться между тремя различными представлениями. У каждого представления будет UITableView, который позволит пользователю перейти к другому представлению. Эти представления должны быть перенесены на контроллер навигации.

Проблема

Теперь все вопросы и ответы SO по этой теме показывают, как переключаться между представлениями. Однако мне нужно представление, на которое я переключаюсь, чтобы разрешить добавление другого представления в стек навигации. Я не уверен, что это вообще возможно. Я думал о сдерживании UIViewController — однако это показало бы, что представление помещается в стек в меньшем окне, чем границы экрана. Не то, что я ищу.

Есть идеи, как я могу решить это с помощью раскадровок и UIViewControllers?

Обновить

Вот что я пытаюсь сделать: на скриншоте область контейнера — это то, куда мне нужно загрузить другие контроллеры просмотра. Элемент управления UISegment не может перейти на панель навигации, поскольку это пространство используется для чего-то другого. Так вот почему я думаю, что сдерживание UIViewController может быть здесь лучше?

введите описание изображения здесь

Комментарии:

1. Вы должны просто иметь возможность использовать pushViewController на свой UINavigationController для создания стека навигации при нажатии на одну из кнопок UISegmentedControl. Это не работает?

2. Спасибо за помощь. Нажимная часть — это не то, где я застрял. Смотрите обновление в моем вопросе. 🙂 Я уверен, что push сработает, как только я туда доберусь.

3. О, интересно — так вам нужен навигационный стек в этой серой области, аналогичный функциональности UIWebView?

4. @LyricalPanda Не совсем. Серая область должна отображать три разных UIViewControllers. (Пользовательский элемент управления имеет два сегмента — только для демонстрационных целей) — выбор любого из этих сегментов приведет к замене представления в серой области на другой контроллер представления. (Это первый бит, на котором я застрял) второй бит, о котором я беспокоился, заключался в том, чтобы поместить новый контроллер представления в стек, когда пользователь нажимает на ячейку UITableView в серой области. Я хочу, чтобы новый контроллер просмотра был полноэкранным и не изменял размер (но пока я пытаюсь решить свою первую проблему) — надеюсь, это прояснит ее?

5. Да! Извините, мне потребовалось так много времени, чтобы понять проблему. Ваша логика для каждого из представлений кардинально отличается? Даже если вы ищете решение с использованием UIViewControllers, я знаю, что это можно решить, создав пользовательские UIViewControllers, которые скрыты по умолчанию, и показывая их при выборе кнопки. Это может быть один из подходов, если у вас нет полностью отдельной логики для каждого из них.

Ответ №1:

Таким образом, даже если при этом не используется separate TableViewControllers , вы можете использовать разные пользовательские UIViews настройки, которые скрыты по умолчанию и становятся видимыми при выборе соответствующей кнопки. К сожалению, это приведет к тому, что у вас будет логика всех трех представлений в одном и том же VC.

Чтобы обойти это, вы можете попробовать настроить некоторые делегаты и имитировать TableViewController логическое разделение, отправив didSelectTableAtIndexPath , UIGesture штрихи и т.д. В классы за пределами ViewController , чтобы помочь сохранить ваш код более чистым.

Комментарии:

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

Ответ №2:

Пользователь UITabBarController и скрыть панель вкладок.

 - (void)viewDidLoad
{
     self.tabBar.hidden = YES;
}
  

Привязка элемента управления сегментом к методу valueChanged

 - (void)valueChanged:(UISegmentedControl *)seg
{
    if ([seg.selectedSegmentIndex == 0]) {
        self.selectedIndex = 0;
    } else if ([seg.selectedSegmentIndex == 1] {
        self.selectedIndex = 1;
    }
}
  

Я достигаю этого таким образом, я надеюсь, что это поможет.

Комментарии:

1. Это не то, что мне нужно. Панель UITabBar должна оставаться видимой. Хотя спасибо за помощь.