【问题标题】:UITextField get currently edited wordUITextField 获取当前编辑的单词
【发布时间】:2014-03-19 13:45:47
【问题描述】:

我正在开发一个自动完成组件,我有一个问题想以某种简单的方式解决。

我想支持对自动完成文本的编辑,例如:

 blablabl @usertag blablabl

如果用户返回并编辑@usertag 字符串,我想在编辑时开始自动完成。

问题是,如何从文本字段中获取当前编辑的单词。我考虑过光标位置,用“”(空格)将 nsstring 与单词分开,并计算从第一个单词到光标位置的字母。

有没有更简单的方法?

【问题讨论】:

  • 您能再解释一下吗?自动完成是否建议使用 @usertag?
  • 是的,但总的来说,当用户编辑这部分字符串时,我需要将@usertag 从 UITextField 中取出

标签: ios nsstring uitextfield


【解决方案1】:

好的,我找到了一种很容易做到的方法。也许有人会觉得它有用:

UITextRange* selectedRange = [textField selectedTextRange];
NSInteger cursorOffset = [textField offsetFromPosition:0 toPosition:selectedRange.start];
NSString* text = textField.text;
NSString* substring = [text substringToIndex:cursorOffset];
NSString* editedWord = [[substring componentsSeparatedByString:@" "] lastObject];

【讨论】:

    【解决方案2】:

    Swift 4解决方案

       func getCurrentEditingWord() ->String? {
            let selectedRange: UITextRange? = self.textView.selectedTextRange
            var cursorOffset: Int? = nil
            if let aStart = selectedRange?.start {
                cursorOffset = self.textView.offset(from: self.textView.beginningOfDocument, to: aStart)
            }
            let text = self.textView.text
            let substring = (text as NSString?)?.substring(to: cursorOffset!)
            let editedWord = substring?.components(separatedBy: " ").last
            return editedWord
        }
    

    【讨论】:

      【解决方案3】:

      这是效率书呆子的解决方案。用 Swift 4.2 编写。我声称这更有效,因为其他答案正在调用 String 方法String.component,它不必要地将整个子字符串转换为数组。 而且这些解决方案总是在光标之前抓取可能不一定是当前单词的单词。

      extension UITextView {
          /// Returns the current word that the cursor is at.
          func currentWord() -> String {
              guard let cursorRange = self.selectedTextRange else { return "" }
              func getRange(from position: UITextPosition, offset: Int) -> UITextRange? {
                  guard let newPosition = self.position(from: position, offset: offset) else { return nil }
                  return self.textRange(from: newPosition, to: position)
              }
          
              var wordStartPosition: UITextPosition = self.beginningOfDocument
              var wordEndPosition: UITextPosition = self.endOfDocument
          
              var position = cursorRange.start
          
              while let range = getRange(from: position, offset: -1), let text = self.text(in: range) {
                  if text == " " || text == "\n" {
                      wordStartPosition = range.end
                      break
                  }
                  position = range.start
              }
          
              position = cursorRange.start
          
              while let range = getRange(from: position, offset: 1), let text = self.text(in: range) {
                  if text == " " || text == "\n" {
                      wordEndPosition = range.start
                      break
                  }
                  position = range.end
              }
          
              guard let wordRange = self.textRange(from: wordStartPosition, to: wordEndPosition) else { return "" }
          
              return self.text(in: wordRange) ?? ""
          }
      }
      

      【讨论】:

        【解决方案4】:

        您是否尝试过使用 UITextFieldDelegate 可用的方法?如果在编辑时访问单词是您想要的,您可以简单地使用 -textField:shouldChangeCharactersInRange:replacementString: 在此方法中,您可以在输入字符串时访问它,您还可以在此处对输入的每个新字符进行任何字符串操作。

        【讨论】:

        • 不是真的 - 我想显示 UITableView 并允许用户选择可用的自动完成项之一。作为参考:appscout.com/images/twitteriphone-auto.jpg
        • 您可以对更改字符时启动的文本字段使用弹出框(前面提到的方法)。仅在当时不存在时才启动它,并在输入字符时对其进行修改。但设计部分取决于你。所有这些都可以通过适当的协议实现来完成。
        • 是的,我让它工作了——我所要问的是如何从 UITextField 中的字符串中获取“WORD”——将其传递给我的自动完成组件。目前它工作正常,只要 @ 和 # 是文本中的最后一个词
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        • 2018-10-25
        • 2015-02-21
        • 1970-01-01
        相关资源
        最近更新 更多