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 请求委托模式