TextFieldで編集が終わったら値をセットする方法。
Optionalを扱うモデルを用意してBindするところまで。
OptionalだとTextFieldにBindingできないのでView内のメンバnameで一旦受ける。
onAppearのタイミングでセットする。
import SwiftUI // CoreDataを想定してOptionalを扱うモデルを用意 struct Person { var name: String? = nil } struct ContentView: View { @State var person = Person() @State var name: String = "" var body: some View { VStack { TextField("Name", text: $name) } .padding() .onAppear() { // Optionalの値は一旦nameに置換える name = person.name ?? "" } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
ここまでのソース
編集が終わったらモデルにセットする様にするにはonEditingChangedを使用する。
TextField("Name", text: $name, onEditingChanged: <#T##(Bool) -> Void#>
<#T##(Bool) -> Void#>を選択してリターンキーを押すとonEditingChangedはBlockに展開された。
TextField("Name", text: $name) { editing in if editing == false { person.name = name } }
空文字の場合はモデルにセットしない様にするには
TextField("Name", text: $name) { editing in if editing == false { if isValid { person.name = name } } } . . } private var isValid: Bool { return !name.isEmpty }
ここまでのソース
有効な名前がセットされるまでフォーカスを抜けたくない場合focusedを使う。
isFocused を true にするとフォーカスを戻す事ができる。
@FocusState var isFocused: Bool var body: some View { VStack { TextField("Name", text: $name) { editing in if editing == false { if isValid { person.name = name } else { isFocused = true } } } .focused($isFocused) }
ここまでのソース
無効な名前の場合警告として背景を赤色にするにはbackgroundで設定する。
onChangeを使わなくてもnameが更新されてViewが更新される様だ。
let invalidColor = Color(red: 1.0, green: 0.7, blue: 0.7) var body: some View { VStack { TextField("Name", text: $name) { editing in if editing == false { if isValid { person.name = name } else { isFocused = true } } } .focused($isFocused) .background(RoundedRectangle(cornerRadius: 2).fill(isValid ? .clear : invalidColor))
ここまでのソース
つづきを書いた