我在" ViewController"中有以下方法;用于从GET API调用中填充UITableView中的自定义单元格的类。这在应用程序首次加载时工作正常。
//ViewController
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
loadDataInUITableViewCell()
}
func loadDataInUITableViewCell() {
apiCentral.sharedInstance.fetchData() {
result in
guard result.error == nil else {
self.handleError(result.error!)
return
}
if let fetchedData = result.value {
self.data = fetchedData
}
self.messagesTableView.reloadData()
}
}
当应用程序到达前台时,如何刷新数据?好吧,我在AppDelegate中添加了以下内容来运行" loadDataInUITableViewCell"方法,以便重新加载数据。
//AppDelegate
let mainViewController = ViewController()
func applicationWillEnterForeground(_ application: UIApplication) {
mainViewController.loadDataInUITableViewCell()
}
问题:上述机制运行正常但是,当应用程序到达前台时,我收到以下错误。
"致命错误:在展开可选值时意外发现nil"
问题似乎发生在" self.messagesTableView.reloadData()"代码行。我在Swift 3中使用Xcode 8.3和编码。任何指导都将不胜感激。谢谢。
答案 0 :(得分:1)
NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: .UIApplicationWillEnterForeground, object: nil)
在viewWillAppear()
中写下以上这一行func willEnterForeground() {
tableView.reloadData()
}
在ViewController中使用上面的代码,其中有UITableView
答案 1 :(得分:0)
解决方案1.在appdelegate:
//AppDelegate let mainViewController : ViewController? func applicationWillEnterForeground(_ application: UIApplication) { mainViewController.loadDataInUITableViewCell() }
在你的viewcontroller中:
//ViewController
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
(UIApplication.sharedApplication().delegate as! AppDelegate).mainViewController = self
loadDataInUITableViewCell()
}
解决方案2.
在viewcontroller中听:
//ViewController
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
NSNotificationCenter.defaultCenter().addObserver(self, selector:#selector(ViewController.loadDataInUITableViewCell(), name: UIApplicationWillEnterForegroundNotification, object: nil)
loadDataInUITableViewCell()
}
答案 2 :(得分:0)
UIApplicationWillEnterForeground 通知
在应用程序离开后台状态之前不久发布,即成为活动应用程序。
<强>讨论强>
通知的对象是UIApplication对象。没有userInfo字典。
<强>声明强>
static let UIApplicationWillEnterForeground: NSNotification.Name
来自Apple的文档。
它非常易于使用:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(self.handler), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)
}
func handler() {
// self.tableView.reloadData()
}
希望它有所帮助!