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

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

ただいまの
回答率

87.59%

textFieldの値が全てのtextLabelに入ってしう問題を解決したいです。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 535

score 6

class SettingsViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextFieldDelegate {


    @IBOutlet weak var usericonView: UIImageView!

    @IBOutlet weak var nickNameTextField: UITextField!

    @IBOutlet weak var userNameTextField: UITextField!

    @IBOutlet weak var sendEmailTextField: UITextField!

    @IBOutlet weak var sendPhoneNumber: UITextField!

    @IBOutlet weak var nextSendEmailTextField: UITextField!

    @IBOutlet weak var nextSendPhoneNumber: UITextField!



    @IBOutlet weak var nickNameLabel: UILabel!

    @IBOutlet weak var userNameLabel: UILabel!

    @IBOutlet weak var sendEmailLabel: UILabel!

    @IBOutlet weak var sendPhoneLabel: UILabel!

    @IBOutlet weak var nextSendEmailLabel: UILabel!

    @IBOutlet weak var nextSendPhoneLabel: UILabel!


    var nickNameText:String = "ニックネームを入力"
    var userNameText:String = "名前を入力"
    var sendEmailText:String = "送り先Emailを入力"
    var sendPhone:String = "電話番号を入力"
    var nextSendEmailText:String = "送り先Email-2を入力"
    var nextSendPhone:String = "電話番号-2を入力"


    let userDefaults = UserDefaults.standard



    override func viewDidLoad() {
        super.viewDidLoad()



        nickNameTextField.delegate = self
        userNameTextField.delegate = self
        sendEmailTextField.delegate = self
        sendPhoneNumber.delegate = self
        nextSendEmailTextField.delegate = self
        nextSendPhoneNumber.delegate = self

        userDefaults.register(defaults: ["NickName": "ニックネームを入力"])
        nickNameLabel.text = readData(key: "NickName")

        userDefaults.register(defaults: ["UserName": "名前を入力"])
        userNameLabel.text = readData(key: "UserName")

        userDefaults.register(defaults: ["SendEmail": "Emailを入力"])
        sendEmailLabel.text = readData(key: "SendEmail")

        userDefaults.register(defaults: ["SendPhone": "電話番号を入力"])
        sendPhoneLabel.text = readData(key: "SendPhone")

        userDefaults.register(defaults: ["NextSendEmail": "Emailを入力"])
        nextSendEmailLabel.text = readData(key: "nextSendEmail")

        userDefaults.register(defaults: ["NextSendPhone": "電話番号を入力"])
        nextSendPhoneLabel.text = readData(key: "NextSendPhone")

    }

    //アルバムの写真を選択してアイコンとして表示する。
    @IBAction func toAlbumButton(_ sender: Any) {

        let picker = UIImagePickerController()
        picker.sourceType = .photoLibrary
        picker.delegate = self
        present(picker, animated: true)
        self.present(picker, animated: true, completion: nil)

    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let selectedImage = info[.originalImage] as? UIImage{
            usericonView.image = selectedImage
        }
        self.dismiss(animated: true)
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        self.dismiss(animated: true, completion: nil)
    }

    //テキスト入力設定

    func textFieldShouldReturn(_ textField: UITextField) -> Bool{
        nickNameText = textField.text!
        nickNameLabel.text = nickNameText

        userNameText = textField.text!
        userNameLabel.text = userNameText

        sendEmailText = textField.text!
        sendEmailLabel.text = sendEmailText

        sendPhone = textField.text!
        sendPhoneLabel.text = sendPhone

        nextSendEmailText = textField.text!
        nextSendEmailLabel.text = nextSendEmailText

        nextSendPhone = textField.text!
        nextSendPhoneLabel.text = nextSendPhone


        textField.resignFirstResponder()

        saveData(str: nickNameText)
        saveData(str: userNameText)
        saveData(str: sendEmailText)
        saveData(str: sendPhone)
        saveData(str: nextSendEmailText)
        saveData(str: nextSendPhone)

        return true

    }

    func saveData(str: String){
        userDefaults.set(str, forKey: "NickName")
        userDefaults.set(str, forKey: "UserName")
        userDefaults.set(str, forKey: "SendEmail")
        userDefaults.set(str, forKey: "SendPhone")
        userDefaults.set(str, forKey: "NextSendEmail")
        userDefaults.set(str, forKey: "NextSendPhone")
    }

    func readData(key: String) -> String {
    let config = UserDefaults.standard
    let str: String = config.string(forKey: key) ?? ""
    return str
    }


    @IBAction func hozonButtton(_ sender : AnyObject) {


        userDefaults.set(true, forKey: "NickName")
     let str: String = userDefaults.object(forKey: "NickName") as! String
     nickNameLabel.text = str

        userDefaults.set(true, forKey: "UserName")
        let _: String = userDefaults.object(forKey: "UserName") as! String
        nickNameLabel.text = str

        userDefaults.set(true, forKey: "SendEmail")
        let _: String = userDefaults.object(forKey: "SendEmail") as! String
        nickNameLabel.text = str

        userDefaults.set(true, forKey: "SendPhone")
        let _: String = userDefaults.object(forKey: "SendPhone") as! String
        nickNameLabel.text = str

        userDefaults.set(true, forKey: "NextSendemail")
        let _: String = userDefaults.object(forKey: "NextSendEmail") as! String
        nickNameLabel.text = str

        userDefaults.set(true, forKey: "NextSendPhone")
        let _: String = userDefaults.object(forKey: "NextSendPhone") as! String
        nickNameLabel.text = str

        nickNameLabel.text = str
        userNameLabel.text = str
        sendEmailLabel.text = str
        sendPhoneLabel.text = str
        nextSendEmailLabel.text = str
        nextSendPhoneLabel.text = str


        print()

    }


}

コード

textFieldに値を入れると全てのtextLabelに同じ値が入ってします。また、保存ボタンを押すとエラーになります。```import UIKit

@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {         // Override point for customization after application launch.         return true     }

    // MARK: UISceneSession Lifecycle

    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {         // Called when a new scene session is being created.         // Use this method to select a configuration to create the new scene with.         return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)     }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {         // Called when the user discards a scene session.         // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.         // Use this method to release any resources that were specific to the discarded scenes, as they will not return.     }

}

コード

エラーになります。  
hread 1: Exception: "-[KidsSosApp.SettingsViewController hozonButton:]: unrecognized selector sent to instance 0x7ff6a3832600"  
です。  
### 前提・実現したいこと  

ここに質問の内容を詳しく書いてください。  
textfieldに入れた値をtextLabelに表示させて保存する。というのを作成中です。  
それぞれのtextFieldの値をtextLabelに入れたいのに最後に入れた値が全てのtextLabelに  
はいってしまします。  
また、保存ボタンを押すと表題のエラーコードが発生しました。  

### 発生している問題・エラーメッセージ  

hread 1: Exception: "-[KidsSosApp.SettingsViewController hozonButton:]: unrecognized selector sent t

### 該当のソースコード  

ここに言語名を入力 ソースコード ```

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2020/04/14 07:31

    コードを提示しましょう

    キャンセル

  • Eijirou

    2020/04/14 09:10

    すみません。使い慣れてないんで(汗

    キャンセル

回答 3

+1

     let str: String = userDefaults.object(forKey: "NickName") as! String
     nickNameLabel.text = str


この行ではUserDefaultsから得られた文字列をstrという変数に入れていますが、これ以降の行

        userDefaults.set(true, forKey: "UserName")
        let _: String = userDefaults.object(forKey: "UserName") as! String


では、UserDefautlsで得られた文字列をワイルドカード(_)に入れているため、実質捨ててしまっています。

また、

        nickNameLabel.text = str
        userNameLabel.text = str
        sendEmailLabel.text = str
        sendPhoneLabel.text = str
        nextSendEmailLabel.text = str
        nextSendPhoneLabel.text = str


ここで全てのラベルに同じ値(str、つまりNickNameというキーで得られた値)を入れています。

なので、

  1. UserDefaults で得られたひとつひとつの値を違う名前の変数にいれる
  2. それらの変数の値を適切なラベルに入れる

という処理が必要です。 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/15 16:47

    お世話になります。
    確かに一行目はstrで良かったんですが二行目からstrを入力するとエラーが出てFixしろって言われて、
    Fixしたら _ が入っちゃうんです。
    なのでstrを入れないで
    let nickNameText: String = userDefaults.object(forKey: "NickName") as! String にしてみました。
    そしたら今度は Thread 1: signal SIGABRT と出てしまします。
    次にご指摘の部分は nickNameLabel.text = nickNameText としました。
    正直自信がないです(汗

    キャンセル

  • 2020/04/18 01:03

    userDefaults.set(nickNameText, forKey: "NickName")
    let nickNameText: String = userDefaults.object(forKey: "NickName") as! String
    nickNameLabel.text = nickNameText
    に書き換えてみました。
    が、TextFieldの値がTaxeLabelに反映されないです。
    いや〜難しいですね。。。

    キャンセル

checkベストアンサー

0

textFieldShouldReturn(_:)の内部で全てのラベルに同一のテキストフィールドの値を代入するように書かれていいます。
条件別に書き直して下さい。

その後、TsukubaDepotさんの回答されている部分も直してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/15 16:50

    お世話になります!
    ご指摘の部分はこのように書き換えてみました。
    textFieldShouldReturn(_ textField: UITextField) -> Bool{
    nickNameText = nickNameTextField.text!
    nickNameLabel.text = nickNameText

    キャンセル

0

問題の一つは原因が分かったので自己解決。
問題のエラーは hread 1: Exception: "-[KidsSosApp.SettingsViewController hozonButton:]: unrecognized selector sent t
ボタンのIBActinのリンクが切れてました。

textFieldに入力した値が全てのtextLabelに入ってしまう原因はまだ調査中です。

ご指導いただければと存じます。
よろしくお願いします!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る