【问题标题】:Elegant way to share and alter an array between view controllers在视图控制器之间共享和更改数组的优雅方式
【发布时间】:2011-05-07 12:40:43
【问题描述】:

我有两个视图控制器:LocationsViewControllerSettingsViewControllerLocationsViewController 符合 SettingsViewControllerDelegate 协议。该协议仅包含 1 个方法:

// SettingsViewControllerDelegate.h
- (void)settingsViewControllerDidFinish:(SettingsViewController *)controller;

当我的LocationsViewController 收到该委托消息时,它会关闭以模态方式呈现的SettingsViewController

到目前为止,我认为这是很好的代码设计。问题是这些视图控制器之间的数据共享。两个视图控制器呈现相同的数据:大约 10 个对象(位置)的数组。只有SettingsViewController 允许更改该数组。

现在我以一种不优雅的方式“解决”了这个问题:两个视图控制器都引用了我的应用委托,而我的应用委托有一个 locations 属性。 SettingsViewController 直接更改该数组。例如:

// SettingsViewController.m
[appDelegate.locations addObject:newLocation];

它有效,但我对此不满意。我知道让您的视图控制器保留对应用程序委托的引用是一件坏事。有什么建议吗?

【问题讨论】:

  • 在这种情况下,您绝对应该使用单例。对于 2016 年,请注意在 Swift 中使用 latest 正确的单例用法。 iOS 具有从上到下的单例(您的应用程序委托是单例,您的加速器是单例,手机上的几乎所有东西都是单例),所以如果不使用单例,除了最简单的 iOS 应用程序之外,您什么也做不了。但是如果你是一个学习者,不要过度使用单例。它们很重要,但要小心对待。

标签: iphone objective-c cocoa-touch oop model-view-controller


【解决方案1】:

您可能想使用观察者来监控我认为的数组中的变化。我可以输入一些内容,但 StackOverFlow 中已经有很好的答案了。

Key Value Observing with an NSArray

【讨论】:

    【解决方案2】:

    对于这种情况,我使用单例Settings 对象。这只是一个NSObject,它具有我的应用程序中的设置方法。我通过调用+[Settings settings] 获得了一个实例。有些设置只是NSUserDefaults 的包装,在这种情况下我只定义静态方法。

    Singleton 也不完全被认为是最佳实践,但它们在 SDK 中被广泛使用(另外,将设置实例传递给每个人很快就会很烦人)。

    【讨论】:

    • 我想这取决于你问谁——有些人认为单例是隐蔽的全局变量,以及使单元测试变得困难等等。
    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 2016-02-04
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多