@@ -47,8 +47,8 @@ status.
47
47
48
48
``` swift
49
49
struct ExampleView : View {
50
- @State var email: String
51
- @State var isEditingEmail: Bool
50
+ @State var email: String = " "
51
+ @State var isEditingEmail: Bool = false
52
52
53
53
var body: some View {
54
54
VStack {
@@ -212,6 +212,101 @@ public extension ResponsiveTextField.Configuration {
212
212
}
213
213
```
214
214
215
+ ## First Responder Control
216
+
217
+ ` ResponsiveTextField ` uses the SwiftUI binding system to give programmatic
218
+ control over the first responder status of the control. This is one of the
219
+ major pieces of missing behaviour from the native ` TextField ` type.
220
+
221
+ The control is passed a ` Binding<Bool> ` on initialisation which allows two-way
222
+ communication about the text field's responder state. When the user taps on
223
+ the text field, it will become first responder unless it has been disabled.
224
+ This will update the state that the binding was derived from to ` true ` .
225
+ Similarly, if another control becomes first responder, the text field will
226
+ resign it's first responder status and set the underlying state to ` false ` .
227
+
228
+ Update the external state will update the text field and will make it become
229
+ or resign first responder. For example, on a screen with two text fields, you
230
+ could make the first text field become first responder automatically, causing
231
+ the keyboard to appear when the view is shown, by simply setting the default
232
+ value of the state to ` true ` :
233
+
234
+ ``` swift
235
+ struct ExampleView : View {
236
+ @State var email: String = " "
237
+ @State var password: String = " "
238
+ @State var isEditingEmail: Bool = true
239
+ @State var isEditingPassword: Bool = false
240
+
241
+ var body: some View {
242
+ VStack {
243
+ /// This field will become first responder automatically
244
+ ResponsiveTextField (
245
+ placeholder : " Email address" ,
246
+ text : $email,
247
+ isEditing : $isEditingEmail
248
+ )
249
+ ResponsiveTextField (
250
+ placeholder : " Password" ,
251
+ text : $password,
252
+ isEditing : $isEditingPassword
253
+ )
254
+ }
255
+ }
256
+ }
257
+ ```
258
+
259
+ You could also trigger the field to become first responder after a short
260
+ delay after appearing:
261
+
262
+ ``` swift
263
+ VStack {
264
+ ResponsiveTextField (
265
+ placeholder : " Email address" ,
266
+ text : $email,
267
+ isEditing : $isEditingEmail
268
+ )
269
+ }
270
+ .onAppear {
271
+ DispatchQueue.main .asyncAfter (deadline : .now () + 1 ) {
272
+ isEditingEmail = true
273
+ }
274
+ }
275
+ ```
276
+
277
+ You could also use the built-in keyboard handling closure to move from one
278
+ field to the next when the keyboard return button is tapped:
279
+
280
+ ``` swift
281
+ struct ExampleView : View {
282
+ @State var email: String = " "
283
+ @State var password: String = " "
284
+ @State var isEditingEmail: Bool = true
285
+ @State var isEditingPassword: Bool = false
286
+
287
+ var body: some View {
288
+ VStack {
289
+ /// Tapping return will make the password field first responder
290
+ ResponsiveTextField (
291
+ placeholder : " Email address" ,
292
+ text : $email,
293
+ isEditing : $isEditingEmail,
294
+ configuration : .emailField ,
295
+ handleReturn : { isEditingPassword = true }
296
+ )
297
+ /// Tapping return will resign first responder and hide the keyboard
298
+ ResponsiveTextField (
299
+ placeholder : " Password" ,
300
+ text : $password,
301
+ isEditing : $isEditingPassword,
302
+ configuration : .passwordField ,
303
+ handleReturn : { isEditingPassword = false }
304
+ )
305
+ }
306
+ }
307
+ }
308
+ ```
309
+
215
310
## Licence
216
311
217
312
This library is released under the Apache v2.0 license. See [ LICENSE] ( LICENSE )
0 commit comments