我有一个View Controller,其值为0(标签),当我从另一个 ViewController
打开View Controller时,我已将 viewDidAppear
设置为标签上的值20 . 它工作正常,但当我关闭我的应用程序,而不是再次打开我的应用程序,但值不会更改,因为 viewDidLoad
, viewDidAppear
和 viewWillAppear
没有被调用 . 我打开应用程序时如何打电话 . 我是否必须做 applicationDidBecomeActive
的任何事情?
8 回答
Using Objective-C
您应该在
ViewController
的viewDidLoad
方法中注册UIApplicationWillEnterForegroundNotification
,每当应用程序从后台返回时,您可以在注册通知的方法中执行任何操作 . 当应用程序从后台返回到前台时,将不会调用ViewController
的 viewWillAppear 或 viewDidAppear .不要忘记取消注册您注册的通知 .
Note 如果您为
UIApplicationDidBecomeActiveNotification
注册viewController
,则每次应用程序生效时都会调用您的方法,不建议为此通知注册viewController
.Using Swift
要添加观察者,您可以使用以下代码
要删除观察者,您可以使用swift的deinit函数 .
Swift 4.2 . 版
在
viewDidLoad
注册NotificationCenter,以便在应用程序从后台返回时收到通知实现应该调用的方法 .
一旦
ViewController
被销毁,您可以删除观察者 . 这仅在iOS9和macOS 10.11下方需要尝试在AppDelegate applicationWillEnterForeground中添加它 .
根据Apple的文档:
Description:
告诉儿童控制器它的外观即将改变 . 如果要实现自定义容器控制器,请使用此方法告诉子项其视图即将为 appear or disappear . Do not invoke viewWillAppear:, viewWillDisappear:, viewDidAppear:, or viewDidDisappear: directly .
Description:
告诉儿童控制器它的外观已经改变 . 如果要实现自定义容器控制器,请使用此方法告诉子项视图转换已完成 .
Sample code:
问题: How I fixed?
Ans :我在申请中发现了这条线 . 这条线使我的应用程序无法收到任何ViewWillAppear通知 . When I commented these lines it's working fine .
Swift 3.0版
在
viewDidLoad
中,在通知中心注册以收听从后台操作打开的内容然后添加此功能并执行所需的操作
最后添加此函数以在视图控制器被销毁时清理通知观察器 .
对事件的确切顺序感到好奇,我按如下方式对应用程序进行了检测:(@ Zohaib,您可以使用下面的NSNotificationCenter代码来回答您的问题) .
在启动时,输出如下所示:
输入背景然后重新进入前景:
我认为注册UIApplicationWillEnterForegroundNotification是有风险的,因为你最终可能会有多个控制器对该通知作出反应 . 收到通知后,这些控制器仍然可见,这些都没有任何保证 .
这是我的工作:我直接从App的委托didBecomeActive方法强制在活动控制器上调用viewDidAppear:
将以下代码添加到
- (void)applicationDidBecomeActive:(UIApplication *)application
只需让您的视图控制器注册
UIApplicationWillEnterForegroundNotification
通知并做出相应的反应 .