首页 > 解决方案 > 为什么 tabbarcontroller 中的窗口手势识别器不起作用?

问题描述

我创建了一个带有多个视图控制器的 UITabBarController。我向视图控制器添加了一个 UIPanGestureRecognizer 到 UIWindow。

这可以正常工作。

问题:每当我更改 UITabBarController 中 viewWillAppear 中的 selectedIndex 时(以显示最后打开的选项卡),将显示正确的视图控制器,但添加到窗口的 panGestureRecognizer 不起作用。

当我手动更改选定的选项卡时,窗口 panGestureRecognizer 工作。每次应用启动都会发生这种情况。

有什么问题?(Xcode 10.2.1,斯威夫特 5)

提前致谢!

// UITabBarController
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if UserDefaults.standard.object(forKey: self.selectedTabIndexKey) != nil {
        selectedIndex = UserDefaults.standard.integer(forKey: self.selectedTabIndexKey)
    }
}


// ViewController2
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let appDelegate = UIApplication.shared.delegate as? AppDelegate, let window = appDelegate.window {
        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
        window.isUserInteractionEnabled = true
        window.addGestureRecognizer(panGestureRecognizer)
    }
}


@objc fileprivate func handlePan(gesture: UIPanGestureRecognizer) {
    // ...
}

标签: swiftuitabbarcontrolleruigesturerecognizeruiwindow

解决方案


清理后,重建 Xcode 项目并将 selectedIndex 放入 viewDidLoad 中,它终于可以工作了。

override func viewDidLoad() {
    super.viewDidLoad()

    viewControllers = [
        vc1,
        vc2
    ]

    if UserDefaults.standard.object(forKey: self.selectedTabIndexKey) != nil {
        selectedIndex = UserDefaults.standard.integer(forKey: self.selectedTabIndexKey)
    }
}

推荐阅读