反应本机文本输入,按下时更改光标位置

Posted

技术标签:

【中文标题】反应本机文本输入,按下时更改光标位置【英文标题】:react native textInput, change position of cursor on press 【发布时间】:2020-07-15 18:51:42 【问题描述】:

现在,在我的 react native 应用程序中,我无法更改每个输入的中间值。因为每次我按下文本输入时,插入符号都位于插入字符串的末尾。

例如:

值:123456 ---->我只想删除/更改 23,但我不能,因为插入符号超过了最后一个值。

我尝试使用 selectTextOnFocus,但它只会在我单击其他文本输入时触发,并且如果数据是预填充的,它就不起作用。我试着解释得更好

在下图中,我从第一个文本 Mobile Number 跳转到第二个文本 id RICE

在下图中,我输入了新值12321,但如果在同一输入上再次按下,文本将不会被选中。我试图点击并停留大约 10 秒,但什么也没有。

我正在使用 xcode 来构建应用程序。

这是我的输入组件

const InputField: React.FC<Props> = (
  
    placeholder,
    iconLeft,
    iconRight,
    dateTimeIcon,
    iconBackground,
    type,
    id,
    style,
    name,
    value,
    keyboardType,
    iconRightFunction,
    maxLength = 100,
    inputBackground,
    onChangeText,
    onChange,
    editable,
    textAlign,
    setMarginBottom,
    onFocus,
    multiline,
    numberOfLines,
    label,
    error,
    errorLabel,
    containerHeight,
    onBlur,
  ,
  ref,
) => 
  const [hidePassword, showOrHidePassword] = useState(true);

  const _handleShowPassword = () => 
    showOrHidePassword(!hidePassword);
  ;

  const _handleOnChange = ( nativeEvent ) => 
    onChange && onChange(name, nativeEvent.text);
  ;

  const _handleOnBlur = () => 
    onBlur && onBlur(name, value);
  ;
  const input = useRef(null);
  const showPassword = type === 'password' && !error && value.length !== 0;
  return (
    <>
      label && (
        <StyledLabelContainer setMargin=setMarginBottom>
          <StyledLabel error=error>label</StyledLabel>
          error && <StyledLabel error=error>errorLabel</StyledLabel>
        </StyledLabelContainer>
      )

      <StyledContainer containerHeight=containerHeight setMargin=setMarginBottom>
        iconLeft && <StyledIconLeft bgColor=iconBackground>iconLeft</StyledIconLeft>
        <TouchableOpacity
          activeOpacity=0
          onPress=() => 
            console.log('inputcurrent', input, input.current);
            input.current.focus();
          
          style= flex: 1 
        >
          <View pointerEvents="none" style= flex: 1 >
            <StyledInput
              style=style
              ref=input
              textAlign=textAlign
              maxLength=maxLength
              editable
              selectTextOnFocus
              clearTextOnFocus=false
              secureTextEntry=type === 'password' && hidePassword
              placeholder=placeholder
              type=type
              autoCapitalize="none"
              onChangeText=onChangeText
              onChange=_handleOnChange
              value=value
              id=id
              name=name
              bgColor=inputBackground
              keyboardType=keyboardType
              blurOnSubmit=true
              onFocus=onFocus
              returnKeyType='done'
              onBlur=_handleOnBlur
              error=error
              multiline=multiline
              numberOfLines=numberOfLines
            />
          </View>
        </TouchableOpacity>

问题

如何在按下操作期间设置光标的正确位置? 例如:123456 ----> 用户在字符串中间按下,我希望看到数字 3 和 4 之间的插入符号。

我的尝试

我阅读了有关选择的内容,但没有成功实施,非常欢迎各种建议。

感谢您的时间。

【问题讨论】:

【参考方案1】:

您可以使用selection 属性将光标定位到您想要的位置。参见文档:https://reactnative.dev/docs/textinput.html#selection

您可以创建一个看起来像文本输入但实际上是一组小按钮的视图,每个字符一个。当用户单击其中一个按钮时,您就知道他们希望插入符号(光标)在哪里。然后渲染真正的TextInput 并使用selection 道具将插入符号移动到正确的位置。

【讨论】:

感谢这个想法。您如何提出视图和文本输入的布局,因为两者都必须同时对用户可见。 只需一个接一个地渲染多个TextInputs并使用flexDirection: "row"

以上是关于反应本机文本输入,按下时更改光标位置的主要内容,如果未能解决你的问题,请参考以下文章

鼠标左键按下时如何更改鼠标光标?

如何在占位符文本上启动光标位置中心反应原生?

如何更改 TextInput 上的光标位置? (反应原生)

vim 文本复制

编辑文本 - 如何更改光标位置?

如何在 textarea 文本更改上保留光标位置?