编辑格式化十进制文本字段时光标移至末尾 - Swift

2023-12-09

我正在格式化UITextField这样在输入时它就变成逗号分隔(十进制样式)。

So 12345678变成12,345,678

现在当我编辑UITextField,说我想删除5,当时我点击之后5并删除它,但光标立即移动到文本末尾,之后8.

这是我在输入时用来格式化小数的代码:

func checkTextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if ((string == "0" || string == "") && (textField.text! as NSString).range(of: ".").location < range.location) {
        return true
    }
    let allowedCharacterSet = NSCharacterSet(charactersIn: "0123456789.").inverted
    let filtered = string.components(separatedBy: allowedCharacterSet)
    let component = filtered.joined(separator: "")
    let isNumeric = string == component
    if isNumeric {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
        let numberWithOutCommas = newString.replacingOccurrences(of: ",", with: "")
        let number = formatter.number(from: numberWithOutCommas)
        if number != nil {
            var formattedString = formatter.string(from: number!)
            if string == "." && range.location == textField.text?.count {
                formattedString = formattedString?.appending(".")
            }
            textField.text = formattedString
        } else {
            textField.text = nil
        }
    }
    return false
}

它的名字是这样的:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let textFieldText = (textField.text! as NSString).replacingCharacters(in: range, with: string)
    let checkForCurrency = checkTextField(textField, shouldChangeCharactersIn: range, replacementString: string)
    return checkForCurrency
}

我尝试了以下方法但没有成功:

解决方案1

解决方案2

光标移动的原因可能是什么? 它应该是类似的this关联 任何帮助,将不胜感激!


update your custom function with :

func checkTextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        let textFieldText = (textField.text! as NSString).replacingCharacters(in: range, with: string)
        if ((string == "0" || string == "") && (textField.text! as NSString).range(of: ".").location < range.location) {
            return true
        }

        var currentPosition = 0
        if let selectedRange = textField.selectedTextRange {
            currentPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)
        }

        let allowedCharacterSet = NSCharacterSet(charactersIn: "0123456789.").inverted
        let filtered = string.components(separatedBy: allowedCharacterSet)
        let component = filtered.joined(separator: "")
        let isNumeric = string == component
        if isNumeric {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
            let numberWithOutCommas = newString.replacingOccurrences(of: ",", with: "")
            let number = formatter.number(from: numberWithOutCommas)

            if number != nil {
                var formattedString = formatter.string(from: number!)
                if string == "." && range.location == textField.text?.count {
                    formattedString = formattedString?.appending(".")
                }
                textField.text = formattedString

                if(textFieldText.count < formattedString?.count ?? 0){
                    currentPosition = currentPosition + 1
                }
            }else{
                textField.text = nil
            }
        }

        if(string == ""){
            currentPosition = currentPosition - 1
        }else{
           currentPosition = currentPosition + 1
        }

        if let newPosition = textField.position(from: textField.beginningOfDocument, offset: currentPosition) {
            textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
        }
        return false
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编辑格式化十进制文本字段时光标移至末尾 - Swift 的相关文章

  • 在 Swift 中寻找“退出”等价物[重复]

    这个问题在这里已经有答案了 我尝试把exit 0 在一个小型测试 命令行 程序中 Xcode 给出了一条错误消息 指出Use of unresolved identifier exit 这让我很困惑 因为这个问题 https stackov
  • 如何在导航栏中添加右键?

    我有一个问题要在导航栏中添加右键 我有两个视图 视图 A 和视图 B 我添加了一个导航栏来查看A 之后我使用了self navigationController pushViewController显示视图 B 视图B的导航栏左侧自动显示一
  • Xcode 12 根本没有调用动态链接 Firebase 函数?

    因此 我有一个正在运行的动态链接 当我单击它时它会打开应用程序 但不会发生动态链接的处理 这是因为下面看到的应用程序功能从未输入过 我不知道为什么 func handleIncomingDynamicLink dynamicLink Dyn
  • UITextField 文本更改事件

    如何检测文本字段中的任何文本更改 委托方法shouldChangeCharactersInRange适用于某些东西 但它并不能完全满足我的需求 因为在它返回 YES 之前 textField 文本不可用于其他观察者方法 例如在我的代码中ca
  • Swift - 本地通知不会被触发

    我正在 Swift 3 中编码 我只是想发送通知now没有任何延迟或间隔 然而 通知永远不会被触发 这是我的代码 视图控制器代码 import UserNotifications class HomeViewController UIVie
  • Swift 中的柯里化,未来会有新的声明语法吗?

    今天刚在 Linux 上安装了 Swift 来看看 尝试一个柯里化的小例子会导致警告 柯里化的语法将来会改变 但是我找不到任何关于这个新语法的信息 我尝试过的柯里化示例 func do stuff x Int y Int z Int gt
  • iOS8 CoreData“使用未实现的初始化程序”

    我尝试运行我的应用程序时收到以下错误 致命错误 对类 rcresttest CatalogItem 使用未实现的初始化程序 init entity insertIntoManagedObjectContext 我可以通过将数据模型中的实体类
  • SwiftUI 列表与右侧的部分索引?

    是否可以有一个在右侧有索引的列表 就像下面 SwiftUI 中的示例一样 我在 SwiftUI 中做了这个 Contacts swift TestCalendar Created by Christopher Riner on 9 11 2
  • 如何在 SwiftUI 中仅使用 ForEach 而不是列表来滑动删除

    我正在 SwiftUI 中使用 ForEach 制作自定义列表 我的目标是进行滑动删除手势 而不是将 ForEach 嵌入到列表中 到目前为止 这是我的代码 import SwiftUI struct ContentView View le
  • GeoFire Swift 3 - 保存和更新坐标

    我正在尝试使用 GeoFire 将坐标存储到 Firebase 数据库中 我不确定如何更新新坐标 因为它们每秒都会更改 更新 随着childByAutoId 它正在为每辆自行车生成一个新的唯一 ID 如何引用这个唯一的自行车 ID 例如 用
  • 如何接收有关与我共享的记录中所做更改的 CloudKit 通知?

    我有两个 iCloud 帐户 A and B 在两个不同的设备上 来自其中之一 A 我将 ckrecord 分享给另一个人 B 像这样 let controller UICloudSharingController controller p
  • 适用于 iPhone / iPad / iOS 的快速、精益 PDF 查看器 - 提示和提示?

    最近有很多关于绘制 PDF 的问题 是的 您可以使用UIWebView但这无法提供您所期望的优秀 PDF 查看器的性能和功能 您可以绘制PDF页面到 CALayer http www cocoabuilder com archive coc
  • Swift:使具有相同“形状”的两种类型符合通用协议

    我有两种不同的类型 它们代表相同的数据 并且具有完全相同的 形状 这两种不同的类型是代码生成的 我被迫处理它们 但是 我想让它们符合一个通用的协议 这样我就可以对这两种类型一视同仁 这是一个例子 假设这是我所坚持的两种代码生成类型 stru
  • 作为!与 Swift 中 Xcode 6.3 中的 as 运算符对比

    Xcode 6 3 使 Swift 发生了很大变化 我必须更换每个应用程序中的数十个位置as gt as 为什么 现在有什么规则 在 Swift 1 2 之前 as运算符可用于执行两种不同类型的转换 具体取决于要转换的表达式的类型及其要转换
  • SwiftUI:发送电子邮件

    在正常情况下UIViewController在 Swift 中 我使用此代码发送邮件 let mailComposeViewController configuredMailComposeViewController mailCompose
  • 将 UIToolBar 添加到所有键盘(swift)

    我正在尝试以尽可能少的重复次数将自定义 UIToolBar 添加到我的所有键盘中 我目前的做法要求我将代码添加到所有 viewDidLoads 中 并将每个文本字段的委托分配给我正在使用的 viewController 我尝试创建自己的 U
  • Swift:长按手势识别器 - 检测轻击和长按

    我想连接一个动作 如果手势是点击 它会以特定的方式为对象设置动画 但如果按下持续时间超过 0 5 秒 它会执行其他操作 现在 我刚刚连接了动画 我不知道如何区分长按和点击 如何访问新闻持续时间以实现上述目的 IBAction func ta
  • 动态调度协议扩展不适用于多个目标

    这是我的主要目标中的代码 所以不是测试目标 protocol ProtocolA func dontCrash extension ProtocolA func dontCrash fatalError func tryCrash dont
  • 通过 Button Swift 中的标签发送行和部分

    我里面有这个cellForRowAtIndexPath cell plusBut tag indexPath row cell plusBut addTarget self action plusHit forControlEvents U
  • 如何在 Swift 2.0 中使用 stringByAddingPercentEncodingWithAllowedCharacters() 作为 URL

    我在 Swift 1 2 中使用过这个 let urlwithPercentEscapes myurlstring stringByAddingPercentEscapesUsingEncoding NSUTF8StringEncoding

随机推荐

  • 如何在字段级别忽略未知字段?

    我在请求中使用另一个模块中的类 public class KeyInput NotNull private Long id NotNull private String startValue NotNull private String e
  • 继承基类的构造函数

    对于以下代码 struct Base protected Base Base int struct Derive public Base public using Base Base int main Derive d1 Derive d2
  • 为什么mapreduce作业中需要setMapOutputKeyClass方法

    当我编写mapreduce程序时 我经常写这样的代码 job1 setMapOutputKeyClass Text class 但为什么我们要显式指定 MapOutputKeyClass 呢 我们已经在映射器类中指定了它 例如 public
  • C++ 中的前向声明是什么? [复制]

    这个问题在这里已经有答案了 这个答案 says 最后 typedef struct Foo 声明一个匿名结构并为其创建一个 typedef 因此 对于此构造 它在标记命名空间中没有名称 只有 typedef 命名空间中的名称 这意味着它也不
  • AWS EMR 并行映射器?

    我正在尝试确定我的 EMR 集群需要多少个节点 作为最佳实践的一部分 建议是 您的工作所需的映射器总数 处理时间 每个实例容量 所需时间 如下所述 http www slideshare net AmazonWebServices amaz
  • 如何使用 asternet 从星号获取变量值

    我用asterNet用于管理事件 INasterisk 我需要获取变量的值 result 在 c 中来自dialplan query exten gt test 1 NoOp test same gt n Answer same gt n
  • 列出来,不丢失参考

    面试回来 我与您分享 欢迎一个好的 准确的答案 目的是 你有一个静态方法 这个方法接收一个IList
  • c 将 char* 拆分为 char**

    我正在从文件中读取一行 逐个字符 使用 fgetc 其中所有字段 名字 姓氏 均由 我现在想做的是创建一个char 将所有字符添加到其中并替换 by 0这样我就可以有效地获得所有字段的列表 这实际上有可能吗 当我创建一个 char 时 例如
  • 如何重置反应组件,包括所有可传递可达的状态?

    我偶尔会有一些概念上有状态的反应组件 我想重置它们 理想的行为相当于删除旧组件并读取新的原始组件 React提供了一个方法setState它允许设置组件自己的显式状态 但排除隐式状态 例如浏览器焦点和表单状态 并且还排除其子级的状态 捕获所
  • 更改工作文件夹位置

    我想更改工作文件夹的位置 如何在我的 SVN 存储库中进行更改 我正在使用 TortoiseSVN 客户端 如果您想移动整个工作副本 只需将其移动到文件系统中即可 如果您想移动工作副本中的文件夹并稍后提交移动 请右键单击该文件夹 然后选择
  • 小牛队上的 PyQt4 和 python 3

    我在 Xubuntu 中制作了一个 python 应用程序 目前正在尝试在 Mavericks 上运行 该项目的 GUI 部分使用 PyQt4 我目前正在尝试在 Mavericks 上安装 PyQt4 并在运行时出现以下错误brew ins
  • .NET 嵌套类

    我正在开发的当前类库将有一个基类 Field 其中包含超过 50 个特定的 字段 类型 这些类型将从 Field 继承并嵌套以保持可读性 例如 abstract class Field public int Length get set p
  • 如何解析来自github的csv?

    jQuery ajax url https raw githubusercontent com CSSEGISandData COVID 19 master csse covid 19 data csse covid 19 time ser
  • knitr:将计算机输出包装在 HTML 标签中

    使用knitr 我试图将输出包装在特定类的div 中 例如 代码如下 r Print the pressure data set head pressure 我希望将输出 而不是代码 包装在 div 中 例如 div class mycla
  • 带有连接列的 Flask SQLAlchemy 查询

    我有一个这样的模型 class User db Model id db Column db Integer primary key True first name db Column db String 64 index True last
  • Excel 宏加载数组

    我不知道如何表达这个问题 但我遇到了一个问题 我需要将一组工作表中的名称列表加载到单独的数组中 例如 Sheet 1 Column A有10个名字要加载到array1 Sheet 2 Column A有14个名字要加载到array2 我知道
  • 一个 Pod 中存在多个容器

    我正在从 openshift 2 迁移一个应用程序 该应用程序由 Java jetty 网络服务器和 mongo 数据库组成 Web服务器和mongo都需要访问持久存储 以及访问数据库的服务器 由于我可用的卷无法 我相信 由两个 pod 访
  • 使用 opam 安装适用于 Z3 的 ocaml API

    我想在我的 OCaml 程序中使用 Z3 使用opam 我做到了 opam install z3 eval opam env 然后尝试编译 ocamlfind ocamlopt o main package z3 linkpkg main
  • 如何将 cassandra 数据从一个集群复制到另一个集群

    我有 2 个 cassandra 集群 位于不同的数据中心 请注意 这是 2 个不同的集群 而不是具有 multidc 的单个集群 并且两个集群具有相同的键空间和列族模型 我希望以最有效的方式将列族C的数据从集群A复制到集群B 我可以通过
  • 编辑格式化十进制文本字段时光标移至末尾 - Swift

    我正在格式化UITextField这样在输入时它就变成逗号分隔 十进制样式 So 12345678变成12 345 678 现在当我编辑UITextField 说我想删除5 当时我点击之后5并删除它 但光标立即移动到文本末尾 之后8 这是我