如何在SwiftUI经纬度输入TextField中限制使用带小数点的数字键盘?
解决方案
你注释中写的UIKit风格的键盘设置语法不适用于SwiftUI的TextField控件,直接给TextField添加keyboardType修饰符即可实现你要的键盘限制效果:
- 如果你只需要数字和小数点,给每个TextField添加
.keyboardType(.decimalPad)修饰符即可 - 如果你需要同时支持正负号输入(适配西经、南纬的负值输入场景),可以使用
.keyboardType(.numbersAndPunctuation),该键盘包含你需要的数字、小数点、正负号等标点符号
具体修改示例
你只需要给4个经纬度输入框都添加对应修饰符即可,以第一个经度输入框为例:
TextField("Longitude A", text: $longitude1) .foregroundColor(.blue) .keyboardType(.numbersAndPunctuation) // 添加这行即可切换到对应键盘
额外输入合法性校验建议
即使限制了键盘类型,也可能出现用户输入多个小数点、负号位置错误的问题,你可以添加输入过滤逻辑保证内容合法:
TextField("Longitude A", text: $longitude1) .foregroundColor(.blue) .keyboardType(.numbersAndPunctuation) .onChange(of: longitude1) { newValue in // 仅保留允许的字符:数字、小数点、负号 let allowed = CharacterSet(charactersIn: "-0123456789.") longitude1 = String(newValue.unicodeScalars.filter { allowed.contains($0) }) // 限制仅能有一个小数点 if let dotPos = longitude1.firstIndex(of: ".") { let suffix = longitude1[longitude1.index(after: dotPos)...] if suffix.contains(".") { longitude1 = String(longitude1[...dotPos] + suffix.filter { $0 != "." }) } } // 负号仅能出现在首位 if let minusPos = longitude1.firstIndex(of: "-"), minusPos != longitude1.startIndex { longitude1 = longitude1.filter { $0 != "-" } } }
内容的提问来源于stack exchange,提问作者Nathan Colosimo
相关产品推荐
相关产品推荐

