получение текущего активного viewController в UITabBarControllerDelegate - PullRequest
1 голос
/ 16 марта 2020

Я хочу реализовать метод scrollToTop на всех моих viewControllers в моем UITabBarController. Ниже приведен метод в UITabBarControllerDelegate и триггеры, когда я выбираю вкладку. Проблема в том, что я хочу прокручиваться только к вершине viewController, когда viewController активен. Чтобы пользователь мог переключать вкладки, не теряя позиции прокрутки, но когда он касается вкладки в панели вкладок активной в данный момент вкладки, он должен прокрутиться до самого верха.

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    if viewControllerThatIsCurrentlyActiveInTabBar == viewController {
        scrollToTop()
    }
}

По сути, я Мне нужно это условие оператора if. Я пытался: viewController.isViewLoaded, tabBarController.selectedViewController == viewController, viewController.isBeingPresented. Ни одно из этих условий не сработало. Он либо не сработает scrollToTop(), либо сработает всегда, так что вы теряете позицию прокрутки при смене вкладок, потому что он сразу же прокручивается к вершине.

Ответы [ 2 ]

4 голосов
/ 16 марта 2020

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

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    if tabBarController.selectedViewController == viewController {
        print("Same viewcontroller")
    }
    return true
}
0 голосов
/ 16 марта 2020

Можете ли вы использовать нижнее расширение для получения верхнего вида контроллера tabbarcontroller.

расширение UIViewController {

var top: UIViewController? {
    if let controller = self as? UINavigationController {
        return controller.topViewController?.top
    }
    if let controller = self as? UISplitViewController {
        return controller.viewControllers.last?.top
    }
    if let controller = self as? UITabBarController {
        return controller.selectedViewController?.top
    }
    if let controller = presentedViewController {
        return controller.top
    }
    return self
}

}

Вы можете использовать вышеуказанное расширение ниже

 if let rootViewController = UIApplication.top() {
    //do with Active view controller
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...