按返回键“不”关闭软件键盘 - SwiftUI

2023-12-14

我想创建一个 TextField,可以在其中快速输入多个字符串项same字段,输入项目,然后点击return添加它。

我已经有了添加功能,但是我不想在每次按回车键将项目添加到列表时关闭键盘,因为这对于用户每次点击文本字段以返回该项目来说很麻烦键盘。

我正在寻找一个纯粹的 SwiftUI 解决方案如果可能的话。

我有什么:

import SwiftUI

struct StackOverflowSubmissions: View {

   @State var item: String = ""
   var body: some View {

      TextField("Enter item...", text: $item, onCommit: {

         // Add item to CoreData database

      })
         .textFieldStyle(RoundedBorderTextFieldStyle())
         .padding(5)
         .background(Color(.gray))
         .cornerRadius(10)
         .padding()
    }
}

struct StackOverflowSubmissions_Previews: PreviewProvider {
    static var previews: some View {
        StackOverflowSubmissions()
    }
}



这里是CustomTextField这不会最小化键盘而是下一个CustomTextView是专注的。这个过程一直持续到当前CustomTextField是最后一个CustomTextField.

struct CustomTextField: UIViewRepresentable {
    @Binding var text: String // String value of the TextView
    let placeholder: String // Placeholder Text
    let keyboardType: UIKeyboardType // Keypad layout type
    let tag: Int // Tag to recognise each specific TextView
    var commitHandler: (()->Void)? // Called when return key is pressed

    init(_ placeholder: String, text: Binding<String>, keyboardType: UIKeyboardType, tag: Int, onCommit: (()->Void)?) {
        self._text = text
        self.placeholder = placeholder
        self.tag = tag
        self.commitHandler = onCommit
        self.keyboardType = keyboardType
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> UITextField {
        // Customise the TextField as you wish
        let textField = UITextField(frame: .zero)
        textField.keyboardType = self.keyboardType
        textField.delegate = context.coordinator
        textField.backgroundColor = UIColor(white: 0.0, alpha: 0.025)
        textField.layer.borderWidth = 0.5
        textField.layer.borderColor = UIColor.tertiaryLabel.cgColor
        textField.font = UIFont.systemFont(ofSize: 16.0, weight: .light)
        textField.layer.cornerRadius = 6
        textField.isUserInteractionEnabled = true
        textField.text = text
        textField.textColor = UIColor.lightGray
        textField.tag = tag
        textField.placeholder = placeholder

        // For left inner padding
        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: 120))
        textField.leftView = paddingView
        textField.leftViewMode = UITextField.ViewMode.always

        return textField
    }

    func updateUIView(_ uiView: UITextField, context: Context) {
        uiView.text = self.text
        uiView.setContentHuggingPriority(.init(rawValue: 70), for: .vertical)
        uiView.setContentHuggingPriority(.defaultLow, for: .horizontal)
    }

    class Coordinator : NSObject, UITextFieldDelegate {

        var parent: CustomTextField

        init(_ uiTextView: CustomTextField) {
            self.parent = uiTextView
        }

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

            if let value = textField.text as NSString? {
                let proposedValue = value.replacingCharacters(in: range, with: string)
                parent.text = proposedValue as String
            }
            return true
        }

        func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            if let nextTextField = textField.superview?.superview?.viewWithTag(textField.tag + 1) as? UITextField {
                nextTextField.becomeFirstResponder()
            } else {
                textField.resignFirstResponder()
            }
            return false
        }

        func textFieldDidEndEditing(_ textField: UITextField) {
            parent.commitHandler?()
        }
    }
}

Use CustomTextView in the ContentView像这样:

struct ContentView: View {
    @State var firstName: String = ""
    @State var lastName: String = ""
    @State var email: String = ""

    var body: some View {
        VStack {
            Text("First Name Value: \(firstName)")
            CustomTextField("First Name", text: self.$firstName, keyboardType: .default, tag: 1, onCommit: nil).padding().frame(height: 70)


            Text("Last Name Value: \(lastName)")
            CustomTextField("Last Name", text: self.$lastName, keyboardType: .default, tag: 2, onCommit: {
                    print("Last Name is: \(self.lastName)")
                }).padding().frame(minWidth: 0, maxWidth: .infinity, minHeight: 70, maxHeight: 70)


            Text("Email Value: \(email)")
            CustomTextField("Email", text: self.$email, keyboardType: .emailAddress, tag: 3, onCommit: {
                    print("Email is: \(self.email)")
                }).padding().frame(minWidth: 0, maxWidth: .infinity, minHeight: 70, maxHeight: 70)
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按返回键“不”关闭软件键盘 - SwiftUI 的相关文章

  • 如何在注销并重新登录后保存按钮状态?

    我有一个保存按钮 点击该按钮后 会将标签 quoteLabel 中的文本保存到 Firebase 中的用户帐户 然后该按钮将隐藏 并且取消保存按钮将不再隐藏 以便用户可以根据需要取消保存 这两个按钮都可以根据需要发布和删除数据 但是 如果我
  • 命令行工具中的框架问题

    在每个人开始向我扔其他堆栈溢出和论坛帖子之前 我把它们都看了 他们都没有帮忙 我有一个简单的 cmd 工具 名为swizzler并想要嵌入SwizzleSrc其中的框架 我已经遵循了所有教程并且堆栈溢出但没有运气 这就是我得到的 Build
  • ios如何搜索目录

    我想知道如何检查我的应用程序中是否存在目录 例如 如果我想搜索我的应用程序文档中是否存在文件夹 以及如何在其中创建新文件夹 此致 检查文件是否存在 BOOL fileExistsAtAbsolutePath NSString filenam
  • 如何在 Alamofire 中使用“responseDecodable”方法?

    I have been trying to use responseDecodable method from Alamofire but I m getting Generic parameter T could not be infer
  • 为什么我需要 2 个或更多核心数据模型?

    我很想知道谁使用多个核心数据模型以及为什么 有什么好处 我正在开发一个应用程序 我认为我可以从多个模型中受益 但我不确定其他好处 我即将推出的应用程序将适用于 iPad 和 iPhone 的另一个版本 iPad 有 3 个主要内容 iPho
  • 如何在 iOS 中创建多行表格单元格?

    如何让第二个单元格扩展以适合文本而不是缩放文本 iOS 中有内置的方法可以做到这一点 还是我必须想出一些自制的解决方案 如果您查看 iOS 联系人应用程序 会发现有一个类似地址的框 但我找不到如何实现这一点 对于任何希望将来实现这一目标的人
  • 每次打开应用程序时,FileManager 的路径 URL 都不同[重复]

    这个问题在这里已经有答案了 我想在fileManager根路径中创建一个文件夹 但在创建之前 我想检查该文件夹是否存在 如果不存在 我将创建 否则将保留它 这是我使用的功能 public func isDirectoryExist path
  • tableView:canEditRowAtIndexPath: 弹出 viewController 时崩溃

    我有一个带有UITableView 我允许通过滑动来编辑 删除 的行 就像在邮件应用程序中一样 我用以下方法来做到这一点 BOOL tableView UITableView tableView canEditRowAtIndexPath
  • 核心数据executeFetchRequest消耗大量内存

    我正在核心数据数据库中插入 cca 100 000 条记录 数据库包含 3 个实体 球员 俱乐部 球员俱乐部 实体之间存在关系 玩家 gt 玩家俱乐部俱乐部 在 PlayerClub 中插入时 我注意到插入大约 50 000 条记录后会消耗
  • 以编程方式更改自动布局约束后视图未更新

    事先我必须说 我实际上得到了我想要的可见效果 但不是以令人满意的方式 因为现在需要 打破 约束而不是正确更新 我有一个 ViewController 其中包含一个 UITableView 那个的高度tableView可以从 0 不可见 到它
  • 尽早检测有问题的 XIB 视图

    我的笔尖名称有一个拼写错误 当我推向导航控制器时 它在代码中被破坏了 弄清楚它并没有花太长时间 但我认为最好尽早断言格式良好 以便更容易弄清楚 问题是它不是零 它只是无法从笔尖正确地形成自己 在 initWithNib 之后是否有更好的断言
  • ios GPUImage,小尺寸图像处理效果不好?

    我正在尝试为 OCR 准备图像 我使用 GPUImage 来完成 代码工作正常 直到我裁剪图像 裁剪后我得到了糟糕的结果 作物面积 https www dropbox com s e3mlp25sl6m55yk IMG 0709 PNG h
  • 将时间舍入到最接近的三十秒

    我有一个应用程序 它显示每 30 秒过期的数据 准确地说 在 h m s 11 30 00 11 30 30 11 31 00 等 我可以获得当前时间 但我不确定如何计算现在到最近的三十秒之间的时间 我发现的所有内容都是 Objective
  • 如何使用 SwiftUI 使按钮可拖动/可移动?

    我正在尝试使用 SwiftUI 制作一个可移动的按钮 从看起来这应该可行 我尝试将带有文本的按钮放入另一个 ZStack 中 有一秒钟它可以工作 但一旦我释放按钮 拖动就会停止 我无法再拖动 我注意到尽管按钮已经移动 但水龙头仍然位于中心
  • 如何将 RGB 值转换为十六进制字符串 iOS swift

    我想将 RGB 值转换为十六进制字符串 我将十六进制转换为 RGB 如下所示 但反之亦然 func hexStringToRGB hexString String gt red CGFloat green CGFloat blue CGFl
  • 如何在 Swift 中使用函数数组

    我已经阅读了我可以在这里找到的所有关于函数数组的帖子 太棒了 你能做到 我估计 但没有一篇文章实际上展示了如何使用它们 至少不是我想要做的 这就是我想要的 它们都可以采用相同的参数 但这不是必需的 这篇文章很接近 将允许我循环执行每个函数
  • AST 文件格式错误或损坏

    我有一个问题 我不知道为什么会发生这种情况 但很可能是因为我错误地按了 移动到垃圾箱 到某些系统框架 我收到一条错误消息 AST 文件格式错误或损坏 找不到 AST 文件引用的文件 Users username myProject Quar
  • 在 for 循环中为元组赋值

    struct MIDIPacket 中有一个 UInt8 的元组 正常的赋值是这样的 import CoreMIDI let packet MIDIPacket packet data 0 0x02 packet data 1 0x5f 等
  • 在 Swift 中计算两个 CLLocation 点之间的方位角 [重复]

    这个问题在这里已经有答案了 我正在尝试计算仅 swift 代码中两个 CLLocation 点之间的方位 我遇到了一些困难 并假设这是一个非常简单的函数 堆栈溢出似乎没有列出任何内容 func d2r degrees Double gt D
  • Objective-C 中 NSURL 为 null 而 NSString 是正确的

    我有一个NSString包含一个 url 以及当我分配时NSURL与NSString NSURL 输出 空 这是因为url中有一些非法字符 导致NSURL不编码就无法读取NSString包含网址 NSString u incomingUrl

随机推荐

  • 如何使用 Zend 2 保存处理程序 DbTableGateway?

    The Zend Session 保存处理程序本教程提供了 DbTableGateway 的示例 其中使用未定义的 adapter 变量创建 TableGateway 我想使用处理程序来绑定会话管理器 来自教程的上一页 到我的数据库中的会话
  • 默认情况下使用多个字段进行多重搜索

    所以 有一个 jqGrid 带有声明 如下所示 grid jqGrid bunch of stuff searchGrid multipleSearch true 这很好 当我单击 搜索 按钮时 它会为我带来模式形式 我猜是第一列和 sop
  • 执行 C# 交互式 powershell 脚本

    假设我使用 C 执行 powershell 脚本 脚本执行的结果是请求凭据才能继续 Example Pipeline pipeline runspace CreatePipeline pipeline Commands AddScript
  • 如何在 WXP(和更新的 MSWindows)上使用 C# 终止所有[大]子进程

    问题 如何确定子进程中的所有进程流程树杀掉他们 我有一个用 C 编写的应用程序 它将 从服务器获取一组数据 生成第 3 方实用程序来处理数据 然后 将结果返回给服务器 这工作正常 但由于跑步消耗a lotCPU 和may需要长达一个小时 我
  • 具有 C++ 虚函数时的 GDB 不完整类型

    我刚刚注意到一些奇怪的事情 当我在类中添加 虚拟关键字 除构造函数之外的任何函数 时 我无法在 GDB 中显示对象的内容 GDB 说 不完整类型 这是代码 reco h ifndef RECO H define RECO H include
  • 使用 api 1.1 的 Twitter POST 问题

    我们刚刚更改为 Twitter api 1 1 现在发推文不起作用并返回错误 远程服务器返回错误 400 错误请求 对此进行的研究表明 这与身份验证有关 但我们正在发送刚刚从登录页面获得的 accessToken 和机密 在 api 1 0
  • Linux内核中使用的三个优先级有什么区别?

    我是 Linux 内核的新手 现在我正在研究 Linux 内核中的进程调度 Linux 中存在三种类型的优先级 静态优先级 动态优先级 实时优先级 现在我明白的是 静态优先级和动态优先级仅针对传统进程定义它们只能取 100 到 139 之间
  • 使用令牌保护 REST Web 服务 (Java)

    这个问题在某种程度上与下面链接的问题相关 但是 我需要更清楚地了解某些方面和一些附加信息 参考 REST Web 服务身份验证令牌实施 背景 我需要使用令牌实现 REST Web 服务的安全性 Web 服务旨在与 Java 客户端一起使用
  • 是否有 JavaFX 方法来测试坐标是否在闭合路径内?

    我试图找到一种 JavaFX 方法来检测坐标是否位于闭合路径内 我创建了以下示例 并研究了各种方法 但是没有任何效果如我所愿 只有在非矩形形状内时才返回 true Node contains 仅适用于形状的边缘 不适用于内部 Node in
  • 如果仅知道密钥和明文,则恢复 AES IV

    如果我以 AES CBC 模式解密密文 并且第一个块的解密明文与原始已知明文不匹配 则很明显用于解密的 IV 与加密期间使用的 IV 不匹配 用于加密或解密的 IV 均未知 如果我知道密文 我可以执行以下操作来查找加密期间使用的 IV 尝试
  • Python 中限制函数执行

    类似的问题和答案还有很多 但我仍然找不到可靠的答案 所以 我有一个函数 可能运行时间太长 函数是私有的 从某种意义上说我无法更改它的代码 我想将其执行时间限制为 60 秒 我尝试了以下方法 Python 信号 不适用于 Windows 和多
  • 在 Eclipse 中获取类中所有方法的概览

    我已经完成了相当多的 xCode 编程 发现类中方法的概述视角非常有用 它看起来像这样 MY GROUP 1 lt defined with pragma mark MY GROUP 1 M method11 M method12 M MY
  • 如何在按键时更改 pygame 中文本的颜色?

    当谈到 pygame 时 我是一个完全的业余爱好者 我需要制作一个程序 当文本沿不同方向传播时 该程序会改变文本的颜色 这意味着每次按键 上 下 左 右 颜色都会不同 到目前为止 我已经能够让文本向各个方向移动 但是我不明白如何改变颜色 任
  • 堆分配一个二维数组(不是指针数组)

    我正在编写 C 代码 我想堆分配 512 256 字节 为了我自己的方便 我希望能够使用语法 array a b 访问元素 没有算术来找到正确的索引 我在网上看到的每个教程都告诉我创建一个指针数组 该数组指向我想要在数组中包含的行的数组 这
  • 两个文本字段的总和 - javascript

    我在网上找到了 this 1 相当困难的 javascript 示例 并且我已经在我的网站上成功实现了它 但是 在本例中 我希望在一个新文本字段中获得两个小计的结果 传统的getElementbyId and total value tot
  • Mongoose:定义未找到文档的 404 状态不起作用

    我正在学习 MongoDB 和 mongoose 现在我在为我的路由处理程序定义 404 状态时遇到问题 这是代码 app get users id async req res gt const id req params id try c
  • Sql 层次结构 ID 按级别排序

    是否可以按层次结构 id 对层次结构中的 sql 数据进行排序 然后对每个级别按字母顺序排序 假设我们有一个员工表 其中根据员工 ID 列出了组织层次结构 鲍勃 5 有菲尔 17 和查理 28 向他汇报 乔西 6 有泰勒 15 和迈克 56
  • VBA 运行时错误中没有调试选项

    我使用的是 excel 2013 当出现运行时错误时 我没有得到任何调试选项 如何在运行时错误期间获得调试选项 编辑 我意识到我只在以下情况下遇到这个问题 通常我会得到调试选项 除了这种情况 特别痛苦的是它甚至不告诉我错误在哪一行 错误的屏
  • Promise : then 与 then + catch [重复]

    这个问题在这里已经有答案了 以下2个代码有什么区别吗 myPromise then function console log success catch function console log error myPromise then f
  • 按返回键“不”关闭软件键盘 - SwiftUI

    我想创建一个 TextField 可以在其中快速输入多个字符串项same字段 输入项目 然后点击return添加它 我已经有了添加功能 但是我不想在每次按回车键将项目添加到列表时关闭键盘 因为这对于用户每次点击文本字段以返回该项目来说很麻烦