2

我有两个视图控制器——一个显示主要内容的“主”视图控制器和一个保存在滑出视图内的容器中的“设置”表视图控制器。这个概念是这样的:

  1. 用户点击设置面板上的项目。
  2. 设置 TVC 创建一个包含所有按钮设置的“按钮状态”字典对象。
  3. 按钮状态字典被传递给一个类,该类将按钮状态转换为主模型对象可以理解的设置字典。
  4. _ _ __ _ _ ???

此时,我需要通知主视图控制器(它包含我的主模型对象的实例)设置已更新,它需要更新其模型对象的设置。我该怎么做呢?我应该在主视图控制器上有一个类方法并将头文件包含在我的设置转换类中吗?

4

4 回答 4

4

与其他答案相反,这里真的不需要使用单例。您所需要的只是一个在主视图控制器和设置视图控制器之间共享的对象,或者在它们之间传递信息的某种方式。以下是一些不需要新单例类的选项:

  • 共享模型:如果您使用模型类来跟踪您的设置,那么您的主视图控制器和设置视图控制器都可以访问该模型,只要您简单地告诉它们两个模型。例如,如果您在应用启动时创建两个视图控制器,您可以同时创建模型并将模型传递给两个控制器:

    MyModel *model = [[MyModel alloc] initWithFilePath:somePath];
    MainViewController *mainVC = [[MainViewController alloc] initWithNibName:nil bundle:nil];
    SettingsViewController *settingsVC = [[SettingsViewController alloc] initWithNibName:nil bundle:nil];
    mainVC.model = 模型;
    settingsVC.model = 模型;
  • 共享对象:如果您不需要/想要一个完整的模型类,并且您只需要在两个控制器之间传达一些更改,让它们共享一个简单的数据容器,如字典。例如,假设主视图控制器负责创建设置视图控制器,然后将其推送到导航堆栈。它可以很容易地说:“这是一个可变字典;使用它来获取您需要的任何设置,并记录任何更改。” 主视图控制器中的代码如下所示:

    self.settings = [NSMutableDictionary 字典];
    // ...将所有设置添加到字典的代码...
    SettingsViewController *settingsVC = [[SettingsViewController alloc] initWithNibName:nil bundle:nil];
    settingsVC.settings = self.settings;
    [self.navigationController pushViewController:settingsVC];
  • 委托:考虑前面的情况,但不是将可变字典或模型对象传递给设置视图控制器,而是将主视图控制器本身作为共享对象传递。如果设置是主视图控制器的属性,设置视图控制器可以访问这些属性(请使用访问器)以获取和设置设置。或者把它转过来,让主视图控制器保持对设置视图控制器的引用,以便它可以请求它需要的任何设置的值。无论哪种方式,一个视图控制器都充当另一个视图控制器的助手,简而言之,这就是委托模式。

  • NSUserDefaults:共享用户默认对象已经是一个单例,所以你真的不需要一个不同的。两个视图控制器都可以简单地访问共享的用户默认对象来获取/设置他们需要的设置。

无论您选择哪一个,您都需要确保阅读-viewWillAppear每个控制器的设置并根据需要更新 UI。

您的问题主要是关于如何让两个视图控制器相互交谈。有很多方法可以做到这一点,其中任何一个都不需要单例。

于 2013-07-01T05:30:18.560 回答
1

我有一个做类似事情的应用程序。在我的设置视图中,每当修改设置时,我都会让设置视图调用一个单例对象,该对象跟踪设置视图中的设置。切换回主视图后,在该viewWillAppear方法中,我检查单例以查看设置了哪些设置并相应地更新我的 UI。

于 2013-06-22T05:29:51.460 回答
1

您可以为设置创建单例类。这里是如何做到这一点的链接单身人士的护理和喂养

假设您的单身人士称为 SharedSettings。每次更改视图中的设置时,都应在 SharedSettings 单例中更改它们并告诉视图应用此更改。为了“告诉视图”,objective-c 中有两种最常用的方法:delegate 和 NSNotificationCenter。

这是委托的教程委托示例

这是通知NSNotificationCenter 教程的链接

委托和通知之间的区别在于委托用于通知一个类,例如喜欢cellForRowAtIndexPath,通知用于通过一个通知通知许多观察者,例如假设您有 5 个视图控制器,并且在设置中您将背景从红色更改为绿色,并且您需要通知所有 5 个视图来更改它们的颜色。通知也被认为比代表慢一点。

如果您对单例、代表或通知有任何疑问,请随时提出。

于 2013-06-22T08:45:53.440 回答
0

您不需要将与模型的通信限制为“主”视图控制器,您的设置表视图控制器也可以直接访问模型!通过一个地方汇集所有模型访问通常不会给您带来太多好处,而是需要您发明毫无意义的并行系统来将模型值与该主控制器进行通信。

将模型对象改为单例,并允许从任何控制器进行访问。

但是,如果你真的需要保留你的架构,你需要一种方法来通知主视图控制器设置视图正在关闭。也许发布主视图控制器观察到的通知,更新的设置字典可以是通知对象。

于 2013-06-22T05:22:20.593 回答