FUITextFieldFormCell

The reusable UI component implemented as an UITableViewCell to display or edit a key-value pair property.

The developer should set the following properties on the cell, in their implementation of UITableViewDataSource cellForRow(at:) function:

  • keyName: The key name of the property.
  • value: The value of the property.

And an onChangeHandler:

  • onChangeHandler: a handler closure, which is invoked on changes to the value

Optionally, the developer may provide

  • isEditable: Indicates if the cell’s value may be modified. Defaults to true.

  • isStacked: A boolean value to determine if the cell should use a stacked or linear layout. If the device’s accessibility settings font size is increased, the cell will force a stacked layout. By default, this property is set to true.

  • maxKeyWidth: The maximum width of the key with a linear layout - By default, the width is 115 for compact and 160 for regular. The set value must meet the minimum default threshold.

  • alternativeInputButton: A FUIButton that manages an alternative method to fill the textField.

  • isAlternativeInputEnabled: A Bool that shoes or hides the alternativeInputButton. This button will show if isAlternativeInputEnabled and isEditable are true.

Color settings:

Manage the color of the control by setting the textColor and tintColor programmatically.

The following is an example of usage in an application UITableViewController:

Important

The app’s UITableViewController must subclass FUIFormTableViewController
override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.register(FUITextFieldFormCell.self, forCellReuseIdentifier: FUITextFieldFormCell.reuseIdentifier)
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: FUITextFieldFormCell.reuseIdentifier, for: indexPath) as! FUITextFieldFormCell

    cell.keyName = "Editable"
    cell.value = myObject.productName

    // MARK:  implement onChangeHandler
    cell.onChangeHandler = { newValue in
        myObject.productName = newValue
    }

    // MARK: Implement alternative input, i.e. use OCR to capture input

    cell.isAlternativeInputEnabled = true
    let inputImage = FUIIconLibrary.system.camera
    cell.alternativeInputButton.setImage(inputImage.withRenderingMode(.alwaysTemplate), for: .normal)
    cell.alternativeInputButton.didSelectHandler = { [weak self, weak cell] (button) in

        //Import SAPML to use OCR capability
        let textRecController = FUITextRecognitionViewController()
        textRecController.recognitionView.observationHandler = { [unowned textRecController] observations in
            let filteredObservations = <#filter out unwanted text#>
            textRecController.recognitionView.showTexts(for: filteredObservations)
            let areObservationsValid = <#filteredObservations meets desired criteria#>
            if areObservationsValid {
                DispatchQueue.main.async {
                    cell?.value = filteredObservations.map { $0.value }.joined(separator:" ")
                }
                return true
            }
            return false
        }

        textRecController.onClose = {
            self?.dismiss(animated: true)
        }
        self?.present(UINavigationController(rootViewController: textRecController), animated: true)
    }

    return cell
 }

## Theming

nuiClass:

 fdlFUITextFieldFormCell {}

Supported TEXT class paths:

 fdlFUITextFieldFormCell_keyLabel {}
 fdlFUITextFieldFormCell_valueTextField {}

Supported TEXT properties:

 font-color: Color;
 placeholder-color: Color;
 font-style: UIFontTextStyle;

Supported BUTTON class paths:

 fdlFUITextFieldFormCell_alternativeInputButton {}

Supported BUTTON properties:

 background-color: Color;
 font-color: Color;
  • The key name of the property.

    Declaration

    Swift

    open var keyName: String? { get set }
  • The UILabel holds the key name string.

    Declaration

    Swift

    @available(*, deprecated, message: "This property is has been deprecated.  Please set the `title.text` property.")
    public var keyLabel: UILabel
  • The UITextField holds the value string.

    Declaration

    Swift

    open var valueTextField: UITextField { get }
  • A boolean value to determine if the cell should use a stacked or linear layout. If the device’s accessibility settings font size is increased, the cell will force a stacked layout. By default, this property is set to true.

    Declaration

    Swift

    open var isStacked: Bool { get set }
  • The maximum width of the key with a linear layout - By default, the width is 115 for compact and 160 for regular. The set value must meet the minimum default threshold.

    Declaration

    Swift

    open var maxKeyWidth: CGFloat { get set }
  • A FUIButton for an alternative text entry method. Implement the didSelectHandler to manage alternative entry. Also, supply an image to display on the button.

    Declaration

    Swift

    open var alternativeInputButton: FUIButton { get }
  • Indicates if the value of the cell could be changed or not. For FUISimplePropertyFormCell this property is always false.

    Declaration

    Swift

    open var isEditable: Bool { get set }
  • A Bool to enable alternative entry. The cell must also have isEditable set to true to display the button. The button will hide while text entry is in progress. The default value is false.

    Declaration

    Swift

    open var isAlternativeInputEnabled: Bool { get set }
  • isEnabled and isEditable are in sync.

    Declaration

    Swift

    override open var isEnabled: Bool { get set }
  • This is the maximum length of the text, if maxTextLength is greater than 0.

    If the text length reaches this limit, the user cannot enter more text. Note: If the user pastes a string and the length plus the current text length is greater than the limit, the insert is rejected. Partial strings are not accepted in the text field.

    If the formatter is set, this property will have no effect The default value for maxTextLength is 0, which means no limit.

    Declaration

    Swift

    public var maxTextLength: Int { get set }
  • The value of the property.

    Declaration

    Swift

    open var value: String { get set }
  • Implementation of change handler. Is invoked on changes to the value property.

    Declaration

    Swift

    open var onChangeHandler: ((String) -> Void)? { get set }
  • The placeholder text for the value text field.

    Declaration

    Swift

    @available(*, deprecated, message: "This property is deprecated.  Please use `placeholder.text`.")
    open var placeholderText: String? { get set }
  • Method determining the type of presented keyboard

    Declaration

    Swift

    open var keyboardType: UIKeyboardType { get set }
  • The formatter for the UITextField in this cell.

    Currently, SAPFiori provides two implementations:

    Declaration

    Swift

    open var formatter: FUIFormattedStringEditing? { get set }
  • If isTrackingLiveChanges == true, then onChangeHandler will be invoked for every letter entered. Otherwise, onChangeHandler will be invoked only after user taps “Done” key, or the field resigns first responder.

    Defaults to false.

    Declaration

    Swift

    open var isTrackingLiveChanges: Bool { get set }
  • The customized text alignment for the valueTextField,

    If this property is nil, the default alignment is used.

    • For left to right languages and the cell is editable, the default is left aligned.
    • For left to right languages and the cell is not editable, the default is right aligned.
    • For righ to left languages and the cell is editable, the default is rignt aligned.
    • For righ to left languages and the cell is not editable, the default is left aligned.

    Declaration

    Swift

    open var valueTextAlignment: NSTextAlignment? { get set }