我有5个视图控制器,比如A,B,C,D和E,所有这些视图控制器将被推送到导航控制器,如A-> B-> C-> D-> E。
我在A中有一个数组,我需要将它传递给数组E. 在A中,我不应该为E创建对象,反之亦然。
根据我的要求,在viewcontrollers之间传递数据的方法是什么?
答案 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]