Невозможно включить автозамену в {false} в реагирующем родном TextInput - PullRequest
0 голосов
/ 08 ноября 2018

При изменении текста в TextInput я определяю, нажал ли пользователь кнопку @ для упоминания.

onChangeText(text){
    const suggestTrigger = text.match(/\B@[A-Za-z0-9]*$/i) //grab "@" trigger
    const searchQuery = (suggestTrigger && suggestTrigger.length > 0) ? suggestTrigger[0] : null;
    this.setState({
        searchQuery: searchQuery
    })
}

Затем в моем рендере я делаю:

<TextInput 
    autoCapitalize={this.state.searchQuery ? "none" : "sentences"}
    autoCorrect={this.state.searchQuery ? false : true}
    onChangeText={this.onChangeText}
/>

Однако, даже когда я делаю это, автозамена не отключается.

Я все еще вижу это:

enter image description here

Это вызывает проблемы, потому что часто система полностью заменяет все упоминание другим словом.

Как отключить автозамену и автокапитализацию , отключить , когда пользователь нажимает кнопку @? ' Я даже пытался сделать рендеринг совершенно другим, но поведение остается.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

TL; DR : после закрытия переключателя TextInput autoCorrect вы должны закрыть и перезапустить клавиатуру.

Дружище, это не твоя вина, у меня была такая же проблема на autoFocus из react native TextInput компонента. Я устанавливаю state имя для TextInput editable реквизита, а затем, нажимая кнопку pencil, меняю editable реквизита. После того как TextInput сделал редактируемым, курсор должен быть сфокусирован, дизайнер сказал мне, поэтому я использую состояние isEditable для autoFocus prop, см. Ниже:

state = {
  isEditable: false
};

handleEdit = () => {
  const { isEditable } = this.state;
  this.setState({ isEditable: !isEditable });
};

<TextInput
  autoFocus={isEditable}
  editable={isEditable}
  style={styles.textNameEditable}
  defaultValue={text}
  numberOfLines={1}
/>

enter image description here

Затем я нажимаю кнопку редактирования, и получается:

enter image description here

Но он не сфокусирован и клавиатура не запускалась, я искал и нашел эту ссылку , TextInput не меняет / обновляет некоторые свои реквизиты после componentDidMount. ☹️. Кроме того, он не отличается в iOS или Android, у них обоих есть эта проблема, я использовал ref, чтобы сфокусироваться на этом TextInput после того, как состояние isEditable установило true. см. следующий код:

<TextInput
  editable={isEditable}
  style={styles.textNameEditable}
  defaultValue={text}
  numberOfLines={1}
  ref={input => {
    this.input = input;
  }}
/>

componentDidUpdate() {
  const { isEditable } = this.state;
  if (isEditable) {
    this.input.focus();
  }
}

А ваш случай:

Абсолютно нельзя использовать ref, потому что autoCorrect должен отображаться с react native, и это не похоже на focus() и blur(), поэтому JavaScript не может получить к нему доступ.

Я создаю тестовую форму для вашего случая, я создаю еще одну кнопку, например звездочку, для переключения значения autoCorrect рядом с моей кнопкой редактирования. закрашенная звезда означает autoCorrect означает true, а закрашенная звезда означает autoCorrect означает false, теперь см. код области тестирования и вид:

state = {
  isEditable: false,
  correct: true
};

handleCorrect = () => {
  const { correct } = this.state;
  this.setState({ correct: !correct });
};

<TextInput
  autoCorrect={correct}
  editable={isEditable}
  style={styles.textNameEditable}
  defaultValue={text}
  numberOfLines={1}
  ref={input => {
    this.input = input;
  }}
/>

enter image description here

На фотографии выше ясно, что autoCorrect отображается как true, поэтому он включен:

enter image description here

Когда я пишу неправильное персидское слово, автокоррекция показывает свое предложение, теперь пора нажать звездочку:

enter image description here

Ух, autoCorrection - это false в описанной выше ситуации, но мы все равно видим автокоррекцию мобильного телефона. это так же, как autoFocus, это визуализируется при первом рендере, и после него TextInput не может изменить / обновить свои реквизиты. вдруг нажимаю кнопку редактирования:

enter image description here

И я снова нажимаю кнопку редактирования, поэтому, конечно, вы поняли, что autoCorrect - это false сейчас, хорошо, теперь посмотрим, что я увидел:

enter image description here

* * * * * * * * * * * * * * * * false * * * * * * После моего двойного нажатия кнопки редактирования *1108* осталось, и теперь автокоррекция устройства полностью исчезла. Я не знаю, является ли это ошибкой или моим плохим пониманием, но я понял, что для обновления значения autoCorrect мы должны сделать что-то после изменения его значения, чтобы закрыть клавиатуру iPhone и затем снова -запустите это. главное, что выдало TextInput - это запущенная клавиатура.

Для моего теста, когда я нажал кнопку редактирования, editable реквизит TextInput изменился на false, и клавиатура закрылась, поэтому, когда я снова нажал кнопку редактирования, TextInput сфокусировался и клавиатура перезапущен с новым значением autoCorrect. Это Секрет .

Решение:

Вы должны что-то сделать, закрыть и снова открыть клавиатуру iOS с новым значением autoCorrect. для теста, который я написал для вашего вопроса, я решил создать гибридное инновационное решение, используя ref и обратный вызов setState:

handleCorrect = () => {
  const { correct } = this.state;
  this.input.blur(); //-- this line close the keyboard
  this.setState({ correct: !correct },
    () => {
      setTimeout(() => this.input.focus(), 50);
      //-- above line re-launch keyboard after 50 milliseconds
      //-- this 50 milliseconds is for waiting to closing keyborad finish
    }
  );
};


<TextInput
  autoCorrect={correct}
  editable={isEditable}
  style={styles.textNameEditable}
  defaultValue={text}
  numberOfLines={1}
  ref={input => {
    this.input = input;
  }}
/>

enter image description here

А после нажатия кнопки со звездочкой клавиатура закрывается и перезапускается, а автокоррекция полностью исчезает.

enter image description here

Примечание : очевидно, я суммировал некоторые другие коды, такие как деструктурирование и запись классов или расширений и т. Д. Для лучшей читаемости человеком .

0 голосов
/ 20 ноября 2018

У меня есть 2 предложения: Во-первых, вы пытались использовать запасной вариант автозамены?

spellCheck={this.state.searchQuery ? false : true}

Во-вторых, вы пробовали использовать нативный код (Obj-C / Swift)?

import { Platform, TextInput, View } from 'react-native';
import { iOSAutoCorrect } from './your-native-code';

const shouldWork = Platform.OS === 'ios' ? <iOSAutoCorrect /> : <TextInput 
autoCapitalize={this.state.searchQuery ? "none" : "sentences"}
autoCorrect={this.state.searchQuery ? false : true}
onChangeText={this.onChangeText} />

return (<View>{shouldWork}</View>);

В iOSAutoCorrect вам следует использовать UITextView. Затем установите правильное значение в зависимости от вашего состояния:

textField.autocorrectionType = UITextAutocorrectionTypeNo; // or UITextAutocorrectionTypeYes

У меня есть свободный код, поэтому код не проверен и может содержать ошибки. Удачи.

0 голосов
/ 14 ноября 2018

Проблема не в вашем коде полностью (за исключением части Regex, которая не работала на моем устройстве), а в том, как реагирует нативная визуализация клавиатуры.
Я создал образец, который вместе с вашим исходным кодом также меняет цвет фона экрана.
Вы обнаружите, что цвет меняется мгновенно, когда вводится «@», а клавиатура - нет.
Если вы не перезагрузите клавиатуру. Для этого, если вы откомментируете код, он отклоняет клавиатуру один раз и после того, как вы снова нажмете на текст. Введите новую клавиатуру без автозамены и автокапитализации.

    state = {
    searchQuery: null,
    isFocused: true,
  }
  constructor(props) {
    super(props);
    this.onChangeText = this.onChangeText.bind(this);
}

onChangeText = (val) => {
  const suggestTrigger = val.match(/@[A-Za-z0-9]*$/i) //grab "@" trigger
  const searchQuery = (suggestTrigger && suggestTrigger.length > 0) ? suggestTrigger[0] : null;
  // Un comment this to reload
  // if(searchQuery && this.state.isFocused) {
  //   this.setState({
  //     isFocused: false
  // });
  // Keyboard.dismiss();
  //   // this.myTextInput.focus()
  // }
  this.setState({
      searchQuery: searchQuery
  })
}
  render() {
    const { searchQuery } = this.state
    return (
      <View style={[styles.container,
        {
        backgroundColor: searchQuery ? "red": "green"}
      ]}>
        <TextInput 
        style={{width: 300, height: 50, borderWidth: 1}}
        ref={(ref)=>{this.myTextInput = ref}}
          autoCapitalize={searchQuery ? "none" : "sentences"}
          autoCorrect={searchQuery ? false : true}
          onChangeText={this.onChangeText}
        />
      </View>
    );
  }

Поскольку теперь мы знаем, что основной причиной ошибки, возможно, может быть найдено лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...