Как передать данные через сигвей минуя tabbar


#1

Передаю данные в другой контроллер таким образом:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showDetailsSegue" {
            if let indexPath = self.tableView.indexPathForSelectedRow {
                let destinationVC = segue.destination as! DetailsTableViewController
                destinationVC.ralName = self.ralColors.ralArray[(indexPath as NSIndexPath).row].name
                destinationVC.r = self.ralColors.ralArray[(indexPath as NSIndexPath).row].r
                destinationVC.g = self.ralColors.ralArray[(indexPath as NSIndexPath).row].g
                destinationVC.b = self.ralColors.ralArray[(indexPath as NSIndexPath).row].b
            }
            
        }
    }

Но решил к DetailsTableViewController добавить TabBarController и теперь Xcode конечно же ругается. Пробовал назначать ID для TabBar и передавать данные непосредственно на него, но это вызывает ошибку. Подскажите, как быть?


#2

Сигвей к таббару, передаем значения ему. Далее в таббар контроллере подписываемся на UITabBarControllerDelegate. Пишем

func viewDidLoad() {
    super.viewDidLoad() {
    self.delegate = self
}

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
    // передаем значение
}

#3

Вот вам еще один способ:

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
         // сначала мы при переходе попадаем в наш tabBarController
        let barViewControllers = segue.destinationViewController as! UITabBarController 
        // допустим нам нужно взять у tabBar контроллер по индексу 1
        // и для примера пускай это будет UINavigationController
        let navViewControllers = barViewControllers.viewControllers![1] as! UINavigationController 
        // ну и вот мы добрались до нужного контроллера
        let destinationViewController = navViewControllers.topviewcontroller as! YourViewController 
        // дальше все как обычно
        destinationViewController.aaa = "мы передали данные чаерез Segue"
 }

#4

Добрый вечер и спасибо за ответ. Делаю по вашему примеру. Сразу получил ошибку: Terminating app due to uncaught exception ‘NSRangeException’, reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 … 0]. Да, мой TabBar ведет только к одному контроллеру, поэтому индекс поменял на [0]. Но Получаю новую ошибку: Could not cast value of type ‘ralClassic.DetailsTableViewController’ (0x107194408) to ‘UINavigationController’ (0x1094714a8).


#5
let navViewControllers = barViewControllers.viewControllers![0] as! DetailsTableViewController

UINavigationController там был для примера.


#6

Понимаю. В моем случае, по идее, так и получается. Хотя не совсем… Да, переход идет минуя основной навигатион контроллер. Удалил переход к нему, все теперь работает. Спасибо! :slight_smile:


#7

Но теперь появилась соответственно другая фигня. Связь с основным навигатион нарушена и исчезли navigation items и bar button items в последнем контроллере после добавления TabBar


#8

У вас явно проблемы с структурой! может не стоит миновать NavigationController?


#9

По сути мне TabBar нужен для размещения на нем кнопок типа “поделиться”, “избранное” и т.д. Последний контроллер - это tableviewcontroller в котором таблица занимает все пространство. Пробовал добавить ToolBar, но он конечно же прижимается к таблице, а кнопки должны быть независимы, всегда на виду. Пробовал через EmbedIn добавлять TabBar к основному navigation, но в этом случае панель tabbar почему-то не отображается в контроллерах. Даже не знаю как быть, последний контроллер не хочется переделывать на viewController


#10

ну вы же можете использовать UIViewController, а на него положить TableView! или можете просто добавлять TabBar. Нужно продумано подходить к выбору того или иного UI элемента!


#11

Да, UIViewController я и имел ввиду при “последний контроллер не хочется переделывать на viewController”. Можно как-то программно добавить tabbar к TableViewController и сделать его независимым относительно таблицы? Чтобы он не скролился вместе с ней