2017-09-26 14 views
0

私はアプリはテーブルビューコントローラおよび編集可能ですUITextViewオブジェクトと詳細ビューに表示されたリストを持っていスウィフト4とiOS 11NSKeyedArchiverを使用してデータを保存するにはどうすればよいですか?

を使用して私の最初のiOSアプリの仕上げに非常に近いと思います。私の目標は、ユーザがUITextViewのコンテンツを編集してNSKeyedArchiverを使ってそれらの変更を保存できるようにすることです。

私は完全なリストビューと詳細ビューを接続しています。編集はできますが、保存はしません。

私は、エントリがセッションを超えて持続するメモリに保存するが、編集内容は保存されないことを確認しました。

ドキュメントのレビューと複数のチュートリアルの作業では、必要な洞察が得られていません。私は、画面が詳細ビューのインタフェースを表示するために撮影し、ここでの保存ボタンが保存アクションをトリガーする詳細ビューコントローラからのコードで接続している。ここで

import UIKit 
import os.log 

class ViewController: UIViewController, UINavigationControllerDelegate, UITextViewDelegate { 

    var season: Season? 

    //MARK: Properties 

    @IBOutlet weak var seasonDetail: UITextView! 
    @IBAction func saveButton(_ sender: UIBarButtonItem) { 
    if let selectedDetail = seasonDetail.text { 
     seasonDetail.text = selectedDetail 
    } else { 
     print("failed to save changes.") 
    } 
    saveChanges() 
    print("Save button clicked") 
    } 

    override func viewDidLoad() { 
    super.viewDidLoad() 

     title = season?.name 
     seasonDetail.text = season?.detail 
    seasonDetail.delegate=self 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
    season?.detail = (seasonDetail?.text)! 
    } 

    func textViewDidEndEditing(_ textView: UITextView) { 
    seasonDetail.text = season?.detail 
    } 

    //MARK: UITextViewdDelegate 

    func textViewShouldReturn(_ textView: UITextView) -> Bool { 
    textView.resignFirstResponder() 

    return true 
    } 


func saveChanges() { 
    print("Saving items to: \(Season.ArchiveURL)") 
    let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(season as Any, toFile: Season.ArchiveURL.path) 

    if isSuccessfulSave { 
     os_log("Season sucessfully saved.", log: OSLog.default, type: .debug) 
    } else { 
     os_log("Failed to save season.", log: OSLog.default, type: .debug) 
    } 
    } 

} 

は、データ・モデル・クラスからのコードです:

import UIKit 
import os.log 

class Season: NSObject, NSCoding { 

    //MARK: Properties 

    var name: String 
    var detail: String 

    //MARK: Archiving Paths 

    static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first! 
    static let ArchiveURL = DocumentsDirectory.appendingPathComponent("season") 

    //MARK: Types 

    struct PropertyKey { 
    static let name = "name" 
    static let detail = "detail" 
    } 


    //MARK: Initialization 
    init?(name: String, detail: String) { 

    guard !name.isEmpty else { 
     return nil 
    } 

    guard !detail.isEmpty else { 
     return nil 
    } 

    // Initialize stored properties 
    self.name = name 
    self.detail = detail 

    } 

    //MARK: NSCoding 

    func encode(with aCoder: NSCoder) { 
    aCoder.encode(name, forKey: PropertyKey.name) 
    aCoder.encode(detail, forKey: PropertyKey.detail) 
    } 

    required convenience init?(coder aDecoder: NSCoder) { 

    // the name is required. If we cannnot get a name string, the initializer should fail. 
    guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String 
     else { 
     os_log("Unable to decode the name for a Season object.", log: OSLog.default, type: .debug) 
     return nil 
    } 

    let detail = aDecoder.decodeObject(forKey: PropertyKey.detail) 

    self.init(name: name, detail: detail as! String) 
    } 
    } 

私の目標は、私のコードで不足しているかを理解し、編集を含むすべてのデータを、永続化する方法を知っていることです。私は助けてくれるどんな方向にも感謝します。

enter image description here

答えて

0

確認してください:

class ViewController: UIViewController, UINavigationControllerDelegate, UITextViewDelegate { 
    var season: Season? 
    @IBOutlet weak var seasonDetail: UITextView! 
    @IBAction func saveButton(_ sender: UIBarButtonItem) { 
     if let selectedDetail = seasonDetail.text { 
      season?.detail = selectedDetail // this is the line 
     } else { 
      print("failed to save changes.") 
     } 
     saveChanges() 
     print("Save button clicked") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     if season == nil { 
      season = Season(name: "Season Name", detail: "Season Details") 
     } 
     title = season?.name 
     seasonDetail.text = season?.detail 
     seasonDetail.delegate=self 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
     season?.detail = (seasonDetail?.text)! 
    } 

    func textViewDidEndEditing(_ textView: UITextView) { 
     season?.detail = seasonDetail.text 
    } 

    //MARK: UITextViewdDelegate 
    func textViewShouldReturn(_ textView: UITextView) -> Bool { 
     textView.resignFirstResponder() 
     return true 
    } 

    func saveChanges() { 
     print("Saving items to: \(Season.ArchiveURL)") 
     let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(season as Any, toFile: Season.ArchiveURL.path) 

     if isSuccessfulSave { 
      os_log("Season sucessfully saved.", log: OSLog.default, type: .debug) 
     } else { 
      os_log("Failed to save season.", log: OSLog.default, type: .debug) 
     } 
    } 
} 
+0

こんにちはViniに、どのように私は、更新された値を示しているのですか?ありがとう。 – fmz

+0

'seasonDetail.text'で詳細を更新しました –

+0

これは動作しますか? –

関連する問題