如何在调用applicationDidBecomeActive时告诉活动视图控制器?

Dav*_*ohn 18 iphone ios xcode-storyboard swift

我觉得我在这里错过了一招

我只想在调用applicationDidBecomeActive时调用当前活动视图控制器上的viewDidLoad或viewDidAppear,这样当我再次从后台启动应用程序时,我可以重置一些动画或其他任何动画.我的一些观点并不关心,但其他人真的需要知道.

我正在使用Storyboards,我的app委托文件具有标准功能 - 但所有都使用EMPTY主体.例如,didFinishLaunchingWithOptions只返回YES而不执行任何操作.故事板自动完成我猜的一切.

那么如何从我相当空白,无信息的应用代表那里与当前的视图控制器进行通信?

Ben*_*ron 55

操作系统不会从您的应用代理发送通知,而是自动发送通知,您可以观察到:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(initSongInfo)
                                             name:UIApplicationDidBecomeActiveNotification
                                           object:nil];
Run Code Online (Sandbox Code Playgroud)

当然,请确保在dealloc方法之前或之内的某个时间停止观察,方法是:

[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIApplicationDidBecomeActiveNotification 
                                              object:nil];
Run Code Online (Sandbox Code Playgroud)

  • 这是比Brandon Brodjeski目前接受的答案更好的解决方案. (3认同)
  • 这是正确的方法 (2认同)

Bra*_*ski 22

我建议使用通知.

在您的app代理的applicationDidBecomeActive方法中放入此代码:

[[NSNotificationCenter defaultCenter] postNotificationName:@"appDidBecomeActive" object:nil];
Run Code Online (Sandbox Code Playgroud)

在当前的活动视图控制器的init方法中订阅通知.

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(updateStuff)        
                                             name:@"appDidBecomeActive" 
                                           object:nil];
Run Code Online (Sandbox Code Playgroud)

在您的控制器中实现"updateStuff"方法,您应该能够在应用程序变为活动状态时执行任何操作.

  • 使用现有的UIApplicationDidBecomeActiveNotification通知,查看einsteinx2对更优雅解决方案的回答. (4认同)
  • 不应该忘记在dealloc中删除Observer,因为在所有情况下都不会调用viewDidUnload (2认同)

Ras*_*n L 6

迅捷版:

您可以在 viewDidLoad 中添加此行

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(viewDidBecomeActive), name: UIApplicationDidBecomeActiveNotification, object: nil)

func viewDidBecomeActive(){
    print("viewDidBecomeActive")
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特 5.x 版本

NotificationCenter.default.addObserver(self, selector: #selector(viewDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)

@objc func viewDidBecomeActive() {
    print("viewDidBecomeActive")
}
Run Code Online (Sandbox Code Playgroud)