2017-12-30 75 views
0

두 개의 뷰 컨트롤러가 있습니다. 한 뷰 컨트롤러는 내 Plist에있는 모든 셀을로드하고 두 번째 뷰 컨트롤러는 셀을 열고 사용자에게 설명을 표시합니다. 보기 컨트롤러 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에서 부울을 변경하는 방법에 대한 자습서를 보았다

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이 쓴과 쓴 것입니다 방법. 코드가 컴파일되지만 bool 값을 변경한다고 생각하지 않습니다. 그래서 내 동물 Plist 난 항목 0 형식 사전, 첫 번째 키는 동물, 유형은 문자열, 값은 "개"이며 두 번째 키는 설명, 유형은 문자열, 값은 "dog goes woof"이고 세 번째 키는 호출됩니다. fav, 타입은 Bool이고 값은 No입니다.하지만이 값을 Yes로 변경하려고 시도하고 있지만 작동하지 않습니다. 또한 따라하기 쉽고 이해하기 쉬운 의견에 너무 감사드립니다.

+0

아마도 이미지보기에서 항상 빈 이미지를로드하도록 말했습니까? 뷰를 정렬하는 방법을 언급하지 않았으므로 뷰 컨트롤러 2가 언로드되고있을 수 있습니다. 다시로드되면 isFavorite를 무시하고 매번 빈 이미지를 사용합니다. – ThatsJustCheesy

+0

그래서 viewcontroller가 매번 언로드되는지 확인하려면 어떻게해야합니까? 왜 그것을 무시하고있는 것은 좋아 하는가? 또 다른 것은 내가 2에서 ViewController 3로 가서 ViewController 2로 돌아갈 때입니다. 별이 아직 채워져 있습니다. 하지만 ViewController 1로 돌아간 다음 다시 2로 돌아 가면 별이 다시 비어 있습니다. – Dkeem

+0

새 코드는 plist에 "fav"키와 값만 쓰고 다른 데이터는 무시합니다. 'saveData'에서 새 사전을 만들고 "fav"NSNumber를 추가 한 다음 작성합니다. 대신, plist의 기존 내용 ("동물"사전을 사용한 것처럼 보입니다)을 사용하고 대신 해당 내용을 수정해야합니다 (예 : 첫 번째 항목에 "fav"키를 추가하십시오. 개). 또한 제안 할 수 있다면'UserDefaults'로 돌아가십시오. 그것은 더 간단합니다. 그리고 이것은 그것이하도록 설계된 일종의 것입니다. – ThatsJustCheesy

답변

0

@IBAction func addToFav(_ sender:UIButton) 방법으로 이미지를 설정했기 때문에 두 번째보기 컨트롤러로 돌아 가면 별표가 채워지지 않습니다. 그 때 당신이 버튼을 누릅니다. 코드의 해당 부분을 didLoad()이라고도하는 다른 방법으로 사용해야합니다.

또한 코드가 addToFav 방법 UserDefaults에서 변수를 저장하지 않도록 개선 할 수
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() 
} 

하지만 때마다 isFavourite 변경 :

2보기 컨트롤러는 다음과 같이해야한다. 나중에 코드 중복이 필요한 다른 방법으로 isFavourite의 상태를 변경하려고합니다.

또한 모든 애완 동물의 값을 isFavourite 아래의 UserDefaults에 저장합니다. 즉, 한 애완 동물을 선호한다면 다른 애완 동물들은 모두 선호 될 것이며 그 반대도 마찬가지입니다. 사용자 기본값의 bool 값을 각 애완 동물의 키가 있고 값으로 부울이있는 사전으로 바꾸는 것을 고려하십시오.

+0

참고 - '동기화'를 호출 할 필요가 없습니다. – rmaddy

+0

@rmaddy - 지적 해 주셔서 고마워요. –

+0

타이는 그 말을 많이 쓰는데 도움이되었지만 당신이 좋아하는 모든 동물을 바꿔 놓았 기 때문에 나는 plist에서 부울을 만들었지 만 그 안의 값은 바꿀 수 없다고 생각합니다. 그래서 위의 코드를 업데이트했습니다. 다시 한 번 감사드립니다. – Dkeem