3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【SwiftUI】入力開始時に TextField の Placeholder の文字列を非表示にする

Posted at

はじめに

SwiftUI ではデフォルトでは入力開始時に TextField
Placeholder の文字列は表示されたままですが,
入力開始時に Placeholder を非表示にできるのかについて
検証をする機会があったので備忘録です。

通常はデフォルトのままで大丈夫だとは思います。

実装

結果的に Placeholder の文字列を定数にせず,
バインドすることで実現できました。

TextField を生成する際に下記を使って入力開始/終了時の処理で
placeholder の文字列を変更しています。

init<S>(_ title: S, text: Binding<String>, onEditingChanged: @escaping (Bool) -> Void = { _ in }, onCommit: @escaping () -> Void = {}) where S : StringProtocol

サンプルコードはこちらです。
1つ目の TextField がデフォルトのシンプルなもの,
2つ目の TextField が入力時に非表示になるものです。

ContentView.swift
import SwiftUI

struct ContentView: View {

    @State private var firstTextFieldStr = ""
    @State private var secondTextFieldStr = ""
    @State private var placeholderStr = "文字列を入力"

    var body: some View {
        NavigationView {
            VStack(alignment: .leading) {
                TextField("文字列を入力", text: $firstTextFieldStr)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                    .padding(.vertical, 16.0)
                TextField(self.placeholderStr, text: $secondTextFieldStr, onEditingChanged: { (hasChanged) in
                    // 編集を始めたらtrue,終えたらfalseになる
                    if hasChanged && self.secondTextFieldStr.isEmpty {
                        // 編集開始時に文字列が入力されていなければplaceholderを空文字に
                        self.placeholderStr = ""
                    } else if !hasChanged && self.secondTextFieldStr.isEmpty {
                        // 編集終了時に文字列が入力されていなければplaceholderをデフォルトに
                        self.placeholderStr = "文字列を入力"
                    }
                }) {
                    // returnキーが押された際の処理
                }
                .textFieldStyle(RoundedBorderTextFieldStyle())
                Spacer()
            }
            .padding(.horizontal, 20.0)
            .navigationBarTitle("TextField Placeholder test", displayMode: .inline)
        }
    }
}

動作

RPReplay_Final1589396086

おわりに

SwiftUI 2では痒いところに手が届くように色々期待です。

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?