Objective c 目标-C–;来自应用程序委托的视图控制器消息

Objective c 目标-C–;来自应用程序委托的视图控制器消息,objective-c,cocoa-touch,uiapplicationdelegate,Objective C,Cocoa Touch,Uiapplicationdelegate,我想在中的应用程序委托中下载一些数据-application:didfishlaunchingwithoptions: 下载一些数据后,我想将这些数据设置为视图控制器中的NSArray属性。如果我有一个名为data的NSArray(非原子,retain)的合成属性,我想执行[viewController setData:downloaddeddata] 如何从应用程序委托调用活动的viewController实例 我的应用程序结构是作为根控制器的选项卡栏控制器。您需要使用NSNotificati

我想在
中的应用程序委托中下载一些数据-application:didfishlaunchingwithoptions:

下载一些数据后,我想将这些数据设置为视图控制器中的
NSArray
属性。如果我有一个名为
data
的NSArray(非原子,retain)的合成属性,我想执行
[viewController setData:downloaddeddata]

如何从应用程序委托调用活动的viewController实例


我的应用程序结构是作为根控制器的选项卡栏控制器。

您需要使用
NSNotificationCenter
,它将向订阅该特定消息的所有对象广播消息

在视图控制器中,订阅通知:

[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(downloadedData:) 
    notificationName:@"DownloadedData" 
    object:data];

- downloadedData:(NSNotification *)notification {
    self.data = notification.object;
}
在您的应用程序中,代理将通知发送给订阅者:

[[NSNotificationCenter defaultCenter] 
    postNotificationName:@"DownloadedData" 
    object:data];

在应用程序委派类中添加delegateComplete属性:

//define ivar
id delegateComplete;

//define property
@property (nonatomic, retain) id delegateComplete;

//synthesize
@synthesize delegateComplete;
在viewController的init方法或viewDidLoad中,执行以下操作:

MainClass *appDelegate = (MainClass *)[[UIApplication sharedApplication] delegate];
appDelegate.delegateComplete = self;
将MainClass替换为应用程序类。下载完成后,请在应用程序中执行以下操作:

[delegateComplete loadingCompletedWithData:data];
不要忘记在viewController中添加此方法:

- (void)loadingCompletedWithData:(NSData *)data

发生的情况是,视图控制器注册到应用程序代理。加载完成后,如果视图控制器已注册,请调用loadingCompletedWithData。正确的方法是通过协议。

您的应用程序结构是什么?(您是否有导航控制器、选项卡控制器)?此外,NSNotification在这种情况下可能很有用……我使用的是一个选项卡栏控制器……不要忘记使用
[[NSNotificationCenter defaultCenter]RemoveObserver:self]阻止控制器观察通知名称。是的,如果不将其放在
dealloc
方法中,对象将不会释放并泄漏内存。为什么此方法比为实例化的视图控制器使用setter更可取?它会变得混乱。您将在应用程序委托中构造视图控制器,然后从视图控制器调用应用程序委托以设置属性,然后从应用程序委托调用视图控制器。让我想起一条狗在追逐它的尾巴。如果愿意,您也可以观察其他对象发出的通知。我不确定“从视图控制器调用应用程序代理以设置属性”是什么意思。我正在考虑在app委托中调用视图控制器的setter。不管怎样,只是为了好玩,如果我想从我的应用程序代理调用视图控制器,我将如何调用它?此外,还有一个问题:不要忘记在应用程序代理中导入您的视图控制器。