2017-12-30 21 views
0

これで2つのView Controllerがあります。 1つのView ControllerがPlist上にあるすべてのセルをロードし、2番目のView Controllerがセルを開き、その説明を表示します。たとえば: ビューコントローラ1: 犬猫 マウスViewController 1に戻ってからviewcontroller 2に戻るときにUserDefaultが保存されない

クリックして犬のセルには、それがコントローラ2を表示するために行くことができます: 犬ウーフを行きます。

ビューコントローラ1が書かれている:

ovverride func prepare(for segue: UIStoryBoardSegue, sender: Any?) { 
     if segue.identifier == "showDetail" { 
     let animals: Animals 
     if isFiltering() { 
      animals = filteredData[indexPath.row] 
      } 
     else { 
      animals = originalData[indexPath.row] 
      } 
      let controller = (segue.destination as! UINavigationController).topViewController as! SecondViewController 
      controller.detailedAnimals = animals 
      controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem 
      contrller.navigationItem.leftItemsSupplementBackButton = true 
      } 
    } 
    } 

これは私がPLISTでBOOLを変更する方法についてのチュートリアルを見

var isFavorite : Bool = false 

@IBAction func addToFav(_ sender:UIButton) { 
    isFavorite = !isFavorite 
    UpdateButtonAppearance() 
    saveData() 
    } 

private func UpdateButtonAppearance(){ 
if isFavorite{ 
     let image = UIImage(named: "addFav") 
     favButton.setImage(image, for: . normal) 
     savedData() 
     } 

    else { 
     let image = UIImage(named: "addFavFilled") 
     favButton.setImage(image, for: . normal) 
     savedData() 
     } 
} 

ovveride func viewDidLoad(){ 
    UpdateButtonAppearance() 
    saveData() 
} 

    //updated code 
    func getFilePath() -> String { 
    var path: [AnyObject] = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) as [AnyObject] 
     let documentsDirectory: String = path[0] as! String 
     let filepath = documentsDirectory.appending("Animals.plist") 
     return filepath 
    } 

func saveData(){ 
    let myDict : NSMutableDictionary = NSMutableDictionary() 
    myDict["fav"] = NSNumber(booleanLiteral: isFavorite) 
    myDict.write(toFile: self.getFilePath(), atomically: true) 
} 

func getBool(){ 
    if FileManager.default.fileExists(atPath: self.getFilePath()) { 
     var myDict = NSDictionary(contentsOfFile: self.getFilePath()) as! 
    [String:AnyObject] 
     let myBool: Bool = myDict["fav"]!.boolValue 
     isFavorite = myBool 
    } 

更新のViewController 2に書いて、それにこれを書いたものです方法。コードはコンパイルされますが、私はそれがbool値を変更しているとは思いません。だから私の動物Plist私は項目0型の辞書を持っています、最初のキーは動物と呼ばれ、タイプは文字列であり、値は "犬"で2番目のキーは説明です、タイプは文字列で、値は "dog goes woof" favは、タイプはBoolで、値はNoですが、この値をYesに変更しようとしていますが、動作していません。また、あなたのコメントにとても感謝しています。

+0

画像ビューに空の画像を常に読み込むように指示したのでしょうか?あなたはあなたのビューがどのように配置されているかは述べていないので、View Controller 2がアンロードされている可能性があります。それが再び読み込まれるとき、 'isFavorite'を無視して毎回空のイメージを使うかもしれません。 – ThatsJustCheesy

+0

したがって、viewcontrollerが毎回アンロードされているかどうかを確認するにはどうすればよいですか?なぜそれが嫌いなのですか?別のものは、2からViewController 3に行き、ViewController 2に戻るときです。しかし、ViewController 1に戻って2に戻ると、星は再び空になります。 – Dkeem

+0

新しいコードでは、 "fav"キーと値だけをplistに書き込んで、他のデータは破棄します。 'saveData'では、新しい辞書を作成し、" fav "NSNumberを追加して書き出します。代わりに、plistの既存のコンテンツ( "動物"辞書の配列を使用しているようです)を使用して、それらを変更します(最初のアイテムに「fav」キーを追加します犬)。また、私が提案するかもしれない場合は、 'UserDefaults'に戻ります。それはより簡単で、これはそれが行うように設計されたものです。 – ThatsJustCheesy

答えて

0

@IBAction func addToFav(_ sender:UIButton)メソッドでイメージを設定したため、2番目のビューコントローラに戻ったときに星印が塗りつぶされません。それはボタンをタップするときです。 didLoad()で呼び出す別のメソッドでコードのその部分を持つ必要があります。

第二ビューコントローラは、このような何かする必要があります。

var isFavorite = UserDefaults.standard.bool(forKey: "isFavorite") 

func didLoad() { 
    super.didLoad() 
    updateButtonAppearance() 
} 

private updateButtonAppearance() { 
    if isFavorite { 
     let image = UIImage(named: "addFavFilled") 
     button.setImage(image, for: . normal) 
    } 

    else { 
     let image = UIImage(named: "addFav") 
     button.setImage(image, for: . normal) 
    } 
} 

@IBAction func addToFav(_ sender:UIButton) { 
    isFavorite = !isFavorite 
    UserDefaults.standard.set(isFavorite, forKey: "isFavorite") 
    updateButtonAppearance() 
} 

はまた、コードがaddToFav方法でUserDefaultsで変数を保存しないように改善することができますが、isFavouriteが変更されるたびに。たぶん後でコードの重複が必要となる別の方法でisFavouriteの状態を変更したいことがあります。

また、UserDefaultsのすべてのペットの値をisFavouriteに保存することにも注意してください。それは、あなたがペット1匹を好むならば、他のペットはすべて好きであり、その逆も同様です。ユーザーのデフォルトのbool値を、各ペットのキーと値としてのブール値を持つ辞書に置き換えることを検討してください。

+0

FYI - ' synchronize'を呼び出す必要はありません。 – rmaddy

+0

@rmaddy - 指摘してくれてありがとう、編集しました。 –

+0

タイはとても犬を驚かせてくれました。私はたくさんの助けになりましたが、あなたはすべての動物をお気に入りに変えてしまったので、私はplistでブール値を作成しましたが、そこで私は上記のコードを更新しました。再度、感謝します – Dkeem

関連する問題