【问题标题】:Objective-C: Pass data between two not connected View ControllersObjective-C:在两个未连接的视图控制器之间传递数据
【发布时间】:2020-04-30 23:04:19
【问题描述】:

我有一个带有 UILabel 的 ViewController A 和一个带有 button 的 ViewController B,所以我想在按下按钮后更新标签。我可以为此使用委托,但我的 ViewController 没有连接,我不能使用 setDelegate 之类的东西,我不会在另一个中创建任何实例。所以基本上它们是在其他地方创建的。有什么办法吗?

【问题讨论】:

  • 当您说“未连接”时,也许您可​​以澄清一下。它们是否在同一个视图控制器层次结构中,但不是直接相关的?或者您是在谈论从窗口的根视图控制器中进行一些彻底的交换?按照你提出问题的方式,你几乎肯定会得到关于全局变量、单例变量等的答案。但依赖注入通常是首选。但我们需要更多背景信息来为您提供建议。

标签: objective-c delegates


【解决方案1】:

变体 1:如果 ControllerA 和 ControllerB 的生命周期不同

使用NSUserDefaults。在 ControllerB 按钮上单击将数据存储到 NSUserDefaults 中,在 ControllerA 中从 NSUserDefaults 读取数据并显示在标签中(NSUserDefaults 也是可观察的,因此可以跟踪运行时的变化)

变体 2: 如果 ControllerA 和 ControllerB 目前都在运行时

使用NSNotificationCenter。在 ControllerB 按钮上单击发布带有 userInfo 数据的 NSNotification,通知处理程序中的 ControllerA 从 userInfo 中提取数据并分配给标签。

【讨论】:

    【解决方案2】:

    使用协调器模式。

    将创建/获取两个 VC 实例的类, 并且与代表将在他们之间移动数据。 Coordinator 模式的优点是你的 VC 可以在其他地方(相同或其他项目)重复使用,而且代码更干净。

    【讨论】:

      【解决方案3】:

      扩展 Apsperi 的答案:

      改变视图控制器的通知方法: 在按钮按下调用按钮的视图控制器中:

       [[NSNotificationCenter defaultCenter] postNotificationName:@"refresh" 
        object:self userInfo:nil];
      

      然后在标签视图控制器的 viewdidload 或 viewdidappear 方法中放置通知的“接收者”:

        [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(mymethotochangetext) name:@"refresh" object:nil];
      

      NSUserDefault 方法:

      在带有按钮的视图控制器中保存一个 NSUserDefualt:

         [[NSUserDefaults standardUserDefaults] setObject:somestring 
            forKey:@"myuniquekeyname"];
          [[NSUserDefaults standardUserDefaults] synchronize];
      

      然后在带有标签的视图控制器中,您可以在视图加载时获取保存的字符串并将其放置在文本字段中:

          self.label.text=[[NSUserDefaults standardUserDefaults] 
           stringForKey:@"myuniquekeyname"];
      

      【讨论】:

        猜你喜欢
        • 2012-07-27
        • 1970-01-01
        • 1970-01-01
        • 2011-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多