我有一个相对简单的应用程序。我有一个 UINavigationController 并且总是将我的 mainViewController 推到它上面。有时我会推动设置和子设置控制器。在我的子设置控制器中,用户可以在我的 mainViewController 中对 ivars 进行修改。现在我将这些 ivars 声明为属性并直接设置它们。我self.navigationController.viewControllers[0]
用来获取对主控制器的引用,然后设置属性。使用 NSNotificationCenter 更好吗?
3 回答
让您的设置控制器了解您的主视图控制器并不是一个很好的设计。当您将来向应用程序添加更多功能并且应用程序中的更多屏幕需要处理任何设置的更改时会发生什么?
分离行为是一个更好的设计。您的设置视图控制器应该更新某种“设置模型”。代表这个模型的类应该能够广播任何变化。使用NSNotificationCenter
它是一个很好的方法。
现在,任何可能关心设置更改的类都可以注册相应的通知,并在发生更改时采取相应的行动。
这样,您可以拥有多个视图控制器或其他响应设置更改的类,并且设置代码中的任何内容都不需要关心任何特定的视图控制器或有多少。
您所做的很好,因为您可以轻松地从设置视图控制器中获取对主视图控制器的引用。这实际上只是一个偏好问题。
的真正目的NSNotificationCenter
是当多个对象需要被通知一个事件或很难获得对要修改的对象的引用时。NSNotificationCenter
还可以让你的代码更简洁,更容易修改。
例如,如果您将来更改应用程序的设计,例如将设置视图控制器移动到选项卡而不是将它们推送到导航控制器上,您可能会发现直接从它们修改主视图控制器会更加困难。
NSNotificationCenter
当您的应用程序中有不同的组件在逻辑上不了解彼此的 API 时,使用它会更合适。但是,在您显示子设置控制器的视图时,很容易拥有一个设置对象,您可以将其mainViewController
从subSettingsViewController
. 在您的子设置视图控制器中,在-viewWillDisappear:
方法中,确保所有值都已保存到您的设置对象中。最后,在主视图控制器的-viewWillAppear:
方法中,您只需使用设置对象中的值更新主视图的 UI。
下面是一些代码来说明这一点:
主视图控制器.m
@interface MainViewController ()
@property (nonatomic, strong) MySettings *settings;
@property (nonatomic, strong) SubSettingsViewController *subSettingsViewController;
@end
@implementation MainViewController
- (IBAction) showSubSettings: (id) sender {
[self.subSettingsViewController setSettings: self.settings];
// Present 'subSettingsViewController'
}
- (void) viewWillAppear: (BOOL) animated {
[super viewWillAppear: animated];
// Set values from settings object for various text fields, UI controls, etc.
}
子设置视图控制器.h
@interface SubSettingsViewController ()
@property MySettings *settings;
@end
子设置视图控制器.m
@implementation SubSettingsViewController
- (void) viewWillDisappear: (BOOL) animated {
[super viewWillDisappear: animated];
// Set values for the appropriate properties in 'self.settings'
[self.settings setValue1: self.textField1.text];
}