Повторное использование UIViewController для двух элементов панели вкладок

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

Я собирался предоставить разные данные для просмотра контроллера в prepareforsegue.

ОБНОВИТЬ:

немного больше деталей и разъяснений

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

На приведенном выше снимке экрана, отмеченном VC, на данный момент доступно a) непосредственно из вкладки, b) через 3 перехода. Я хочу добавить еще одно отношение DIRECT к начальной панели вкладок, как и в случае «a».

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

  1. Перетащите контрольный элемент tabbarcontroller и связанные с ним элементы управления представлением элементов в свою раскадровку. Назовите их как хотите.
  2. Создайте дополнительный контроллер просмотра, который вы хотите повторно использовать из раскадровки.
  3. Добавьте представления контейнеров в каждый контроллер представления элементов табуляции и удалите их встроенные контроллеры представлений по умолчанию.
  4. Создайте встраивание segue из каждого контроллера элемента табуляции в ваш повторно отображаемый контроллер.

Конфигурация выглядит примерно так:

Скриншот

Таким образом, вы можете использовать тот же встроенный VC для другого элемента панели. Очевидно, что если вам нужна ссылка на tabbarcontroller, вам нужно self.parentViewController.tabBarController использовать self.parentViewController.tabBarController вместо self.tabBarController . Но он решает проблему повторного использования VC прямо из раскадровки.

Я нашел гораздо более простое решение, используя только раскадровку.

Настройте раскладку следующим образом:

Раскадровка

Затем в вашем инспекторе идентификации Navigation Controller установите Restoration ID следующим образом:

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

И в вашем файле класса ViewController введите следующий код:

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationItem.title = parent?.restorationIdentifier label.text = parent?.restorationIdentifier } 

или делать то, что вам нравится, на основе parent?.restorationIdentifier value

Если вы не хотите, чтобы Navigation TopBar отображался на ViewController просто установите его в « None в «Инспекторе атрибутов» требуемого Navigation Controller следующим образом:

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

Это оно! Надеюсь, поможет.

Да, ты можешь. Все, что вам нужно сделать, это создать новый контроллер просмотра в StoryBoard, как если бы на вкладке 2 появился другой контроллер View. Затем выберите второй контроллер представления и просто добавьте его имя класса к тому же классу контроллера вида 1

Важно отметить: когда вы используете один и тот же файл класса контроллера (.m ad .h), каждая вкладка создаст новый экземпляр этого класса.

Изменить: это работает до тех пор, пока у вас есть сценарий «пользовательских» ячеек (т. Е. Повторное использование двух контроллеров табличных представлений) ИЛИ, все ваши представления внутри «вид контейнера» (т.е. повторное использование UIView).

Мне нужно немного другое решение, чем принятый ответ. Мне нужно было использовать один и тот же Table View Controller с другим источником данных для разных элементов панели вкладок. Поэтому в раскадровке я создал два контроллера навигации с такими же классами, как это; введите описание изображения здесь

Я также даю разные «Идентификатор восстановления» каждому из них.

Для первого я дал «navCont1» и «navCont2» для второго. введите описание изображения здесь

В подклассе («GeneralNavCont») этих навигационных контроллеров; Я переопределяю метод init и проверяю идентификатор восстановления self. Затем я запускаю свой TableViewController и устанавливаю его источник данных на основе таких идентификаторов;

 class GeneralNavCont: UINavigationController { var dataSource1 = [Countries]() var dataSource2 = [Cities]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) initiateTableVCBasedOnId() } func initiateTableVCBasedOnId() { let storyBoard = UIStoryboard(name: "Main", bundle: nil) let tableVC = storyBoard.instantiateViewController(withIdentifier: "tableVC") as! MyTableViewController if self.restorationIdentifier == "navCont1" { tableVC.dataSource = self.dataSource1 self.viewControllers = [tableVC] } else if self.restorationIdentifier == "navCont2" { tableVC.dataSource = self.dataSource2 self.viewControllers = [tableVC] } } } 

Надеюсь, это поможет кому-то. Приветствия.

  • Некоторый код не выполняется в методе, вызванном из другого ViewController
  • Как перейти от одного контроллера к другому контроллеру просмотра нажатием кнопки?
  • ОтклонитьПросмотрСообщить VS popViewControllerAnimated
  • Объединение UIViewController в UINavigationController
  • Цвет строки состояния в реальном времени
  • Изменить название UINavigationController при изменении UIPageViewController
  • Как передать данные в диспетчер представлений и загрузить их, прежде чем нажимать их на стек навигации?
  • Использовать UIView или UIViewController для объекта таймера?
  • Проблема pushViewController от Landscape to Portrait
  • Вставить segue - динамически переключать начальный UIViewController и содержащий UIViewController динамически
  • Как добавить UINavigationController к существующему UIViewController программно
  • Interesting Posts

    Как показать searchResultsTableView, когда панель поиска активирована?

    Как сократить время утверждения App Store

    Совместное использование текстового файла с помощью UIActivityViewController

    Каковы хорошие способы узнать, как лучше выглядят приложения для iPhone?

    Автоматическая компоновка «Добавить новые ограничения» не является интерактивной в Interface Builder

    Как добавить доступ к Unity3d для iOS

    iOS Gamekit Blutooth 4+ Игроки?

    Отклонение от раскадровки, отклоненные методы делегата

    iOS 7 MKOverlayRenderer не работает

    Xcode 7.3.1 '<не удалось разрешить тип>' в консоли отладки

    Использует недействительный домен «валидатор» без права доступа »

    Модель, используемая для открытия магазина, несовместима с той, которая используется для создания хранилища Xcode 7.1

    Ошибка CFNetwork SSLHandshake (-9824) Ошибка загрузки NSURLSession / NSURLConnection Ошибка (kCFStreamErrorDomainSSL, -9824)

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

    Код = -1005 «Сетевое соединение было потеряно

    Давайте будем гением компьютера.