5

我有一个UITextField要呈现给用户的预填充后缀。显然,我希望将插入点设置为预填充文本的开头。

对我来说如何做到这一点似乎并不明显(例如,没有insertionPoint财产),但有没有一种棘手的方法来完成这件事?

4

4 回答 4

4

覆盖 drawTextInRect: 以始终绘制您的后缀,即使它不包含在 UITextFields 文本中(使用带有 textfield.text、附加您的后缀并绘制它的临时字符串)。用户完成编辑后,将后缀附加到字符串(如果有帮助,也可以单独使用)。

于 2009-10-05T18:08:52.790 回答
2

每个人都喜欢一个 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
    }
}
于 2019-08-21T22:50:55.773 回答
0

据我所知,没有简单的方法可以做到这一点。

我想说最简单的方法是在用户输入文本后添加后缀。不要忘记在你的 UI 中添加一些东西来告诉用户将会添加一些东西。

于 2009-10-05T01:28:05.033 回答
0

您可以将后缀作为 UITextField 末尾旁边的 UILabel,或者您可以让您的委托在编辑完成后添加后缀,例如:

@interface MyViewController : UIViewController <UITextFieldDelegate> {...}
...

[textField setDelegate:self];
...
- (void)textFieldDidEndEditing:(UITextField *)textField {
    NSString *textWithSuffix = [[NSString alloc] initWithFormat:@"%@%@", [textField text], @"SUFFIX"];
    [textField setText:textWithSuffix];
    [textWithSuffix release];
}
于 2009-10-05T01:28:37.897 回答