【问题标题】:Can I set the insertion point on a UITextField我可以在 UITextField 上设置插入点吗
【发布时间】:2010-12-03 19:46:31
【问题描述】:

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

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

【问题讨论】:

    标签: ios objective-c iphone cocoa-touch uitextfield


    【解决方案1】:

    Override drawTextInRect: 总是绘制你的后缀,即使它不包含在 UITextFields 文本中(使用一个临时字符串,它接受 textfield.text、附加你的后缀并绘制它)。用户完成编辑后,将后缀附加到字符串(如果有帮助,也可以单独使用)。

    【讨论】:

    • 虽然看起来我不能完全做我想做的事,但我认为这是我想要做的最接近的“模拟”。谢谢。
    【解决方案2】:

    每个人都喜欢一个 9 岁的问题。

    UITextField 符合UITextInput。所以你在类文档中寻找的所有方法都无处可寻。

    在我的示例中,要显示"$1234.00" 的字符串,但只能编辑字符串的1234 范围。

    textField.delegate = self
    textField.text = "$\(myIntValue).00"
    

    textFieldDidBeginEditing 方法选择所有可编辑区域,另一个有效/有用的选择将在 1234. 之间。

    请注意,我们正在使用 UITextRangeNSRange。它们不能完全互换。

    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
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 他想要的是一个后缀,而不是一个前缀(并不是说它有很大的不同)。
      【解决方案4】:

      您可以将后缀作为 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];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 2011-03-08
        • 1970-01-01
        • 1970-01-01
        • 2018-05-17
        • 1970-01-01
        相关资源
        最近更新 更多