在ViewController和segue之间传递数据的最佳方法

时间:2012-05-06 01:50:32

标签: ios segue viewcontroller

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

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

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

  • 源ViewController执行segue并打包NSDictionary 包含它想要发送的数据(如NSNotifications所做),不知道目标ViewController的特定属性
  • 目标ViewController可以访问NSDictionary,它可以 填补其拥有的数据结构。

有人知道这是否可行?

2 个答案:

答案 0 :(得分:1)

prepareForSegue:sender:是使用故事板时将数据从一个视图控制器传递到另一个视图控制器的首选方法。观看Storyboard session from last year's WWDC;你会看到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的{​​{1}}对字典执行类似操作。我可能只是使用setValuesForKeysWithDictionary:来电,我自己

答案 1 :(得分:0)

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

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

强耦合视图控制器使代码更简单。类的解耦是一个指导原则,目标是降低代码复杂性。如果你的脱钩导致复杂性增加,那么这违背了指南的意图。

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