我正在尝试提醒用户保存当前View Controller的更改
让我们说,我有这样的事情:
这里,在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中有解决方案,请回答,我会尝试抓住这个想法。
答案 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方法。