it-swarm.com.ru

Обнаружение изменений выбранного индекса/элемента UITabBar, которые установлены программно

Я хотел бы знать, как мы можем определить, когда выбранный элемент или индекс TabBar изменяетсякогдаизменения выполняются программно

self.tabBarController.selectedIndex = 1;

Эти две функции делегата обнаруживают изменения только тогда, когда элемент tabBar был выбран пользователем. Он не срабатывает, когда изменения в selectedIndex были сделаны программно.

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
    println("tabBarController didSelectViewController")
}

override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) {
    println("tabBar didSelectItem")
}
14
JayVDiyk

Предыдущих ответов достаточно, чтобы «обнаружить» изменения, однако он не определяет, какой индекс нажимается.

func selectItemWithIndex(value: Int) {
    self.tabBarControllertabBarController.selectedIndex = value;
    self.tabBar(self.tabBar, didSelectItem: (self.tabBar.items as! [UITabBarItem])[value]);
}

self.selectedIndex не вернет выбранный индекс сразу. Чтобы проверить, какой элемент нажимается, нам нужно сравнить его с tabBarItems в нашем UITabBarController

override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) {
    if item == (self.tabBar.items as! [UITabBarItem])[0]{ 
       //Do something if index is 0
    }
    else if item == (self.tabBar.items as! [UITabBarItem])[1]{
       //Do something if index is 1
    }
}
12
Eddy Liu

Вдобавок ко всем ответам здесь, если вы уже подкласс UITabBarController, вот простое решение для всех изменений панели вкладок (инициируемых пользователем и программных):

// Override selectedViewController for User initiated changes
override var selectedViewController: UIViewController? {
    didSet {
        tabChangedTo(selectedIndex: selectedIndex)
    }
}
// Override selectedIndex for Programmatic changes    
override var selectedIndex: Int {
    didSet {
        tabChangedTo(selectedIndex: selectedIndex)
    }
}

// handle new selection
 func tabChangedTo(selectedIndex: Int) {}
5
Meseery

В Swift вы можете сделать это, переопределив свойство selectedIndex для UITabBarController.

Первый подкласс UITabBarController и добавьте весь следующий код.

//Overriding this to get callback whenever its value is changes
   override var selectedIndex: Int {
      didSet {
         handleTabSelection(selectedIndex: selectedIndex)
      }
   }

Также добавьте этот метод делегата UITabBarControllerDelegate

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    //Tab tapped
    guard let viewControllers = tabBarController.viewControllers else { return }
    let tappedIndex = viewControllers.index(of: viewController)! 
    //Tab tapped at tappedIndex
    handleTabSelection(selectedIndex: tappedIndex)
}

Наконец, мы вызываем этот метод из обоих мест, чтобы все случаи были обработаны.

private func handleTabSelection(selectedIndex: Int) {
    //Do something on tab selection at selectedIndex
}
2
Vineet Ashtekar

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

func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
{
    toVC.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.fontFuturaMedium11, NSForegroundColorAttributeName: UIColor.colorAppThemeColor], for: .normal)
    fromVC.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.fontFuturaBTBook11, NSForegroundColorAttributeName: UIColor.colorStudentTabText], for: .normal)
    return nil
}
1
Amit Saxena

Swift 3

Вот несколько более безопасная версия Swift-3 из того, что было предложено выше:

func selectItem(withIndex index: Int) {

    if  let controller = tabBarController,
        let tabBar = tabBarController?.tabBar,
        let items = tabBarController?.tabBar.items
    {
        guard index < items.count else { return }

        controller.selectedIndex = index
        controller.tabBar(tabBar, didSelect: items[index])
    }
}

UITabBarController:

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    if let items = tabBar.items {
        items.enumerated().forEach { if $1 == item { print("your index is: \($0)") } }
    }
}

Использование:

selectItem(withIndex: 1)
1
jeff-ziligy

Я нашел прекрасное решение для этого. Спасибо Ckouta за идею. 

Я просто создаю функцию для изменения индекса и запускаю протокол делегата UITabBar's didSelectItem

func selectItemWithIndex(value: Int) {
    self.tabBarControllertabBarController.selectedIndex = value;
    self.tabBar(self.tabBar, didSelectItem: (self.tabBar.items as! [UITabBarItem])[value]);
}

Использование

    selectItemWithIndex(1);
0
JayVDiyk

Swift 4: - Вы должны использовать эти строки кода для обнаружения индекса выбранного элемента UITabBar.

func tabBar (_ tabBar: UITabBar, didSelect item: UITabBarItem) {

    if item == (tabBar.items)![0] {

    }
    else if item == (tabBar.items)![1] {

    }
}
0
V.Kumar

Я заботился только о selectedIndex в одном из VC в стеке контроллера панели вкладок. Итак, я KVO: ed segmentedIndex на экземпляре tabbarcontroller из этого VC. Работает хорошо, проблем нет.

0
Jonny