将数据从一个视图控制器传递到另一个视图控制器

时间:2013-10-26 05:06:31

标签: ios viewcontroller message-passing

我有5个视图控制器,比如A,B,C,D和E,所有这些视图控制器将被推送到导航控制器,如A-> B-> C-> D-> E。

我在A中有一个数组,我需要将它传递给数组E. 在A中,我不应该为E创建对象,反之亦然。

根据我的要求,在viewcontrollers之间传递数据的方法是什么?

3 个答案:

答案 0 :(得分:1)

您可以使用通知中心方法。在视图控制器的viewdidload方法中编写以下代码..

[[NSNotificationCenter defaultCenter] addObserver: self
                                     selector: @selector(anymethod:) 
                                         name: anyname 
                                       object: nil];

和方法..

- (void)anymethod:(NSNotification *)notification 
{
  NSLog(@"%@", notification.userInfo);  
}

并从其他视图控制器传递数据,如

[[NSNotificationCenter defaultCenter] postNotificationName:@"anyname" object:self userInfo:anydata];

答案 1 :(得分:1)

(1)您可以使用NSNotification:

NSNotification有一个名为userInfo的属性,它是一个NSDictionary。对象是发布NSNotification的NSObject。所以我通常在设置NSNotification时使用self作为对象,因为self是发送NSNotification的NSObject。如果您希望使用NSNotification传递NSArray,我会执行以下操作:

NSArray *myArray = ....;
NSDictionary *theInfo = [NSDictionary dictionaryWithObjectsAndKeys:myArray,@"myArray", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self userInfo:theInfo];

然后使用以下内容捕获它:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doTheReload:) name:@"reloadData" object:sendingObject];

其中sendingObject是发送NSNotification的对象。

最后,在doTheReload中解码数组:using:

 NSArray  *theArray = [[notification userInfo] objectForKey:@"myArray"];

这总是对我有用。祝你好运!

(2)ApplicationDelegate:

您还可以在Application委托中声明NSMutableArray,并在A视图控制器中将对象分配给此数组,您可以在视图控制器E中自动获取此数组。

答案 2 :(得分:-1)

很多人推荐AppDelegate并确定它确实有效,因为 AppDelegate本身就是一个单身,但是,你知道,你不应该将一段数据放入一个不属于的类(这就是人们所说的面向对象编程)。无论如何,它确实有用,如果你想节省一点时间,创建一个新类有点麻烦,并且很高兴违反一些旧的面向对象的原则,那么它可能会很好。

通知中心应仅用于通知:某些事件发生在一个地方,另一个对象希望得到通知,可能还有一些关于该事件的数据。不是最好的纯数据共享。性能不是问题,因为它指向函数调用(假设你只是传递指针,而不是复制一些大数据)。

恕我直言,你有两个选择(至少):

创建一个专用于包含数据的单例类。很多资源告诉你如何做到这一点,但基本上Objective-C中的单例类看起来像这样

@interface S 

+(S*)singleton;

@end

@implementation S
+(S*)singleton { // iOS sometimes use 'sharedInstance' instead of 'singleton'
    static S* o = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        o = [[self alloc] init];
    });

    return o;
}

@end

无论何时需要访问它

[S singleton] ...

第二个选项适用于在整个应用程序生命周期中只有一个A实例(如果A是根视图控制器,这种情况经常发生)。在这种情况下,您只需将A转换为单身。您的app delegate中的代码将如下所示

A* a = [A singleton];

UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:a];

E可以使用[A singleton]

访问所有A的数据