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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1164閲覧

ユーザー認証について

sam3457

総合スコア52

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2018/03/31 03:13

プロフィール画面を作っています。
イメージ説明

ユーザー認証画面でゲスト閲覧か認証(新規登録orログイン)をするかで、userdefaultに"login"もしくは"guest"の文字列をcheckとして保存し、それを読み込むことでプロフィール画面にcheckの値が"login"ならばuserdefaultにすでに保存しておいたプロフィール情報をimageviewやtextfieldにセットする。(+それらへの入力操作を許可する)
またはcheckの値が"guest"ならば入力操作を許可せず、名前に”ゲスト閲覧”と表示、imageviewには初期画像を表示する機能を作っております。

⑴ 現在、前述した処理をviewWillApearに書いております。しかしここに書くとアイコン画像を変更するために画像をタップし、画像を選択し終わるとまたviewWillApearの中の処理が呼ばれてせっかく変えたアイコン画像が、元からuserdefaultに保存されていた画像に変わってしまいます。

⑵ この挙動を直すためにviewWillApearの中の処理をviewDidLoadに丸々移し替えたところ、上記の問題点は解決されたものの、ビューがロードされた一度しか呼ばれないためか、下記の画面外の認証画面で他アカウントに変えてログインしたり、新規登録し直した後にまたプロフィール画面に戻ってくると前回のアカウント情報が表示されたままになってしまいます。

⑴、⑵の問題点を同時に両方解決する方法はないでしょうか?

以下が現在のコードです

swift

1 2import UIKit 3import Firebase 4import KRProgressHUD 5 6class EditProfile: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 7 8 @IBOutlet var iconImageView: UIImageView! 9 @IBOutlet var nameTextField: UITextField! 10 @IBOutlet var tapImage: UITapGestureRecognizer! 11 @IBOutlet var changeProfButton: UIButton! 12 13 var ref: DatabaseReference! 14 let userDefault = UserDefaults.standard 15 16 17 override func viewWillAppear(_ animated: Bool) { 18 super.viewWillAppear(true) 19 20 let check = userDefault.object(forKey: "check") as! String 21 22 //ゲスト閲覧ならばプロフ変更を許可しない 23 if check == "guest" { 24 nameTextField.text = "ゲスト閲覧" 25 nameTextField.isEnabled = false 26 iconImageView.image = UIImage(named: "user.png") 27 tapImage.isEnabled = false 28 changeProfButton.isHidden = true 29 30 //正規ユーザーの場合の名前と画像をセット 31 } else if check == "login" { 32 nameTextField.isEnabled = true 33 tapImage.isEnabled = true 34 changeProfButton.isHidden = false 35 36 let username = userDefault.object(forKey: "username") 37 nameTextField.text = username as? String 38 39 if let encodedData = userDefault.object(forKey: "usericon") { 40 let decodedData = Data(base64Encoded: encodedData as! String, options: Data.Base64DecodingOptions.ignoreUnknownCharacters) 41 let decodedImage = UIImage(data: decodedData! as Data) 42 iconImageView.image = decodedImage 43 } 44 45 } 46 47 48 } 49 50 override func viewDidLoad() { 51 super.viewDidLoad() 52 53 nameTextField.delegate = self 54 55 } 56 57 @IBAction func changeIcon(_ sender: UITapGestureRecognizer) { 58 //画像をセット 59 if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { 60 61 let pickerView = UIImagePickerController() 62 pickerView.sourceType = .photoLibrary 63 pickerView.delegate = self 64 self.present(pickerView, animated: true) 65 66 } 67 } 68 69 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 70 71 let image = info[UIImagePickerControllerOriginalImage] as! UIImage 72 iconImageView.image = image 73 dismiss(animated: true) 74 75 76 } 77 78 //userdefaultとサーバに送る 79 @IBAction func changeProfile(_ sender: Any) { 80 81 82 83 //userdefaultに保存 84 85 //名前 86 let username = nameTextField.text 87 userDefault.set(username, forKey: "username") 88 89 //アイコン画像 90 var data: Data = Data() 91 if let image = iconImageView.image { 92 data = UIImageJPEGRepresentation(image, 0.1)! as Data 93 } 94 let encodedIcon = data.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters) as String 95 userDefault.set(encodedIcon, forKey: "usericon") 96 97 98 //サーバに保存 99 let uid = Auth.auth().currentUser?.uid 100 101 //名前はRDBに保存 102 let RDBref = Database.database().reference() 103 let prof: Dictionary = ["username": username] 104 RDBref.child("profs").child(uid!).setValue(prof) 105 106 //アイコンは(初期画像でなければ)Storageに保存 107 if iconImageView.image != UIImage(named: "user.png") { 108 let storageRef = Storage.storage().reference() 109 storageRef.child("usericons").child(uid!).putData(data, metadata: nil) 110 } 111 KRProgressHUD.showSuccess(withMessage: "変更しました") 112 113 } 114 115 //空文字はボタンを隠す 116 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 117 118 if textField.text == "" { 119 changeProfButton.isHidden = true 120 } else { 121 changeProfButton.isHidden = false 122 } 123 return true 124 } 125 126 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 127 textField.resignFirstResponder() 128 return true 129 } 130 131 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 132 nameTextField.resignFirstResponder() 133 } 134 135 override func didReceiveMemoryWarning() { 136 super.didReceiveMemoryWarning() 137 // Dispose of any resources that can be recreated. 138 } 139 140 141 /* 142 // MARK: - Navigation 143 144 // In a storyboard-based application, you will often want to do a little preparation before navigation 145 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 146 // Get the new view controller using segue.destinationViewController. 147 // Pass the selected object to the new view controller. 148 } 149 */ 150 151} 152

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記の方法だといかがでしょうか?

⑴ 写真を変更したかを判定するフラグを変数として保持し、新しくプロフィール画像が選択された場合は、userdefaultからデータを表示しない。(didFinishPickingMediaWithInfoで判定をtrueにする)

例えば、
EditProfileで

var isChanged: Bool = false

を宣言しておき、

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { isChanged = true dismiss(animated: true) }

とすれば、viewWillAppearの処理時に判定ができませんでしょうか?

(2)ログインし直した場合や新規登録された場合はuserdefaultの情報をクリアして設定し直す

投稿2018/03/31 04:45

編集2018/03/31 05:52
newmt

総合スコア1277

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

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

sam3457

2018/03/31 05:39

回答ありがとうございます!いつもお世話になっております。 ⑴のviewWillApearに処理を書き、その上でnewmt様にお教えいただいた方法で修正していく方法でいこうと思い、didFinishPickingMediaWithInfoの記述の仕方を調べたり、QuickHelpを見ながら修正しようとしたのですがどう記述すれば良いかわかりませんでした、、 didFinishPickingMediaWithInfoで判定をtrueにするにはどの様な記述をすれば良いのでしょうか? 連続の質問となって申し訳ありませんが、よろしくお願いいたします
newmt

2018/03/31 05:52

追記しました。このような方法だといかがでしょうか?
sam3457

2018/03/31 09:08

ありがとうございます! imagepickerのメソッドにBoolの値を変える処理を追加するってことなんですね! その後にviewWillAppearの処理をif isChanged == false { }で包んで解決しました。 ありがとうございますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問