<commit_before>## UITextField

Instead of having to manually send text editing events yourself, you can now simply enter text into a text field using `enter(text:)` on any `UITextField`.

For example:
```swift
let textField = viewController.someTextField
textField.enter(text: "text")

// Any delegate attached to the text field will automatically receive all
// events that you would expect to receive had a real user interacted
// with the text field.
```

You can also get more granular control with the `focus()`, `unfocus()`, `type(_:)`, and `paste(text:)` methods.

```swift
textField.focus()

// Sends should begin and did begin events to the delegate.
```

```swift
textField.unfocus()

// Sends should end and did end events to the delegate if textField previously
// had focus() called on it.
```

```swift
textField.type("text")
textField.paste(text: "text")

// Sends the appropriate editing changed methods to the delegate. The
// difference between the two is that type(_:) triggers the
// textField:shouldChangeCharactersInRange:replacementString: method for
// each character in the given string, while paste(text:) triggers it for the
// entire given string.
```

```swift
textField.clearText()

// Sends the appropriate shouldClearText methods to the delegate.
```<commit_msg>Update documentation for `UITextField`<commit_after>## UITextField

Instead of having to manually send text editing events yourself, you can now simply enter text into a text field using `enter(text:)` on any `UITextField`.

For example, given you have some UIViewController that looks like this:
```swift
class ControllerUnderTest: UIViewController {
	@IBOutlet weak var textField: UITextField?

// rest of code here
// ...
}
```
When you want to enter some text into the controller's `textField`, simply do the following:

```swift
let controller = getControllerUnderTest() as? ControllerUnderTest
let _ = controller.textField?.enter(text: "text")

// Any delegate attached to the text view will automatically receive all
// events that you would expect to receive had a real user interacted
// with the text view. This includes:
//
// - the call to make the text field a first responder
// - should begin/did begin editing events
// - all the text change callbacks exactly as they would be received were a user to actually
//   input the text themselves
// - appropriate focus handoff callbacks in the case that another element had focus
// - should end/did end editing events
// - and of course, the text in the text field will update appropriately
//
```

You can also get more granular control with the `startEditing()`, `endEditing()`, `type(text:)`, `paste(text:)`, and `backspace()` methods.

```swift
let _ = textField.startEditing()

// Sends should begin and did begin events to the delegate.
```

```swift
let _ = textField.endEditing()

// Sends should end and did end events to the delegate if textField previously
// had startEditing() called on it.
```

```swift
let _ = textField.type(text: "text")
let _ = textField.paste(text: "text")

// Sends the appropriate editing changed methods to the delegate. The
// difference between the two is that type(text:) triggers the
// textField:shouldChangeCharactersInRange:replacementString: method for
// each character in the given string, while paste(text:) triggers it for the
// entire given string.
```

```swift
let _ = textField.backspace()

// Sends the appropriate methods to the delegate while removing the last character of content
// from the text field.
```

All the methods return `FleetError` error objects that communicate errors that occur when attempting to perform
the various operations. For example, the `UITextField.type(text:)` method will return an error when it is called
on a text field that does not have first responder focus.
{'fraction_non_alphanumeric': 0.0940126050420168, 'fraction_numerical': 0.0, 'mean_word_length': 4.410511363636363, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5421051', 'n_tokens_mistral': 1047, 'n_tokens_neox': 978, 'n_words': 489}