質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

2553閲覧

swift言語のデータ保存と読み込みについて

shin_like

総合スコア14

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/01/17 09:06

swift言語の学習をしていて、現在データ保存と読み込みについて学習しています。

saveボタンを押すとテキストフィールドの文字が保存され、switchボタンを押すと保存された文字列が表示され、文字列が表示されている場合はその文字列を消去するプログラムを書いたのですが、実行してみるとデータ保存がうまくいっていないようでした。
どこに問題があるのでしょうか。回答をお願いします。

以下ソースコードです

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var word1: UITextField!

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

@IBAction func save1(sender: AnyObject) {
let ud1a = NSUserDefaults.standardUserDefaults()
ud1a.setObject(word1.text, forKey: "saveText1")
}

@IBAction func switch1(sender: AnyObject) {
let ud1b = NSUserDefaults.standardUserDefaults()

if(word1.text == nil){
var loadText1:String! = ud1b.stringForKey("saveText1")
word1.text = loadText1
}
else{
word1.text = nil
}

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2016/01/17 09:21

データを読み込むところで、 if(word1.text == nil)という条件分岐しているのは、何故ですか?
shin_like

2016/01/17 09:29

テキストボックスに文字列があれば文字を消去し、なければ表示をするプログラムにしたかったからです。 単語帳みたいなものを作りたかったもので、実際はこのテキストボックスとボタンをもう一セットつくる予定です。1と数字がついているのはそのためです。
guest

回答2

0

文字列が無い(nil)と文字列が空っぽ("")は、見た目で区別できません。
条件式を見直してみてください。

Swift

1if(word1.text == nil || word1.text == ""){ 2 var loadText1:String! = ud1b.stringForKey("saveText1") 3 word1.text = loadText1 4} 5else{ 6 word1.text = nil 7}

投稿2016/01/17 09:44

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shin_like

2016/01/17 10:11

回答ありがとうございます。 nilと文字列が空っぽの状態は同一と勘違いしておりました。 ベストアンサーについては、回答の早かった方にさせていただきたいと思います。 重ねてお礼を申し上げます。
guest

0

ベストアンサー

保存した後に以下のメソッドを呼んであげてください。

Swift

1ud1a.synchronize()

余談ですがソースコードを貼り付ける場合は</>ボタンを押してその中に書いてもらえると見やすくなります。

投稿2016/01/17 09:11

編集2016/01/17 09:19
u39ueda

総合スコア950

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shin_like

2016/01/17 09:33

回答ありがとうございます。 ご指摘の通りの文章を追加したのですが、ud1a.setObjectの下でいいのでしょうか そこに記述しても変化がありませんでしたが、他にも修正点があるのでしょうか
u39ueda

2016/01/17 09:42

それでは別の場所が問題あるのかもしれませんね。 > 実行してみるとデータ保存がうまくいっていないようでした。 こう判断した根拠は何でしょうか? また、ボタンやスイッチを押した時にメソッドはちゃんと呼ばれていますでしょうか? 保存された文字列を復元する時、 `func switch1(sender: AnyObject)` が呼ばれた時の `word1.text` の中身はどうなっているでしょうか?
u39ueda

2016/01/17 09:53

回答していないのに気がつきました。すみません。 > ud1a.setObjectの下でいいのでしょうか はい。そこで大丈夫です。
shin_like

2016/01/17 10:09

返信ありがとうございます。 セーブができていない根拠は、条件式を外して読み込みをさせ、テキスト出力を試した結果、何も出なかったからそうだと判断しました。 結果、synchronizeがなかったのがデータ保存できなかった原因で、上の方の回答の通り、if文にも問題があったため、このような事態になった次第でした。synchronizeを入れた後もif文を外してちゃんと途中経過を確認するべきでした。 お騒がせいたしました。重ねてお礼を申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問