关于ios:将数据从一个视图控制器传递到另一个视图控制器

passing data from one view controller to another view controller

本问题已经有最佳答案,请猛点这里访问。

我有5个VIEW控制器,比如A、B、C、D和E,所有这些VIEW控制器将被推到导航控制器上,作为-> B-> C--> D -E。

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

根据我的要求,在视图控制器之间传递数据的方法是什么?


(1)您可以使用nsnotification:

nsnotification具有一个名为userinfo的属性,该属性是nsdictionary。对象是正在发布nsnotification的nsObject。所以通常我在设置nsnotification时使用self作为对象,因为self是发送nsnotification的nsobject。如果您希望使用nsnotification传递nsarray,我将执行以下操作:

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

然后用以下方法捕捉:

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

其中sendingObject是发送nsnotification的对象。

最后,在dothereload中解码数组:使用:

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

这对我来说总是有效的。祝你好运!

(2)应用委托:

您还可以在应用程序委托中声明NSmutableArray,并在视图控制器中将对象分配给该数组,并且可以在视图控制器E中自动获取该数组。


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

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

方法。

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

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

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


许多人建议使用AppDelegate,并确信它确实有效,因为AppDelegate本身是单例的,但是,你知道,你不应该将一段数据放入它不属于的类中(这就是人们所说的面向对象编程)。不管怎样,它确实有效,如果你想节省一点时间,在创建一个新类时遇到一些麻烦,并且乐于违反一些旧的面向对象原则,那么可能会很好。

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

imho,您有两种选择(至少):

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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

无论何时你需要访问它

1
[S singleton] ...

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

1
2
3
A* a = [A singleton];

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

E可以用[A singleton]访问所有A的数据。