描述
在大多数情况下,顺序保持不变:
onChange -> onChangeText -> onSelectionChange
以下是我在iOS中发现的一些情况(可能还有更多):
- 对于多行文本输入框,第一次按键时触发onSelectionChange事件,但后续的按键触发onChangeText/onChange事件。
- 选择并删除一个单词也会删除它左边的一个空格,但在这种情况下,onSelectionChange事件先触发。
重现步骤
Snack
在textInput组件中,使用多行和console.log作为讨论中每个函数的回调函数,查看输出
React Native版本
0.74.84
受影响的平台
运行时 - iOS
npx react-native info
的输出
System:
OS: macOS 14.5
CPU: (8) x64 Intel(R) Core(TM) i5-1038NG7 CPU @ 2.00GHz
Memory: 33.76 MB / 16.00 GB
Shell:
version: "5.9"
path: /bin/zsh
Binaries:
Node:
version: 21.7.3
path: ~/.nvm/versions/node/v21.7.3/bin/node
Yarn: Not Found
npm:
version: 10.5.0
path: ~/.nvm/versions/node/v21.7.3/bin/npm
Watchman:
version: 2024.05.06.00
path: /usr/local/bin/watchman
Managers:
CocoaPods:
version: 1.15.2
path: /usr/local/bin/pod
SDKs:
iOS SDK:
Platforms:
- DriverKit 23.5
- iOS 17.5
- macOS 14.5
- tvOS 17.5
- visionOS 1.2
- watchOS 10.5
Android SDK: Not Found
IDEs:
Android Studio: 2023.2 AI-232.10300.40.2321.11668458
Xcode:
version: 15.4/15F31d
path: /usr/bin/xcodebuild
Languages:
Java:
version: 20.0.1
path: /usr/bin/javac
Ruby:
version: 2.6.10
path: /usr/bin/ruby
npmPackages:
"@react-native-community/cli": Not Found
react:
installed: 18.2.0
wanted: 18.2.0
react-native:
installed: 0.74.2
wanted: 0.74.2
react-native-macos: Not Found
npmGlobalPackages:
"*react-native*": Not Found
Android:
hermesEnabled: true
newArchEnabled: false
iOS:
hermesEnabled: true
newArchEnabled: false
堆栈跟踪或日志
selection triggered {"end":1,"start":1}
change triggered
change text triggered H
change triggered
change text triggered i
selection triggered {"end":1,"start":1}
重现器
https://snack.expo.dev/zhVuXAjkAi5BMHVKq__vG
截图和视频
- 无响应*
4条答案
按热度按时间watbbzwu1#
你能提供修复这个问题的PR吗?
xiozqbni2#
cortinico,你能提供修复这个问题的PR吗?
抱歉我选错了标签
dced5bon3#
关于这个问题。
这是iOS的默认行为。
我在系统消息应用上进行了检查,以供参考。
模拟器。屏幕。录制。-。iPhone。15。Pro。-。2024-07-10。at。15.55.35.mp4
发现 :
textView(_:shouldChangeTextIn:replacementText:)
将首先被调用。这将检测到要更改的文本(尚未反映),并从此函数返回YES
。YES
将进一步调用textViewDidChangeSelection
[UITextField代理方法],并删除一个左侧的空格字符。解决方案 :
textView(_:shouldChangeTextIn:replacementText:)
方法中保留之前的文本,并在textViewDidChangeSelection
中检查文本是否发生了变化,然后添加多余的空格。在这里,需要处理许多边缘情况。对于这个问题:
对于多行文本输入框,对于首次按键时onSelectionChange会先触发,但对于后续按键时onChangeText/onChange会先触发
我已经开始对此进行调试。
h79rfbju4#
修复此问题:#45377
对于多行文本输入,在onSelectionChange上的第一个按键会先触发,但后续的按键在onChangeText/onChange上会先触发。
已在PR中添加我的发现。