SecureField はパスワード入力用のテキストインターフェースを提供します。
今回は、SecureField の使用方法について説明します。
環境
OS: macOS Big Sur 11.2.1
Xcode: 12.4
Swift: 5.2.4
SecureField の基本使用方法
SecureField の基本的な構文は以下の通りです。
第1引数には、入力欄が空の場合に表示される文字列(※)を指定し、第2引数には入力された文字列を格納するための String 型変数を指定します。この String 型の変数は @State 等で宣言をしておく必要があります。この第2引数の変数の先頭には $ を付けて参照渡しにして、SecureField がプロパティ値を更新できるようにしておきます。
※この文字列のことをプレースホルダと呼びます。
SecureField("プレースホルダ", text: $value)
以下にコード例を示します。
このコードでは、入力欄に「パスワードを入力」と表示し、入力された文字列は変数 value に格納されます。
struct ContentView: View {
@State var strPassword = ""
var body: some View {
SecureField("パスワードを入力", text: $strPassword)
}
}
実行して文字を入力すると伏字(●)に変換されることがわかります。
枠線を付ける
実際に動かしてみるとわかるのですが、先程の例では SecureField に枠線がないため、入力可能な範囲がわかりにくくなっています。
枠線を付けるには textFieldStyle() モディファイアを使用します。
以下のスタイルを使用することができます。
コード例を以下に示します。
struct ContentView: View {
@State var strPassword1 = ""
@State var strPassword2 = ""
@State var strPassword3 = ""
var body: some View {
VStack {
TextField("DefaultTextFieldStyle", text: $strPassword1)
.textFieldStyle(DefaultTextFieldStyle())
.padding()
TextField("PlainTextFieldStyle", text: $strPassword2)
.textFieldStyle(PlainTextFieldStyle())
.padding()
TextField("RoundedBorderTextFieldStyle", text: $strPassword3)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
}
}
}
入力されたパスワードを確認する
SecureField に入力された内容が、変数に格納されているかを確認するために Text に表示してみましょう。
以下にコード例を示します。
入力されたパスワードを保持する変数として @State を付けた「strPassword」を宣言しています。。
Text の引数には「strPassword」を渡していますので、SecureField に入力したパスワードが表示されます。
struct ContentView: View {
@State var strPassword = ""
var body: some View {
SecureField("パスワードを入力", text: $strPassword)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
Text(strPassword)
}
}
入力された文字数を判断する
SecureField の以下の書式を使用すると、「入力が終了した」ということを判断して処理をすることができます。
init(
_ titleKey: LocalizedStringKey,
text: Binding,
onCommit: @escaping () -> Void = {})
以下にコード例を示します。
この例は、SecureField に入力された文字数が8文字未満の場合に「パスワードは8文字以上を入力してください」というアラートを表示します。
TextField の第3引数に onCommit を渡しており、入力された文字数が8未満のときに showingAlert に true をセットしています。
後続の .alert で showingAlert の値が true であると判断した場合にアラートが表示されるようにしています。
struct ContentView: View {
@State var strPassword = ""
@State var showingAlert = false
var body: some View {
SecureField(
"パスワードを入力",
text: $strPassword,
/// リターンキーが押された時の処理
onCommit: {
if self.strPassword.count < 8 {
self.showingAlert = true
}
})
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
.alert(isPresented: $showingAlert) {
Alert(title: Text("パスワードは8文字以上を入力してください"))
}
}
}





コメント