当应用程序到达前台时,如何重新加载UITableView数据? (Xcode 8.3 / Swift 3)

时间:2017-03-30 01:59:46

标签: ios swift uitableview swift3

我在" 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和编码。任何指导都将不胜感激。谢谢。

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()
}

希望它有所帮助!