我正在开发一个从网站上获取数据的应用。当用户点击主页按钮然后再次打开应用程序(从后台),我想再次将数据重新加载到viewController。
我尝试了以下代码:
app appate中的:
class AppDelegate: UIResponder, UIApplicationDelegate {
var myViewController: ViewController?
---------
var myViewController: rootViewController?
func applicationDidEnterBackground(application: UIApplication) {
print("Goodbye world") //.... then whatever code after pressing the home button
}
func applicationWillEnterForeground(application: UIApplication) {
print("Hello World")
myViewController.ObtianData() // which is pretty much the func in my app that fetch data from the web and display it in tableView
}
然后在ViewDidLoad
下的ViewController中 override func viewDidLoad() {
// I added the print to log here to check if the viewDidLoad function is being called but apparently it is not.
print ("Hello again from ViewController")
let appDelegate:AppDelegate = UIApplication.sharedApplication().delegate! as! AppDelegate
appDelegate.myViewController? = self
}
有什么建议吗?
答案 0 :(得分:2)
您遇到的问题的根本原因是您加载的数据附加到显示它的视图控制器。这违背了MVC原则,这表明模型需要与控制器分离。
您应该以在模型和控制器之间分割ObtainData
的方式重新组织类:
创建一个名为Model
的类(或选择其中包含Model
的其他名称)并将表中的数据存储在其中。通过Model.instance
(即implement a Singleton in Swift)从任何地方静态访问该类的单个实例。
将视图控制器更改为依赖Model.instance
获取其数据,而不是将其存储在内部。
这就是你需要做的就是分开应用程序的各个部分。现在您的问题可以通过两行代码来解决 - applicationWillEnterForeground
应该调用Model.instance.obtainData
,而控制器的viewWillAppear
应该调用reloadData
上的tableView
。< / p>
答案 1 :(得分:0)
你应该使用NSNotificationCenter事件UIApplicationDidBecomeActiveNotification,它是专门为此而制作的。
(您不需要使用AppDelegate)
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(
self,
selector: @selector(applicationDidBecomeActive),
name: UIApplicationDidBecomeActiveNotification,
object: nil)
}
func obtianData() {
// do something
}
请注意,swift标准要求函数名称以小写字母开头。
答案 2 :(得分:0)
使用UIApplicationDidEnterBackgroundNotification和UIApplicationDidEnterBackgroundNotification添加通知