如何在 swift 2 中刷新或重新加载应用程序数据

How to refresh or reload app data in swift 2

我在 swift 中编写了应用程序,它有一个视图控制器,我更改了其中的一些设置,例如:所有视图控制器标签和标题都会更改。 但我的问题是,当我更改将它们存储在核心数据中的应用程序设置时,当我从核心数据中获取时,我使用导航栏按钮返回到 parent 视图控制器,但我仍然没有得到相同的数据!但是当我再次访问它时,设置视图控制器会加载正确的数据! 如果我关闭应用程序并重新打开它,应用程序会加载正确的数据! 所以我的问题是如何以编程方式重新加载或重新启动第一个视图控制器或整个应用程序?

为了更好地理解我的问题,下面是我的 parent 包含导航栏的视图控制器。

代码:

import UIKit
import AVKit
import AVFoundation
import CoreData

class playVideo: UIViewController {

    //data source
    var languageDB = [NSManagedObject]()
    let managedContext = AppDelegate().managedObjectContext

    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationItem.hidesBackButton = true
        change_language()
    }

  override func viewDidLayoutSubviews() {
        self.view.setNeedsDisplay()
    }



    override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    change_language()
}



    func change_language(){
        Insert("فارسی")//insert default language
        fetch("Language")
        let Language = languageDB[0]
        let row_value : String = Language.valueForKey("lang") as! String

        if(row_value == "فارسی"){
            self.navigationItem.title = "پخش زنده تصاویر از حرم مطهر رضوی"
            self.navigationItem.backBarButtonItem?.title = "صفحه اصلی"
        }else if(row_value == "English"){
            self.navigationItem.title = "Live broadcast from razavi holy shrine"
            self.navigationItem.backBarButtonItem?.title = "Main Page"
        }else if(row_value == "العربية"){
            self.navigationItem.title = "لايف صور من مقام رضوي"
            self.navigationItem.backBarButtonItem?.title = "صفحةابتدائي"
        }
    }


    //Insert Function
    func Insert(lang : String) {
        let check_empty = entityIsEmpty("Language")
        if(check_empty != true){

            let saveLanguage = NSEntityDescription.insertNewObjectForEntityForName("Language", inManagedObjectContext: managedContext)

            // add our data
            saveLanguage.setValue(lang, forKey: "lang")

            //2
            do {
                try managedContext.save()
                //3
                languageDB.append(saveLanguage)

            } catch let error as NSError  {
                print("Could not save \(error), \(error.userInfo)")
            }


        }//end of check empty if
    }

    //fetch Functions
    func fetch(entity: String){
        let langfetch = NSFetchRequest(entityName: entity)

        do{
            let results = try managedContext.executeFetchRequest(langfetch)
            languageDB = results as! [NSManagedObject]

        }catch{
            fatalError("bad things happend \(error)")
        }

    }

    //check entity is empty Function
    func entityIsEmpty(entity: String) -> Bool
    {

        let request = NSFetchRequest(entityName: entity)

        do{
            let results = try managedContext.executeFetchRequest(request)
            languageDB = results as! [NSManagedObject]

        }catch{
            fatalError("Cant handel entity \(error)")
        }

        if languageDB.count != 0
        {
            return true
        }
        else
        {
            return false
        }


    }


    func Refresh() {
        // Do some reloading of data and update the table view's data source
        // Fetch more objects from a web service, for example...

        self.dismissViewControllerAnimated(true, completion: nil)
        self.navigationController!.dismissViewControllerAnimated(true, completion: nil)
        navigationController!.popViewControllerAnimated(true)
        self.navigationItem.hidesBackButton = true
        change_language()
    }

}

要访问您的应用委托,您不应使用 AppDelegate() 创建一个新委托,而应该获取对当前委托的引用。你可以用

来做到这一点
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext

编辑:话虽如此,我真的不会将 Core Data 用于这样的任务。你最好使用 NSUserDefaults.


试试这个

如果您成功插入并从核心数据中获取数据,您应该调用函数
change_language() 在 vi​​ewWillAppear() 方法中删除 refresh() 方法

它可能对你有帮助

尝试更新您的应用视图控制器或重新加载或重新启动应用

 func reNew(){
        //reload application data (renew root view )
        UIApplication.sharedApplication().keyWindow?.rootViewController = storyboard!.instantiateViewControllerWithIdentifier("Root_View")
    }

Root_View 是您希望它更新的视图控制器,您可以在身份检查器中为您的视图控制器设置标识符。