私はアプリはテーブルビューコントローラおよび編集可能です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)
}
}
私の目標は、私のコードで不足しているかを理解し、編集を含むすべてのデータを、永続化する方法を知っていることです。私は助けてくれるどんな方向にも感謝します。
こんにちはViniに、どのように私は、更新された値を示しているのですか?ありがとう。 – fmz
'seasonDetail.text'で詳細を更新しました –
これは動作しますか? –