テキストビュー

掲示板やチャットなどで長文入力するときは「テキストビュー」を使います(メールアドレスやパスワードなど一行の簡単な入力は「テキストフィールド」を使用してください)

本記事はユーザーデフォルトを使って、入力した文字をアプリ内に保存します。アプリ再起動で文字が消えないようする設定はアプリ開発必須です


テキストフィールドとコードはほぼ同じです。読んで無い方はこちら↓

テキストビューを使ったTODOアプリはこちら↓

完成形はこれ

Main.storyboard編集

文字入力用のテキストビューと、入力した文字を表示用させるだけのテキストビューを配置。
表示用TextViewはBehaviorのEditableのチェックを外しておきます(チェック入れたままだと文字入力用キーボードが表示されちゃいます

ユーザーに文字入力させたくないテキストビューは、BehaviorのEditableのチェックを外す

ViewController.swift編集

テキストフィールドの記事のコードと大体同じです。command + option + “F” で”TextField”→”TextView”に置換したら時短できます。ちなみに表示用textViewShow”入力用addTextView”という名称にしてます


import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var addTextView: UITextView!  //入力用テキストビュー
    @IBOutlet weak var textViewShow: UITextView!  //表示用テキストビュー
    @IBOutlet weak var button: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //これ書くと、最下部のextensionとつながる
        addTextView.delegate = self
        
        //起動時はボタン使えない
        button.isEnabled = false
        button.setTitleColor(UIColor.systemGray , for: .normal)
        
        //キーボード入力処理を受け取るコマンド
        NotificationCenter.default.addObserver(self, selector: #selector(showKeyboard), name: UIResponder.keyboardWillShowNotification, object: nil)
        //キーボードを隠す処理を受け取るコマンド
        NotificationCenter.default.addObserver(self, selector: #selector(hideKeyboard), name: UIResponder.keyboardWillHideNotification, object: nil)
    }
    
    //キーボードを消す
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }
    
    //キーボードを表示するときに画面をずらす動作
    @objc func showKeyboard(notification: Notification) {
        let keyboardFrame = (notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey] as AnyObject).cgRectValue
        
        guard let keyboardMinY = keyboardFrame?.minY else{ return }
        let buttonMaxY = button.frame.maxY
        let distance = buttonMaxY - keyboardMinY + 500  //この"500"が画面タテ方向への移動量
        let transform = CGAffineTransform(translationX: 0, y: -distance)
        
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: []
                       , animations: {
                        self.view.transform = transform})
    }
    
    //キーボード消える時に画面の位置を元に戻す動作
    @objc func hideKeyboard() {
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: []
                       , animations: {
                        self.view.transform = .identity}) //これでキーボードが下に戻る時に画面が下に戻る
    }
    
    //buttonを押した時の動作
    @IBAction func button(_ sender: Any) {
        
        guard let Text = self.addTextView.text else { return }
        
        //テキストビューに表示
        self.textViewShow.text = Text
        //TextViewに空文字を入れて空白にする
        self.addTextView.text = ""
        //keyboardを隠す
        self.dismissKeyboard()
    }
    
    //buttonが押されたらキーボードを消す
    @objc func dismissKeyboard() {
        self.view.endEditing(true)
    }    
}

//textViewに、テキストがあるか無いかを判別してる
extension ViewController: UITextViewDelegate {
    
    func textViewDidChangeSelection(_ textView: UITextView) {
        let addTextViewEmpty = addTextView.text?.isEmpty ?? true
        if addTextViewEmpty  {
            button.isEnabled = false
            button.setTitleColor(UIColor.systemGray , for: .normal)
        } else {
            button.isEnabled = true
            button.setTitleColor(UIColor.white , for: .normal)      
        }
    }
}

UserDefaultsの設定

現時点では、textViewで書いた文字データはアプリ再起動で消えてしまいます・・・そこで

データを保持する為に、ユーザーデフォルトKeyと呼ばれるものを設定して、Keyの中にデータを保管します。Keyの名前はなんでもOK。今回は“textKey”にします。以下4つのコードを所定の位置に配置すればOK。ユーザーデフォルトにデータ保持する作業はアプリ開発必須です(´∀`)

let userDefaults = UserDefaults.standard
textViewShow.text = textViewData()
@objc func textViewData() -> String {
        return userDefaults.object(forKey: "textKey") as? String ?? ""
    }
self.userDefaults.set(self.addTextView.text, forKey: "textKey")

上記コードを追加した後のコード全文は以下。どこに何が記述されてるか確認してください。

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var addTextView: UITextView!
    @IBOutlet weak var textViewShow: UITextView!
    @IBOutlet weak var button: UIButton!
    
    //userdefaultインスタンス
    let userDefaults = UserDefaults.standard
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //起動時にユーザーデフォルトを書き込む
        textViewShow.text = textViewData()
        
        //これ書くと、最下部のextensionとつながる
        addTextView.delegate = self
        
        //起動時はボタン使えない
        button.isEnabled = false
        button.setTitleColor(UIColor.systemGray , for: .normal)
        
        //キーボード入力処理を受け取るコマンド
        NotificationCenter.default.addObserver(self, selector: #selector(showKeyboard), name: UIResponder.keyboardWillShowNotification, object: nil)
        //キーボードを隠す処理を受け取るコマンド
        NotificationCenter.default.addObserver(self, selector: #selector(hideKeyboard), name: UIResponder.keyboardWillHideNotification, object: nil)
        
    }
    
    //UserDefaultsから値を読み込む
    @objc func textViewData() -> String {
        return userDefaults.object(forKey: "textKey") as? String ?? ""
    }
    
    //キーボードを消す
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }
    
    //キーボードを表示するときに画面をずらす動作
    @objc func showKeyboard(notification: Notification) {
        let keyboardFrame = (notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey] as AnyObject).cgRectValue
        
        guard let keyboardMinY = keyboardFrame?.minY else{ return }
        let buttonMaxY = button.frame.maxY
        let distance = buttonMaxY - keyboardMinY + 500  //この"200"が画面タテ方向への移動量
        let transform = CGAffineTransform(translationX: 0, y: -distance)
        
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: []
                       , animations: {
                        self.view.transform = transform})
    }
    
    //キーボード消える時に画面の位置を元に戻す動作
    @objc func hideKeyboard() {
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: []
                       , animations: {
                        self.view.transform = .identity}) //これでキーボードが下に戻る時に画面が下に戻る
    }
    
    
    //buttonを押した時の動作
    @IBAction func button(_ sender: Any) {
        
        self.userDefaults.set(self.addTextView.text, forKey: "textKey")
        
        guard let Text = self.addTextView.text else { return }
        
        //テキストビューに表示
        self.textViewShow.text = Text
        //TextViewに空文字を入れて空白にする
        self.addTextView.text = ""
        //keyboardを隠す
        self.dismissKeyboard()
    }
    
    //buttonが押されたらキーボードを消す
    @objc func dismissKeyboard() {
        self.view.endEditing(true)
    }
    
}


//textViewに、テキストがあるか無いかを判別してる
extension ViewController: UITextViewDelegate {
    
    func textViewDidChangeSelection(_ textView: UITextView) {
        let addTextViewEmpty = addTextView.text?.isEmpty ?? true
        if addTextViewEmpty  {
            button.isEnabled = false
            button.setTitleColor(UIColor.systemGray , for: .normal)
        } else {
            button.isEnabled = true
            button.setTitleColor(UIColor.white , for: .normal)
            
        }
    }
}

ちなみに、ユーザーデフォルトの保持データを削除したい場合は、アプリを削除するか、以下のコードをviewDidLoadの中に一時的に記述することで解決できます(消し忘れ注意です)

 userDefaults.removeObject(forKey: "textKey")

おしまい(´∀`)ノ
参考になった方は👍ボタンお願いします ↓

コメント

タイトルとURLをコピーしました