2016-02-26 72 views
1

我在swift中編寫了應用程序,它有一個視圖控制器,我更改了其中的一些設置,例如:所有視圖控制器標籤和標題都會更改。 但我的問題是,當我更改應用程序設置,我將它們存儲在覈心數據中,並且當我從核心數據獲取時,我使用導航欄按鈕返回到父視圖控制器,我什麼也得不到相同的數據!但設置視圖控制器,當我再次去它加載正確的數據! 如果我關閉了應用程序並重新打開它,該應用程序將加載正確的數據! 所以我的問題是如何重新加載或重新啓動編程的第一個視圖控制器或整個應用程序?如何在swift中刷新或重新加載應用程序數據2

爲了更好的理解我的問題,下面是我的父視圖控制器裏面包含的導航欄。

代碼:

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

} 
+0

不要大寫'Insert'和'Refresh'函數名稱!它使你的代碼非常難讀。 –

+0

@TimVermeulen感謝提示 – anonymox

回答

2

嘗試更新您的應用程序的視圖控制器代替或重新加載或重新推出應用

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

Root_View被認爲續您希望它更新的滾筒,您可以在身份檢查員中爲視圖控制器設置標識符。

0

要訪問您的應用程序代理,你不應該創建一個新的與AppDelegate(),而是你應該爲現在的一個參考。你可以這樣做

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
let managedContext = appDelegate.managedObjectContext 

編輯:話雖如此,我真的不會使用核心數據這樣的任務。你使用NSUserDefaults好多了。

+0

當我更改應用程序委託給你的方法時,我得到的實例成員'appDelegate'不能用於'playVideo'類型的錯誤信息。 – anonymox

0


試試這個

如果成功插入,並從核心數據讀取數據,你應該把你的函數調用在viewWillAppear中()方法
change_language(),並刪除刷新()方法

它可以幫助你

+0

我已將我的代碼更新爲您所說的內容,但沒有結果!抓取和插入方法正常工作,但不知道爲什麼不刷新! – anonymox

相關問題