【问题标题】:Override/Disable iOS Smart Punctuation in TextInput在 TextInput 中覆盖/禁用 iOS 智能标点符号
【发布时间】:2019-09-18 01:48:54
【问题描述】:

React Native 0.59.9 与运行 iOS 11 的设备并启用智能标点符号。此 iOS 功能会自动将输入的文本转换为更美观的符号。

例子:

  • 双连字符 -- 自动转换为破折号 (unicode 8212)
  • 引号" 自动转换为花引号(unicode 8220)

等等

很遗憾,禁用智能标点符号(通过设置 > 常规 > 键盘)不是一个选项。

我几乎完全按照RN docs 渲染了一个基本的TextInput 组件,唯一的例外是我使用自己的onChangeText 处理函数来查看对输入文本的影响:

import React, { Component } from 'react';
import { TextInput } from 'react-native';


function handleTextChange(value) {
  // check value here after entering a '-' in the rendered TextInput.
  // when initial value is set to '', received value is ascii 45
  // when initial value is set to '-', received value is unicode 8212
}

export default function UselessTextInput() {
  const [value, onChangeText] = React.useState('-'); // change this to '' to see the difference

  return (
    <TextInput
      style={{ height: 40, borderColor: 'gray', borderWidth: 1 }}
      onChangeText={(text) => handleTextChange(text)}
      value={value}
    />
  );
}

&lt;TextInput&gt; 上设置autoCorrect={false} 和/或autoCompleteType='off' 对输入的文本没有影响。

问题
有没有办法覆盖这种自动更正的行为,从而不改变用户输入的数据?

我看到有人通过Github issue 向 Facebook RN 提出了这个问题,但没有得到回应。

【问题讨论】:

    标签: ios react-native react-native-textinput


    【解决方案1】:

    这并不总是一种选择,但是,添加:

    keyboardType={'ascii-capable'}
    

    TextInput 为我修复了它

    【讨论】:

    • 这适用于我的用例。谢谢!如果您无法强制使用此键盘,那么您将在此答案中使用替换选项:stackoverflow.com/a/58004675/471574
    • 非常感谢!我爱死你了我一直试图找到解决这个问题的方法 5 天。 :'(
    【解决方案2】:

    确实,这是 TextInput 的 iOS 实现的问题,但我可以为您提供解决方法。诀窍是检查 TextInput 的特殊字符值,然后适当地替换这些字符。请参见下面的示例,其中我将每个“-”替换为“--”。

    代码

    const UselessTextInput = () => {
      const [value, setText] = React.useState('-'); // change this to '' to see the difference
    
      function handleTextChange (value) {
        var val = value;
        // check if value contains special characters 
        if (value.includes("—")){
          //replace values appropriately
          val = value.replace("—", "--");
        }
        //set new text 
        setText(val);
      }
      return (
        <TextInput
          style={{ height: 40, borderColor: 'gray', borderWidth: 1 }}
          onChangeText={(text) => handleTextChange(text)}
          value={value}
        />
      );
    }
    

    工作示例

    https://snack.expo.io/rJkj95ePB

    【讨论】:

    • 有效。这里需要注意的一点(对于其他人)是智能标点符号也将 --- 转换为 emdash。因此,用-- 替换破折号可以有效地防止输入------ 将被“更正”为 emdash,然后通过您的解决方案中的逻辑固定为 --。键入第三个破折号实际上是不可能的。
    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2014-04-19
    • 2017-08-17
    相关资源
    最近更新 更多