2

我阅读了一些关于使用 segues 将数据从 ViewController 传递到另一个的教程。

恕我直言,通用方法不太好:源 ViewController 可以获得对目标 ViewController 的引用,以便它可以在目标 ViewController 中设置一些属性。但是源 ViewController 知道目标 ViewController 的某些部分的事实必然会减少对象之间的解耦。

我想知道是否有可能采用像这样的更通用的方法:

  • 源 ViewController 执行一个 segue 并打包一个包含它想要发送的数据的 NSDictionary(就像 NSNotifications 一样),而不知道目标 ViewController 的特定属性
  • 目标 ViewController 可以访问 NSDictionary 并且可以填充自己的数据结构。

任何人都知道这是否可能?

4

2 回答 2

1

prepareForSegue:sender:是使用情节提要时将数据从一个视图控制器传递到另一个视图控制器的首选方式。观看去年 WWDC 的 Storyboard 会议;您会看到 Apple 也推荐这种方法。

重申一下 sobri 所说的,视图控制器代码通常包含应用程序的“业务逻辑”,因此通常是应用程序中可重用性最低的代码。在撰写本文时,我在应用商店中有 7 个应用,而且我从未重用过任何重要的视图控制器代码。

如果你想提供最细微的抽象(例如,避免对目标视图控制器的硬依赖),你可以像下面这样。我的一个应用程序中几乎有这个确切的代码。

- (void) prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
    if( [[segue identifier] isEqualToString:@"showLog"] ) {
        UIViewController* logView = segue.destinationViewController;
        if( [logView respondsToSelector:@selector(setManagedObjectContext:)] ) {
            [logView setValue:self.managedObjectContext forKey:@"managedObjectContext"];
        }
    }
}

你可以用字典做类似的事情,使用NSKeyValueCoding's setValuesForKeysWithDictionary:。我自己可能只会multiple setValue:forKey:打电话

于 2012-08-19T03:07:18.687 回答
0

这是意见,但我认为视图控制器不符合面向对象的纯度。

视图控制器非常特定于单个应用程序的架构,通常不适合一般消费。至少在我看来,通用类和明确设计用于以一种方式仅使用一个应用程序的类之间存在明显差异。

强耦合的视图控制器可以减少复杂的代码。类的解耦是一个以降低代码复杂性为目标的指导方针。如果您的解耦导致复杂性增加,那么这违背了指南的意图。

所以更直接地回答:我认为在视图控制器之间传递数据的最佳方式是让发送视图控制器知道接收视图控制器的接口,并直接将变量传递给它。否则可能被认为是过早的优化。

于 2012-08-09T13:27:16.343 回答