Ответ 1
TL; DR: вы должны закрыть и перезапустить клавиатуру после autoCorrect
переключения autoCorrect
TextInput
.
Дружище, это не твоя вина, у меня возникла та же проблема с autoFocus
react native
компонента TextInput
. Я устанавливаю имя state
для editable
реквизита TextInput
а затем pencil
кнопку pencil
меняю editable
реквизиты. Дизайнер сказал мне после того, как TextInput
редактируемого курсор должен быть сфокусирован, поэтому я использую isEditable
состояние для autoFocus
опоры, см ниже:
state = {
isEditable: false
};
handleEdit = () => {
const { isEditable } = this.state;
this.setState({ isEditable: !isEditable });
};
<TextInput
autoFocus={isEditable}
editable={isEditable}
style={styles.textNameEditable}
defaultValue={text}
numberOfLines={1}
/>
Затем я нажимаю кнопку редактирования и получается:
Но это не сфокусировано, и клавиатура не запускалась, я искал и нашел эту ссылку, TextInput
не изменяет/обновляет некоторые свои реквизиты после componentDidMount
. ☹️. Кроме того, это не отличается в iOS
или Android
, у них обоих есть эта проблема, я использовал ref
чтобы сосредоточиться на этом TextInput
после того, isEditable
состояние 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
звезда означает, что 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;
}}
/>
На фотографии выше видно, что autoCorrect
отображается как true
, поэтому она включена:
Когда я пишу неправильное персидское слово, автокоррекция показывает свое предложение, теперь пора нажать звездочку:
Вау, autoCorrection
false
в описанной выше ситуации, но все же мы видим автокоррекцию мобильного телефона. это так же, как autoFocus
он визуализируется при первом рендеринге, и после него TextInput
не может изменять/обновлять свои реквизиты. вдруг я нажимаю кнопку редактирования:
И я снова autoCorrect
кнопку редактирования, так что, конечно, вы поняли, что autoCorrect
теперь false
, хорошо, теперь посмотрим, что я видел:
autoCorrect
осталась false
при двойном нажатии кнопки редактирования, и теперь автокоррекция устройства полностью исчезает. Я не знаю, является ли это ошибкой или моим плохим пониманием, но я понял, что в этой области тестирования для обновления значения 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;
}}
/>
А после нажатия звездочки клавиатура закрывается и перезапускается, а автокоррекция полностью исчезает.
Примечание: очевидно, я суммировал некоторые другие коды, такие как деструктурирование и написание классов или расширений и т.д. Для лучшей читаемости человеком