使用NSNotificationCenter设置ivars?

时间:2013-08-21 20:48:59

标签: ios nsnotificationcenter

我有一个相对简单的应用程序。我有一个UINavigationController,并且总是把我的mainViewController推到它上面。偶尔我会推动设置和子设置控制器。在我的子设置控制器中,用户可以在mainViewController中对ivars进行修改。现在我将这些ivars声明为属性并直接设置它们。我正在使用self.navigationController.viewControllers[0]来获取对主控制器的引用,然后设置属性。使用NSNotificationCenter更好吗?

3 个答案:

答案 0 :(得分:3)

让您的设置控制器了解您的主视图控制器并不是一个非常好的设计。如果您将来向应用添加更多功能会发生什么,并且应用中的更多屏幕需要处理任何设置中的更改?

分离行为是一个更好的设计。您的设置视图控制器应更新某种“设置模型”。然后,表示此模型的类应该能够广播任何更改。使用NSNotificationCenter这是一个很好的方法。

现在任何可能关心设置更改的类都可以注册相应的通知,并在发生更改时采取相应的行动。

通过这种方式,您可以拥有多个视图控制器或其他响应设置更改的类,设置代码中的任何内容都不需要关心任何特定的视图控制器或有多少视图控制器。

答案 1 :(得分:1)

您正在做的很好,因为您可以从设置视图控制器轻松获取对主视图控制器的引用。这只是一个偏好问题。

NSNotificationCenter的真正目的是当需要通知多个对象事件或者很难获得对要修改的对象的引用时。 NSNotificationCenter还可以使您的代码更清晰,更容易修改。

例如,如果您将来更改应用程序的设计,例如将设置视图控制器移动到选项卡而不是将它们推送到导航控制器,您可能会发现直接从它们修改主视图控制器更加困难。

答案 2 :(得分:0)

如果您的应用中存在截然不了解彼此API的不同组件,那么使用NSNotificationCenter会更合适。但是,如果要显示子设置控制器的视图,则可以轻松地设置一个可以从mainViewController传递到subSettingsViewController的设置对象。在子设置视图控制器中,在-viewWillDisappear: memthod中,确保已将所有值保存到设置对象中。最后,在主视图控制器的-viewWillAppear:方法中,您只需使用设置对象中的值更新主视图的UI。

以下是一些代码来说明这一点:

<强> MainViewController.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.
}

<强> SubSettingsViewController.h

@interface SubSettingsViewController ()
@property MySettings *settings;
@end

<强> SubSettingsViewController.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];
}