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