Как остановить загрузку представления при выборе элемента на панели вкладок?

#iphone #uinavigationcontroller #navigation #uitabbarcontroller

#iPhone #uinavigationcontroller #навигация #uitabbarcontroller

Вопрос:

У меня есть контроллер панели вкладок с тремя вкладками. На первой вкладке у меня есть навигационный контроллер. Теперь пользователь переходит на первую вкладку, чтобы произвести некоторый платеж, поэтому я отключил кнопки возврата по умолчанию, потому что я не хочу, чтобы пользователь использовал кнопку возврата между транзакциями. Но когда пользователь снова нажимает вкладку, он / она переходит к корневому представлению. Как я могу определить выбор панели вкладок или как мне избежать повторной загрузки вкладки?

Пожалуйста, помогите мне в этом!! Спасибо!!

Примечание: Я не уверен, что на мой вопрос уже был дан ответ в stackoverflow в каком-то другом сообщении, но я выполнил поиск и не получил никакого ответа. Если да, пожалуйста, не стесняйтесь перенаправить меня на этот ответ и удалить это сообщение . Спасибо!

Ответ №1:

Проверьте ссылку на протокол UITabBarControllerDelegate.

Основная идея заключается в том, что tabBarController:shouldSelectViewController: селектор в вашем делегате UITabBarController вызывается всякий раз, когда пользователь нажимает на элемент вкладки.

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

Итак, просто верните NO из этого селектора на случай, если вы хотите предотвратить замену текущего контроллера представления, то есть когда транзакция продолжается.

Ответ №2:

Таким образом, вы можете открыть любой контроллер или выполнить любое действие по выбору определенного индекса.

  func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        let selectedIndex = tabBarController.viewControllers?.firstIndex(of: viewController)!

        if selectedIndex == 1{
            //Do any thing. 
            return false
        }
        return true
    }
  

Ответ №3:

Вы должны сделать это таким образом..

 - (BOOL)tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc
{     
    UIViewController *tbSelectedController = tbc.selectedViewController;
    if ([tbSelectedController isEqual:vc])
    {         
        return NO;     
    }      
    return YES; 
} 
  

Ответ №4:

В Swift 5:

Продолжая ответ Талхи Расула, не забудьте делегировать self в функции viewDidLoad. Это позволит текущему MainTabBarController обрабатывать все методы делегирования

 import UIKit

class MainTabBarController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self // Delegate self to handle delegate methods.
    }

    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        let selectedIndex = tabBarController.viewControllers?.firstIndex(of: viewController)!
        if selectedIndex == 1{
            //Do anything. 
            return false
        }
        return true
    }
}
  

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

1. отличный ответ, работает хорошо

Ответ №5:

Когда пользователь переходит к контроллеру платежей, вы можете скрыть панель вкладок.

Используйте этот код в своем коде при переходе к другому представлению

yourcontroller.hidebottombarwhenpushed= ДА;

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

1. Я не думаю, что это хорошее решение, поскольку тогда вам придется проверить макет представления, чтобы увидеть, действует ли он по-прежнему, когда нижняя панель скрыта… реализация функции делегирования shouldSelectViewController — это правильный путь..