【问题标题】:How to pass information between two UIViewControllers in a in a UITabBarController如何在 UITabBarController 中的两个 UIViewController 之间传递信息
【发布时间】:2012-12-14 21:29:32
【问题描述】:

在我的 iPhone 应用中,有两个 UIViewController;两者都嵌入在 UITabBarController 中。然而,当 TabBarController 被点击并且 VC 的开关时,屏幕上的 VC 将数据上传到 NSUserDefaults,然后被切换到的 VC 从 NSUserDefaults 获取该数据。

我目前所做的是在第一个 VC 的 viewWillDisappear 中上传数据,然后在第二个 VC 的 viewWillAppear 中获取它。 问题在于,将要显示在屏幕上的 VC 的 viewWillAppear 在“旧”VC 的 viewWillDisappear 之前被调用,因此它会尝试获取尚未上传的数据。

我可以使用什么来让“旧 VC”第一个知道它何时会离开屏幕,以便在新 VC 获取数据之前上传数据?

*我还尝试设置一个 UITabBArControllerDelegate 以便旧 VC 接收 - tabBarController:didSelectViewController: 但调用也太晚了。

【问题讨论】:

    标签: iphone ios uiview uiviewcontroller uitabbarcontroller


    【解决方案1】:

    如果您不打算传输大量信息,则可以使用默认变量作为众多可用选项之一。它可能不是最好的,但它会起作用。

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:Variable forKey:@"variable"];
        [defaults synchronize];
    

    设置变量

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *fetchVariable = [defaults objectForKey:@"variable"];
    

    在其他 VC 中检索它。

    【讨论】:

    • 是的,我已经涵盖了那部分,问题是何时上传变量,所以它发生在下一个 vc 下载它之前
    • 对不起,我误解了这个问题!
    • 这个答案对我有帮助。在过去的一天里,我试图做这样的事情。非常感谢@Naux。
    • 我使用 NSUserDetails 将数据保存在 uitextbox 中,这样用户就不必在每次运行应用程序时都输入数据。我没有意识到我也可以这样做来传递数据。 + 1
    【解决方案2】:

    我可以使用什么来让“旧 VC”第一个知道它何时会离开屏幕,以便在新 VC 获取数据之前上传数据?

    您可以尝试使用– tabBarController:didSelectViewController: UITabBarControllerDelegate 方法将数据保存在NSUserDefaults;这肯定应该在任何控制器中的 viewWillAppear 之前调用。

    如果您想保留当前方法,请尝试在第二个视图控制器中使用 viewDidAppear: 而不是 viewWillAppear:。 如果您没有从 NSUserDefaults 获取大量数据(我猜应该是这种情况)并且您的第二个视图控制器 UI 没有在显示数据时引入延迟,这应该可以正常工作。

    另一种方法是让第一个控制器在每次更改时更新 NSUserDefaults 中的数据。

    【讨论】:

    • 是的,我这样做了,但是之后我必须重新加载数据,所以它会在屏幕上闪烁,然后更新版本会在一秒钟后出现
    【解决方案3】:

    写和回读听起来像是不必要的开销。当然,除非您无论如何都需要编写它。

    我会让之前的UIViewController 将包装在一个对象中的所有数据传递给UITabBarController,然后它会将它传递给新的UIViewController。如果这是所有(或大部分)选项卡的模式,请创建一个新协议并让您的 UIViewControllers 实现它。然后,您的 UITabBarController 将能够通过简单地检查控制器是否符合您的协议来确定哪些控制器需要它。

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多