FUITextFieldCollectionViewCell
open class FUITextFieldCollectionViewCell : FUIInlineValidationDrawingCollectionViewCell<FUITextFieldContentView>, FUIFormCell
The reusable UI component implemented as a UICollectionViewCell
to display or edit a textfield.
The developer should set the following properties on the cell in their implementation of the UITableViewDataSource
cellForRow(at:)
function:
keyName
: The key name of the property.value
: The value of the property.
And, an onChangeHandler
:
onChangeHandler
: a handler closure that is invoked on changes to the value.
Optionally, the developer may provide
isEditable
: Indicates whether the cell’s value may be modified. The default istrue
.isStacked
: A Boolean value to determine whether 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 totrue
.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
: AnFUIButton
that manages an alternative method to fill thetextField
.isAlternativeInputEnabled
: ABool
that shows or hides thealternativeInputButton
. This button will indicate whetherisAlternativeInputEnabled
andisEditable
aretrue
.
Color settings:
Manage the color of the control by programmatically setting the textColor
and tintColor
.
The following is an example of usage in an application with UIViewController
and UICollectionViewDataSource
:
override func viewDidLoad() {
super.viewDidLoad()
self.collectionView.register(FUITextFieldCollectionViewCell.self, forCellReuseIdentifier: FUITextFieldCollectionViewCell.reuseIdentifier)
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: FUITextFieldCollectionViewCell.reuseIdentifier, for: indexPath) as! FUITextFieldCollectionViewCell
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_keyText {}
fdlFUITextFieldFormCell_valueText {}
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
FUITextField
holds the value string.Declaration
Swift
open var valueTextField: FUITextField { get }
-
A Boolean value to determine whether the cell should use a stacked or linear layout.
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 }
-
Indicates whether the value of the cell can be changed or not. For
FUISimplePropertyFormCell
this property is alwaysfalse
.Declaration
Swift
open var isEditable: Bool { get set }
-
A
Bool
to enable alternative text entry. The cell must also haveisEditable
set totrue
to display the button. The button will be hidden while text entry is in progress. The default value isfalse
.Declaration
Swift
open var isAlternativeInputEnabled: Bool { get set }
-
isEnabled
andisEditable
are in sync.Declaration
Swift
open var isEnabled: Bool { get set }
-
This is the maximum length of the text when
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.
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 the change handler. This 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 for determining the type of the presented keyboard.
Declaration
Swift
open var keyboardType: UIKeyboardType { get set }
-
The formatter for the
UITextField
in this cell.Currently, SAPFiori provides two implementations:
FUIPhoneNumberFormatter
to format phone numbers.FUINumberFormatter
to format numbers that uses the regular iOSNumberFormatter
.
Declaration
Swift
open var formatter: FUIFormattedStringEditing? { get set }
-
If
isTrackingLiveChanges == true
, thenonChangeHandler
will be invoked for every letter entered. Otherwise,onChangeHandler
will be invoked only after the user taps the Done key, or the field resigns as first responder.The default is
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 right-to-left languages and the cell is not
editable
, the default is left-aligned.
Declaration
Swift
open var valueTextAlignment: NSTextAlignment? { get set }
- For left-to-right languages and the cell is
-
The hint text.
Declaration
Swift
open var hintText: String? { get set }
-
Indicates whether the cell is read-only or not.
The default is
false
.Declaration
Swift
open var isReadOnly: Bool { get set }
-
Indicates whether to hide the read-only hint or not.
A default hint is provided when this cell’s
isReadOnly
istrue
unless this property istrue
. The default isfalse
, meaning that the default read-only hint will be shown whenisReadOnly
istrue
.Declaration
Swift
open var hidesReadOnlyHint: Bool { get set }
-
Declaration
Swift
override open func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize