选项卡栏控制器 - 如果 segue 是从选项卡栏启动的,则更改数据

Tab Bar Controller - change data if segue was initiated from tab bar

我正在尝试做一些看似简单的事情,但我遇到了困难。我有一个带有设置页面的选项卡栏应用程序,它是一个 table 视图。用户可以通过选择一行来更改设置,这会推送一个带有新设置选项的新 table 视图。当用户选择新设置时,我将信息发送回主 table 视图并使用新设置填充 table 视图。
问题:我还有一个保存按钮。如果用户不保存新设置,我想丢弃它们。如果用户选择一个新选项卡(不保存设置)然后选择设置选项卡,则用户最后输入的数据仍在 table 视图中。我知道这是因为在创建视图后不会再次调用 viewdidload。

基本上我想要这样的逻辑:

如果 segue 是通过单击选项卡栏图标启动的:使用 dataModel 加载 table 视图。
否则,如果前一个屏幕是数据输入屏幕:使用用户选择的数据加载 table 视图。

如果我不使用选项卡栏控制器,我将通过使用 viewdidload 加载 dataModel 并使用委托方法加载 tableview 来实现。问题是我不能使用 viewdidload。我也不能使用 viewwillappear,因为在从 table 视图打开屏幕时以及从堆栈中弹出入口视图控制器时都会调用它。

我尝试在 AppDelegate 中为 Tab Bar Controller 设置委托方法

 func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
        if (tabBarController.selectedIndex == 2)
        {   let navController = viewController as! UINavigationController
            let settingsTableViewController = navController.viewControllers[0] as! SettingsTableViewController
            settingsTableViewController.loadFromDataModel = true
            println("In did select view controller in app delegate")
        }     
    }

如果 loadFromDataModel = true 则我从设置 Table 视图控制器中的数据模型加载。这就是问题所在 - 这仅在我从选项卡来回两次时才有效。太奇怪了。我输入了 println 语句,看起来执行顺序如下:

  1. 正在设置中调用 ViewWillAppearTableViewController

  2. tabBarController:didSelectViewController 正在从 AppDelegate(并且更新了变量 loadFromDataModel - 但为时已晚,因为已经调用了 viewwillappear)

总结:这是确定转场是否来自标签栏的最佳方式吗?为什么在委托方法之前调用我的 SettingsTableViewController 上的 viewwillappear?关于每次用户通过选项卡栏选择选项卡时如何从数据模型加载数据的任何建议。我错过了一些明显的方法吗?感谢您的帮助!

didSelectViewController 被调用时,已经来不及做您想做的事了。正如您可以通过 viewDWillAppear 委托触发来判断的那样。尝试将您的代码移动到 tabBarControllershouldSelectViewController 委托,这应该足够早地设置您的数据。