我有一个UITextField,我希望以预先填充的后缀呈现给用户。显然,我想将插入点设置为预填充文本的开头。
我似乎不明白如何做到这一点(没有insertPoint属性),但有一种棘手的方法来完成这项工作吗?
答案 0 :(得分:4)
覆盖drawTextInRect:始终绘制后缀,即使它未包含在UITextFields文本中(使用带有textfield.text的临时字符串,附加后缀并绘制它)。用户完成编辑后,将后缀附加到字符串中(如果有帮助,则单独使用它们)。
答案 1 :(得分:1)
每个人都喜欢一个9岁的问题。
UITextField符合UITextInput。因此,找不到在类文档中找到的所有方法。
在我的示例中,将显示字符串"$1234.00"
,但是只能编辑字符串的1234
范围。
textField.delegate = self
textField.text = "$\(myIntValue).00"
textFieldDidBeginEditing
方法选择所有可编辑区域,另一个有效/有用的选择将在1234
和.
之间。
请注意,我们正在同时使用UITextRange
和NSRange
。它们不能完全互换。
extension MyViewController : UITextFieldDelegate {
/// Set the "insertion caret" for the text field.
func textFieldDidBeginEditing(_ textField: UITextField) {
if let startPosition = textField.position(from: textField.beginningOfDocument, offset: 1), // forward over "$"
let endPosition = textField.position(from: textField.endOfDocument, offset: -3) { // back 3 over ".00"
let selection = textField.textRange(from: startPosition, to: endPosition)
//let selection = textField.textRange(from: endPosition, to: endPosition)
textField.selectedTextRange = selection
}
}
/// Only allow edits that are in the editable range and only adding digits or deleting anything (this allows cut/paste as well)
func textField(_ textField:UITextField, shouldChangeCharactersIn range:NSRange, replacementString string:String) -> Bool {
let minimalString = "$.00" // String always starts in uneditable "$", and ends in an uneditable ".00"
assert(textField.text?.count ?? 0 >= minimalString.count)
guard let text = textField.text else { return false }
if range.upperBound > text.count - 3 || range.lowerBound == 0 { return false } // range only in editable area
if string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined().count != string.count { return false } // new string only has digits
return true
}
}
答案 2 :(得分:0)
据我所知,没有简单的方法可以做到这一点。
我要说最简单的方法是在用户输入文本后添加后缀。不要忘记在UI中添加一些内容,告诉用户会添加一些内容。
答案 3 :(得分:0)
您可以将后缀作为UILabel放在UITextField的末尾,或者您可以让您的委托在编辑完成后添加后缀,例如:
@interface MyViewController : UIViewController <UITextFieldDelegate> {...}
...
[textField setDelegate:self];
...
- (void)textFieldDidEndEditing:(UITextField *)textField {
NSString *textWithSuffix = [[NSString alloc] initWithFormat:@"%@%@", [textField text], @"SUFFIX"];
[textField setText:textWithSuffix];
[textWithSuffix release];
}