从 AppDelegate 访问 View Controller 的属性

Posted

技术标签:

【中文标题】从 AppDelegate 访问 View Controller 的属性【英文标题】:Access View Controller's properties from AppDelegate 【发布时间】:2014-10-09 01:40:46 【问题描述】:

我目前有一个使用 Storyboard 的 Xcode 项目。在我的 AppDelegate 中,我需要设置一些包含在其他视图控制器的 .h 文件中的属性,以响应应用收到的通知。

如何在 AppDelegate 中实例化这些视图控制器的对象,以便我可以访问和修改它们的属性?

【问题讨论】:

【参考方案1】:

有一些方法可以让应用程序代理获取正确 vc 的句柄并与之通信,但更好的设计是让信息以相反的方式流动,让视图控制器请求信息并更新自己的属性.

为此,当应用代理收到通知时,让它发布相应的NSNotification(通过NSNotificationCenter)。关心更改的视图控制器可以将自己添加为该通知的观察者并获取信息。他们怎么能得到它?几种方法:

教科书的方法是在应用程序上建立一个模型,可能是一个具有与视图控制器相关的属性的单例。想法二是通过赋予 vcs 可以查询的属性来有效地使您的应用程序委托模型。最后一个想法,postNotificationName:(NSString *)notificationName object:(id)notificationSender userInfo:(NSDictionary *)userInfo 上的 userInfo 参数可以将信息传达给观察者。

编辑 - NSNotificationCenter 非常易于使用。它是这样的:

在 AppDelegate.m 中,当您收到外部通知时:

// say you want a view controller to change a label text and its
// view's background color
NSDictionary *info = @ @"text": @"hello", @"color": [UIColor redColor] ;
[[NSNotificationCenter defaultCenter] postNotificationName:@"HiEverybody" object:self userInfo:info];

在 SomeViewController.m 中,订阅消息:

- (void)viewDidLoad 
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(observedHi:)
                                                 name:@"HiEverybody"
                                               object:nil];


// unsubscribe when we go away
- (void)dealloc 
    [[NSNotificationCenter defaultCenter] removeObserver:self];


// this method gets run when the notification is posted
// the notification's userInfo property contains the data that the app delegate provided
- (void)observedHi:(NSNotification *)notification 

    NSDictionary *userInfo = notification.userInfo;
    self.myLabel.text = userInfo[@"text"];
    self.view.backgroundColor = userInfo[@"color"];

【讨论】:

我真的不知道如何使用 NSNotificationCenter。我将如何添加观察者?另外,指向对象的指针可以存储在字典中吗? 感谢您的解释。对于observedHi 方法,我注意到您没有传入通知参数,尽管它的声明中有一个。 NSNotificationCenter 默认会这样做吗? 当你告诉通知中心你想调用什么(选择器参数)时,你可以给它一个带或不带冒号的选择器。用冒号表示您希望使用参数调用选择器,因此通知中心将通知传递给它(包含用户信息)。 addObserver 不调用该方法,它只是将其名称(在我们的例子中以冒号结尾)传递给通知中心,以便稍后在通知发生时调用。

以上是关于从 AppDelegate 访问 View Controller 的属性的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 从AppDelegate向View Controller添加子视图

如何从 AppDelegate 上的 TabBarController 获取 ViewController?

Swift UI - 如何从外部访问 @State 变量?

从 AppDelegate 重定向到特定屏幕:点击通知

如何从 AppDelegate.m 访问 tabBarController?

UISplitview:从 appDelegate 访问 UITabBarController