与其他答案相反,这里真的不需要使用单例。您所需要的只是一个在主视图控制器和设置视图控制器之间共享的对象,或者在它们之间传递信息的某种方式。以下是一些不需要新单例类的选项:
共享模型:如果您使用模型类来跟踪您的设置,那么您的主视图控制器和设置视图控制器都可以访问该模型,只要您简单地告诉它们两个模型。例如,如果您在应用启动时创建两个视图控制器,您可以同时创建模型并将模型传递给两个控制器:
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。
您的问题主要是关于如何让两个视图控制器相互交谈。有很多方法可以做到这一点,其中任何一个都不需要单例。