Как перейти на одну из закладок Tab Bar Controller

swift5

#1

пишу небольшое приложение с корзиной покупок, почти все уже сделано, споткнулся на такой вещи. Приложение использует Tab Bar Controller с 3-мя закладками: Inventory, Cart, Settings. Из Inventory пользователь переходит в Detail и там добавляет элемент в покупательскую корзину (Cart). Ниже скриншот как это выглядит.

Проблема в том, что при переходе из Detail в Cart на экране не показывается таб бар в нижней части страницы.

Понятно, что это связано с переходами, но как все-таки сделать, чтобы таб бар показывался?


#2

Вы переход не так сделали из деталей в корзину. В таббаре нельзя так переходить между табами.
Достаточно просто достучаться до таббарконтроллера и поменять ему индекс на корзину.


#3

а можно какой-нибудь пример?


#4

tabbarController?.selectedIndex = 1


#5

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


#6

Нет. Но вы можете через тот же таббар получить VC на нужном индексе и передать в него на прямую.


#7

Ок, спасибо еще раз. Пойду пробовать.


#8

Написал вот такой код, переход происходит, а данные что-то чудят. Они передаются не с первого клика, а где-то с третьего. Подскажите, что здесь неправильно?

@IBAction func addCartButton(_ sender: UIButton) {

    tabBarController?.selectedIndex = 1
    
    let nav = tabBarController?.viewControllers![1] as! UINavigationController
    let cartTableViewController = nav.topViewController as! CartTableViewController
    
    cartTableViewController.titleItem = titleItem
    cartTableViewController.image = SomeImage(photo: image!)   
}

#9

Попробуйте делать переключение после передачи данных.


#10

Не помогает, теперь со второго раза данные появляются. Плюс другие глюки.

А какова в целом логика передачи данных через Tab Bar - та же, что и чере Segue или какая-то другая?


#11

что-то не могу пробиться, может у вас есть какой-нибудь пример кода из проектов, где передавалаись данные через Tab Bar?


#12

Как глубока была ваша мысль!)) Это стало понятно только после нескольких дней неудачных попыток найти решение методом “научного тыка”. Перепробовал все, что мог придумать. По ходу поставил переход после передачи данных внутри одного и того же метода. Потом промежуточно прозрел, что данные все-таки передаются, пусть даже со второй-третьей попытки. Значит их что-то тормозит. В конце правда оказалось, что их ничто не тормозит, а наоборот, их что-то опережает. И тогда решил притормозить то, что их опережает и переместил переход в другой метод - viewWillDisappear. И все заработало!

Сорри за многословность, это такая эйфория. Думаю у многих здесь присутствующих что-то похожее бывает, когда находишь решение. Спасибо за подсказку!


#13

а вот тут можно подробнее?
То что оно работает это конечно хорошо, но вот то что оно правильно работает это вопрос уже сложнее)
Нужно понимать что за метод такой чудный viewWillDisappear и так вы его используете! Почитайте и попробуйте понять, если что, спрашивайте, так как мне кажется проблема где-то на уровне логики желаемой вами операции


#14

Код в принципе тот же, только переход поставлен после передачи данных. Получилось так, что вначале перенос этой строки кода внутри того же метода особо не помог, т.е. вместо трех кликов, надо было делать 2. Но вот когда перенес ее в другой метод - viewWillDisappear, тогда все заработало нормально.

А в чем особенности этого метода viewWillDisappear?


#15

это метод жизненного цикла ViewController и при его использовании просто нужно понимать когда он вызывается и для чего его рекомендуют использовать!


#16

теперь уже я хочу попросить вас немного подробнее)) На данный момент понятно, что viewWillDisappear вызывается когда вью контролер уходит с экрана пользователя, но остается в оперативной памяти. Но вот дальше, действительно есть вопросы - в чем его особенности и для чего его можно использовать?


#17

Кажется я понял, о чем идет речь. Наверное вот об этом.

Это последовательность вызова методов жизненного цикла при переходе через таб бар от первого вью контролера ко второму и обратно. Нашел в guide.

ViewController - View Did Load
ViewController - View Will Appear
ViewController - View Did Appear
SecondViewController - View Did Load
SecondViewController - View Will Appear
ViewController - View Will Disappear
ViewController - View Did Disappear
SecondViewController - View Did Appear

Switching back to the first tab, the order of the print statements is:

FirstViewController - View Will Appear
SecondViewController - View Will Disappear
SecondViewController - View Did Disappear
FirstViewController - View Did Appear

Т.е. получается, что методы View Will Disappear and View Did Disappear первого вью контролера срабатывают позже, чем метод View Will Appear второго вью контролера. Поэтому, если мы сохраняем какие-то данные в методах Disappear, то при использовании во втором вью контролере метода View Will Appear они появятся в этом втором вью контролере не сразу, а при втором входе. Поэтому лучше в данном случае использовать во втором контролере метод View Did Appear.