SwiftUI UIViewRepresentable UITextView 绑定

2024-04-06

目前 SwiftUI 本身不支持多行文本输入(希望很快就会添加此功能!),所以我一直在尝试使用组合框架来实现 UIKit 中的 UITextView,它支持多行输入,但是我得到的结果好坏参半。

这是我创建的用于制作文本视图的代码:

struct MultilineTextView: UIViewRepresentable {

    @Binding var text: String


    func makeUIView(context: Context) -> UITextView {
        let view = UITextView()
        view.isScrollEnabled = true
        view.isEditable = true
        view.isUserInteractionEnabled = true
        view.backgroundColor = UIColor.white
        view.textColor = UIColor.black
        view.font = UIFont.systemFont(ofSize: 17)
        view.delegate = context.coordinator
        return view
    }

    func updateUIView(_ uiView: UITextView, context: Context) {
        uiView.text = text
    }

    func frame(numLines: CGFloat) -> some View {
        let height = UIFont.systemFont(ofSize: 17).lineHeight * numLines
        return self.frame(height: height)
    }

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

    class Coordinator: NSObject, UITextViewDelegate {
        var parent: MultilineTextView

        init(_ parent: MultilineTextView) {
            self.parent = parent
        }

        func textViewDidChange(_ textView: UITextView) {
            parent.text = textView.text
        }
    }
}

然后我在 swiftUI 视图中实现它,如下所示:

MultilineTextView(text: title ? $currentItem.titleEnglish : $currentItem.pairArray[currentPair].english)//.frame(numLines: 4)

并将其绑定到状态变量:

@State var currentItem:Item

这有点管用。但是,状态 var currentItem:Item 包含一个字符串数组,然后我使用按钮循环遍历该数组,这些按钮根据输入到 MultilineTextView 的内容更新字符串数组。这就是我遇到的问题,其中 MultilineTextView 似乎只绑定到数组中的第一个字符串项,然后它就不会改变。当我使用 swiftUI 的本机 TextField 视图时,此功能工作正常,我可以循环遍历字符串数组并通过在 TextField 中输入文本来更新它。

我认为我必须在 MultilineTextView 结构中缺少某些内容才能允许此功能。任何指点都将不胜感激。

Update:添加了模型结构

struct Item: Identifiable, Codable {
    let id = UUID()
    var completed = false
    var pairArray:[TextPair]
}

struct TextPair: Identifiable, Codable {
    let id = UUID()
    var textOne:String
    var textTwo:String
}

Edit:所以我做了更多的挖掘,发现了我认为的问题所在。当 UITextView 的 textViewDidChange 被触发时,它确实发送我可以在控制台中看到的更新文本。奇怪的是, updateUIView 函数也会被触发,并在通过 textViewDidChange 发送更新之前使用绑定变量中的内容更新 UITextView 的文本。结果是,当您在其中键入内容时,UITextview 拒绝更改。奇怪的是,它适用于数组中的第一个字符串,但是当项目更改时,它就不再起作用了。


看来 SwiftUI 创建了两个变体UIViewRepresentable,对于每个绑定,但在状态时不切换它们,即title已切换...可能是由于缺陷,值得提交给 Apple。

我找到了可行的解决方法(使用 Xcode 11.2 / iOS 13.2 进行测试),而是使用明确不同的视图,如下所示

if title {
    MultilineTextView(text: $currentItem.titleEnglish)
} else {
    MultilineTextView(text: $currentItem.pairArray[currentPair].textOne)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI UIViewRepresentable UITextView 绑定 的相关文章

随机推荐

  • java中的DAO模式什么是业务对象

    直接来自this http www oracle com technetwork java dataaccessobject 138824 htmlOracle 关于 J2EE DAO 模式的文章 事实上 除了业务对象 参与者 他们这么称呼
  • 定时器可以提早吗?

    显然 System Threading Timer 回调应该会延迟一点 然而 可以提前调用吗 例如 如果您启动秒表并安排计时器在 1000 毫秒内运行回调 那么秒表是否有可能在回调中显示 999 或者我们可以指望它必须显示 1000 或更多
  • 收到警告“NDK 缺少“平台”目录。”没有 NDK [重复]

    这个问题在这里已经有答案了 我有一个仅使用 Android SDK 而不是 NDK 的项目 但每当我使用 gradle 构建时都会收到有关 NDK 的警告 NDK is missing a platforms directory If yo
  • 为什么说微软堆栈成本高? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 SQLite 上连接表时如何进行更新?

    我试过 UPDATE closure JOIN item ON item id id SET checked 0 WHERE ancestor id 1 And UPDATE closure item SET checked 0 WHERE
  • 穷人的 SQL 枢轴。将每个用户的问题和答案列在一行中

    当前查询 SELECT order id AS OrderNumber ordName ordLastName question answer FROM cart survey JOIN orders ON cart survey orde
  • ASP.NET MVC 2.0 Prev 1 和 SPARK?

    我正在尝试将 ASP NET MVC 1 0 应用程序升级到 2 0 预览版 1 我使用 Spark 作为视图引擎 问题 Spark 使用 System Web MVC 1 0 0 0 因此我获取了源代码并使用 2 0 0 0 重新编译并使
  • 无法解析 ACRA 4.7.0 中的方法“formKey”

    我今天尝试为我的 Android 项目设置 acra 但没有成功 我按照说明操作 在 gradle 中导入了 acra lib 编译 ch acra acra 4 7 0 然后我添加了这个 ReportsCrashes formKey ma
  • 告诉 urllib2 使用自定义 DNS

    我想告诉urllib2 urlopen or a 定制开瓶器 使用127 0 0 1 or 1 来解析地址 我不会改变我的 etc resolv conf 然而 一种可能的解决方案是使用类似的工具dnspython查询地址和httplib构
  • 在 Kotlin 中制作函数块

    我很高兴这可能已经得到解答 但我无法找到适合我的解决方案 Tl dr 如何制作功能块 我有以下用 Kotlin 为 Android API 28 编写的 BLE 相关代码 override fun onServicesDiscovered
  • 如何解决 SceneKit double notsupported 错误?

    过去几天我一直在研究 iOS 版 SceneKit 我在尝试创建自定义几何图形时遇到了一个问题 每当我尝试显示几何图形时 它都不会绘制 并在运行时向我显示此错误 SceneKit 错误 C3DRendererContextSetupResi
  • C# 无法从应用程序成功启动中打开串行端口

    因此 我正在打开这个端口并将端口名称保存在我的应用程序设置中 当我加载表单时 它尝试打开端口 但失败了 仅在单击我的 开放端口 按钮后EXACT端口打开时使用相同的代码 然后 如果我单击 关闭端口 按钮并重新打开表单 它就可以工作了 它会自
  • System.Windows.Forms.HtmlDocument 不包含 GetElementByID 的定义

    您能解释一下为什么我会收到此错误吗 private void startButton Click object sender EventArgs e HtmlElement mainNav webBrowser1 Document GetE
  • Perl 中的列表运算符优先级

    我正在读 Beginning Perl 一书 它给出了以下两条语句 print Test one 6 gt 3 3 gt 4 n print Test two 6 gt 3 and 3 gt 4 n 第一行不打印任何内容并换行 第二行打印
  • 创建向量空间

    我有一个问题 我有很多文档 每一行都是由某种模式构建的 当然 我有这一系列的图案 我想创建一些向量空间 然后通过某种规则来向量这个模式 我还不知道这个规则是什么 即使这个模式像我的向量空间的 质心 然后向量当前文档的每一行 再次按照此规则
  • 如何在 .NET Core 应用程序 Docker 映像中包含依赖项?

    我正在尝试构建 NET Core 应用程序 Docker 映像 但我不知道如何将项目的 NuGet 依赖项获取到图像中 为简单起见 我创建了一个 NET Core 控制台应用程序 using System using Newtonsoft
  • 使用 C# 生成随机数

    我正在考虑生成 1 到 500 万之间的随机数 这个过程不必很快 尽管如果快的话就好了 但它必须尽可能随机 我知道没有什么是随机的 我有多种种子数据源 我不确定是否 NET http en wikipedia org wiki NET Fr
  • 在 Javascript 中将变量名转换为字符串?

    我在 Stack Overflow 上看到过一些关于此问题的其他帖子 但答案似乎总是创建一个带有键 值对的对象 这似乎不是我目前的情况所需要的 我想要做什么 我有不同的数组 其中可能包含用户名 我想检查每个数组 看看用户名是否作为其中的值存
  • 哪些错误适用于不同的 FindBugs 报告级别?

    根据 Ant 任务 报告级别是低 中 高设置 用于查找不同严重程度级别的错误 然而 我找不到任何东西可以解释哪些错误适用于这些不同的报告级别 是否有某个地方可以提供此功能 即使我需要在源代码中查看它 不幸的是 错误类型和优先级之间的关联存在
  • SwiftUI UIViewRepresentable UITextView 绑定

    目前 SwiftUI 本身不支持多行文本输入 希望很快就会添加此功能 所以我一直在尝试使用组合框架来实现 UIKit 中的 UITextView 它支持多行输入 但是我得到的结果好坏参半 这是我创建的用于制作文本视图的代码 struct M