为什么我的 UIAlertController 直到我第二次按下它的标签时才出现?

Why does my UIAlertController not appear until the second time I press it's tab?

我正在使用以下 class 来尝试在我单击特定选项卡(而不是切换到该选项卡)时弹出警报。我第一次单击该选项卡时,它进入一个空视图并且不显示警报。

我第二次(及以后)点击它时,它按预期工作。

有没有办法在我第一次单击选项卡时触发警报?

class 的代码如下:

class TabOverlayViewController: UIViewController, UITabBarControllerDelegate {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.tabBarController?.delegate = self

    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }


    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {

        if viewController == tabBarController.viewControllers?[1] {
            let alert = UIAlertController(title: "Add", message: "", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "Album", style: .default) { action in

            })
            self.present(alert, animated: true, completion: {

            })

            return false
        } else {
            return true
        }
    }
}

发生这种情况是因为您仅在 viewWillAppear 方法中设置了 UITabBarViewControllerDelegate。所以第一次没有委托的调用时,视图出现,设置委托并仅在后续点击时涉及 func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool 方法。

更新:

顺便问一下,您确定这个特定的控制器应该是 UITabBarController 的委托吗?具体控制器决定哪个选项卡可以打开,哪个不可以,这是否正确?在一个简单的应用程序中,我将分配给委托选项卡栏控制器本身:

final class TabBarVC: UITabBarController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension TabBarVC: UITabBarControllerDelegate {
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
       // do your logic here
    }
}

当然,您应该指定,您当前的标签栏控制器类型为TabBarVC