Objective-C – 从应用程序委托向视图控制器发送消息

Posted

技术标签:

【中文标题】Objective-C – 从应用程序委托向视图控制器发送消息【英文标题】:Objective-C – Message a view controller from application delegate 【发布时间】:2011-10-03 13:52:32 【问题描述】:

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

下载一些数据后,我想将此数据设置为视图控制器中的NSArray 属性。如果我有一个名为data 的 NSArray(非原子,保留)综合属性,我想做[viewController setData:downloadedData];

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

我的应用程序结构是一个标签栏控制器作为根控制器。

【问题讨论】:

您的应用程序结构是什么? (你有导航控制器,标签控制器)? NSNotification 在这种情况下也可能有用... 我正在使用标签栏控制器... 【参考方案1】:

您需要使用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];

【讨论】:

别忘了用[[NSNotificationCenter defaultCenter] removerObserver:self];来阻止控制器观察通知名称。 是的,如果你不把它放在你的 dealloc 方法中,你的对象将不会释放并且会泄漏内存。 为什么这种方法比对实例化视图控制器使用 setter 更受欢迎? 它变得一团糟。您最终将在您的应用程序委托中构建视图控制器,然后从您的视图控制器调用您的应用程序委托来设置属性,然后从您的应用程序委托调用您的视图控制器。让我想起了追尾巴的狗。如果您愿意,您还可以观察来自其他对象的通知。 我不确定“从您的视图控制器调用您的应用程序委托以设置属性”是什么意思。我正在考虑在应用程序委托中调用视图控制器的设置器。无论如何,只是为了好玩,如果我愿意,我将如何从我的应用程序委托中调用视图控制器?【参考方案2】:

在您的应用委托类中添加 delegateComplete 属性:

//define ivar
id delegateComplete;

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

//synthesize
@synthesize delegateComplete;

在视图控制器的 init 方法或 viewDidLoad 中执行以下操作:

MainClass *appDelegate = (MainClass *)[[UIApplication sharedApplication] delegate];
appDelegate.delegateComplete = self;

将 MainClass 替换为您的应用程序类。下载完成后,在您的应用代理中执行以下操作:

[delegateComplete loadingCompletedWithData:data];

不要忘记在你的 viewController 中添加这个方法:

- (void)loadingCompletedWithData:(NSData *)data

发生的情况是您的视图控制器注册到您的应用委托。加载完成后,如果您的视图控制器已注册,则调用 loadingCompletedWithData。正确的做法是通过协议。

【讨论】:

除了这个分析器:别忘了在应用代理中导入你的视图控制器。

以上是关于Objective-C – 从应用程序委托向视图控制器发送消息的主要内容,如果未能解决你的问题,请参考以下文章

使用委托从按钮传递信息以突出显示单元格

Objective-c (iOS) 中常见的 HTTP 请求委托模式

Objective-C - CABasicAnimation 在动画后应用更改?

对Objective-C中的委托有点困惑

如何从人员选择器委托方法返回两个视图控制器

使用委托从 UIView 子类向 UIViewController 发送数据