如何在TabBarController中离开当前ViewController之前显示警报?

时间:2016-03-30 11:20:15

标签: ios objective-c swift uitabbarcontroller

我正在尝试提醒用户保存当前View Controller的更改

让我们说,我有这样的事情:

enter image description here

这里,在TabBarController里面,在导航控制器里面我有一个“收藏夹”标签。如果用户切换到“联系人”

,我想显示提醒

问题是警报显示在目标ViewController(Contacts)上,因此对用户来说看起来很奇怪。

经过测试的解决方案:

首先,我尝试使用

override func viewWillDisappear(animated: Bool) {
    self.leavingAlert()
}
//inside FavoritesViewController

接下来,我试过了:

class FavoritesViewController: UIViewController, UITabBarControllerDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    self.tabBarController?.delegate = self
}

func leavingAlert(){
    let alert = UIAlertController(title: "Alert", message: "You forgot to do something here", preferredStyle: UIAlertControllerStyle.Alert)
    let alertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)
    alert.addAction(alertAction)
    self.presentViewController(alert, animated: true, completion: nil)
}

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
    self.leavingAlert()
}
}

效果相同

然后,我试图通过TabBarViewController来访问该事件:

class TabBarViewController: UITabBarController {

override func viewDidLoad() {
    super.viewDidLoad()

}

    override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
        if let navigationController = selectedViewController as? UINavigationController {
            if let activeController = navigationController.visibleViewController as? FavoritesViewController {
                activeController.leavingAlert()
            }
        }
    }
}

又一次 - 同样的效果。

注意,我不会打断这个UITabBarController Segue。这个想法只是问“保存或不保存?”,如果“保存”,那么做一些事情并继续切换标签,如果“不保存” - 立即切换标签。

感谢您的帮助。如果在Obj-C中有解决方案,请回答,我会尝试抓住这个想法。

3 个答案:

答案 0 :(得分:2)

您可以为UITabBarController创建delegate,并重载方法:

optional func tabBarController(_ tabBarController: UITabBarController,
    shouldSelectViewController viewController: UIViewController) -> Bool

如果用户尝试切换到viewController(来自FavoritesViewController),则从此方法返回 false 并显示警告。
在警报的一个回调中,您可以切换到目标programmatically

unowned(unsafe) var selectedViewController: UIViewController?

答案 1 :(得分:1)

你应该继承你的==并让它成为自己的代表。这样的事情应该有效:

UITabBarController

答案 2 :(得分:0)

解决方案之一是用常规IBAction替换segue。你的按钮联系人必须在显示警报的'touch up inside'事件中调用IBAction,然后在警报完成处理程序中调用你的控制器的performSegueWithIdentifier方法。