TIM*_*MEX 13 keyboard text ios react-native
在我的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
})
}
Run Code Online (Sandbox Code Playgroud)
然后,在我的渲染中,我做:
<TextInput
autoCapitalize={this.state.searchQuery ? "none" : "sentences"}
autoCorrect={this.state.searchQuery ? false : true}
onChangeText={this.onChangeText}
/>
Run Code Online (Sandbox Code Playgroud)
但是,即使我这样做,自动更正也不会关闭.
我仍然看到这个:
这导致了问题,因为系统通常会用完全不同的词替换整个提及.
我怎么能拒绝自动更正和autoCapitalize 关闭,当用户按下@
按钮?"我甚至试过渲染完全不同的东西,但行为仍然存在.
Ame*_*icA 12
TL; DR:您应该在TextInput
autoCorrect
切换值后关闭并重新启动键盘.
巴迪,这是不是你的错,我有同样的问题上autoFocus
的react native
TextInput
分量.我state
为TextInput
editable
道具设置了名称,然后按下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}
/>
Run Code Online (Sandbox Code Playgroud)
然后我按下编辑按钮,它转到:
但它并没有集中精力且键盘没有启动,我寻找并发现了这个链接,之后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();
}
}
Run Code Online (Sandbox Code Playgroud)
绝对你不能使用,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;
}}
/>
Run Code Online (Sandbox Code Playgroud)
在上面的照片中,autoCorrect
渲染为如此清晰true
,因此启用:
当我写一个错误的波斯语单词时,自动更正会显示其建议,现在是按下星号按钮的时间:
哇,这autoCorrection
是false
在上述情况,但我们仍然看到手机的自动更正.就像autoFocus
它在第一个渲染中渲染一样,在它之后,它TextInput
无法更改/更新它的道具.我突然按下编辑按钮:
我再次按下编辑键,那么可以肯定,你意识到autoCorrect
是false
现在,好了,现在看到我所看到的:
在autoCorrect
保持false
我的双按下编辑按钮,现在设备的自动校正完全消失.我不知道这是一个错误或我的理解不好,但我意识到在这个测试区域,为了更新autoCorrect
价值,我们应该在更改其值后关闭iPhone键盘,然后重新启动它.发布的主要内容TextInput
是推出的键盘.
对于我的测试,当我按下编辑按钮时,它的editable
支柱TextInput
变为false并且键盘关闭,所以当我再次按下编辑按钮时,TextInput
聚焦和键盘重新启动时带有新autoCorrect
值.这是秘密.
您应该执行某些操作,使用新autoCorrect
值关闭并再次打开iOS键盘.对于我为你的问题写的测试用例,我决定做一个混合创新的解决方案,使用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;
}}
/>
Run Code Online (Sandbox Code Playgroud)
按下星形按钮后,键盘关闭并重新启动,自动校正完全消失.
注意:显然,我总结了一些其他代码,如解构和编写类或扩展等,以提高人类的可读性.
问题不完全在于您的代码(除了在我的设备中不起作用的正则表达式部分),而是如何呈现React Native
键盘。
我创建了一个示例,它与您的初始代码一起也会更改backgroundColor
屏幕。
您会发现,当输入“@”时,颜色立即发生变化,而键盘则不会。
除非你重装键盘。为此,如果您取消注释代码,它会关闭键盘一次,并且一旦您重新点击textInput
新键盘而不进行自动更正并autoCapitalize
显示。
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>
);
}
Run Code Online (Sandbox Code Playgroud)
既然现在我们知道错误的主要原因可能是可以达到更好的解决方案。
归档时间: |
|
查看次数: |
1331 次 |
最近记录: |