首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

UITextView的SwiftUI包装器未更新ObservedObject

UITextView是UIKit框架中的一个类,用于显示和编辑多行文本内容。SwiftUI是苹果公司推出的一种声明式的用户界面框架,用于构建iOS、macOS、watchOS和tvOS应用程序。

在SwiftUI中,没有直接提供UITextView的包装器。但是,我们可以使用UIViewRepresentable协议来创建一个自定义的UITextView包装器,以便在SwiftUI中使用。

下面是一个示例代码,展示了如何创建一个UITextView的SwiftUI包装器:

代码语言:txt
复制
import SwiftUI

struct TextViewWrapper: UIViewRepresentable {
    @Binding var text: String

    func makeUIView(context: Context) -> UITextView {
        let textView = UITextView()
        textView.delegate = context.coordinator
        return textView
    }

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

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

    class Coordinator: NSObject, UITextViewDelegate {
        let parent: TextViewWrapper

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

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

在上述代码中,我们创建了一个名为TextViewWrapper的结构体,遵循UIViewRepresentable协议。该结构体包含一个名为text的绑定属性,用于在SwiftUI中与UITextView的文本内容进行双向绑定。

在makeUIView方法中,我们创建了一个UITextView实例,并将其委托设置为context.coordinator。在updateUIView方法中,我们将text属性的值设置为UITextView的文本内容。

此外,我们还创建了一个名为Coordinator的内部类,用于处理UITextView的文本内容变化事件。在textViewDidChange方法中,我们更新父视图的text属性,以便在SwiftUI中反映出变化。

要在SwiftUI中使用TextViewWrapper,可以像使用其他视图一样将其添加到视图层次结构中。例如:

代码语言:txt
复制
struct ContentView: View {
    @State private var text = ""

    var body: some View {
        VStack {
            TextViewWrapper(text: $text)
                .frame(height: 200)
                .border(Color.gray)
            
            Text("输入的文本内容:\(text)")
        }
        .padding()
    }
}

在上述代码中,我们创建了一个名为ContentView的视图,其中包含一个TextViewWrapper实例和一个用于显示输入文本内容的Text视图。通过将text属性绑定到TextViewWrapper的text属性,我们可以实现文本内容的双向绑定。

这是一个简单的示例,展示了如何使用SwiftUI创建一个UITextView的包装器。根据具体的需求,你可以进一步定制和扩展这个包装器,以满足你的应用程序的需求。

腾讯云提供了一系列的云计算产品,可以用于构建和扩展应用程序。具体推荐的产品和产品介绍链接地址可以根据具体的需求和场景来确定。你可以访问腾讯云的官方网站(https://cloud.tencent.com/)了解更多关于腾讯云的产品和服务信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

探讨 SwiftUI几个关键属性包装

在这篇文章中,我们将探讨几个在 SwiftUI 开发中经常使用且至关重要属性包装。本文旨在提供对这些属性包装主要功能和使用注意事项概述,而非详尽使用指南。...本文应几位朋友之邀而写,旨在帮助已经熟悉通用编程但对 SwiftUI 相对陌生开发者,快速理解这些属性包装核心作用和适用场景。...@State @State 是 SwiftUI 中最常用属性包装之一,主要用于在视图内部管理私有数据。它特别适合存储值类型数据,如字符串、整数、枚举或结构体实例。...注意事项 尽量仅在视图内部使用 @State,即使显式标记为 private,也应当将其视为视图私有属性。 @State 为包装数据同时提供了双向数据绑定管道,可以通过 $ 前缀来访问。...@ObservedObjectSwiftUI 中用于为视图与 ObservableObject 实例之间创建关联属性包装,主要用于在视图存续期内引入外部 ObservableObject

16910

@State 研究

@State如何工作 在分析@State如何工作之前,我们需要先了解几个知识点 属性包装 作为swift 5.1新增功能之一,属性包装在管理属性如何存储和定义属性代码之间添加了一个分割层。...我们可以用另一段代码来分析编译ObservedObject 反应。...因此ObservedObject很可能是在初始化MainView时候建立依赖关系。 之所以花气力来判断这个问题,因为这两种创建依赖时机不同会导致View更新效率巨大差异。...打造适合自己增强型 @State @State使用属性包装这个特性来实现了它既定功能,不过属性包装还被广泛用于数据验证、副作用等众多领域,我们能否将众多功能属性集于一身?...= "肘子" 因此我们可以通过将State作为包装值类型,创建新属性包装,来实现我们最终目标 —— 完整功能、可任意扩展增强型@State。

2.9K20

避免 SwiftUI 视图重复计算

原文发表于我博客 肘子 Swift 记事本 视图状态构成 可以驱动视图进行更新源被称之为 Source of Truth,它类型有: 使用 @State、@StateObject 这类属性包装声明变量...符合 DynamicProperty 协议属性包装 几乎每一个 SwiftUI 使用者,在学习 SwiftUI 第一天就会接触到例如 @State、@Binding 这些会引发视图更新属性包装...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应视图。 SwiftUI 上有一个困扰了不少人问题:为什么无法在视图构造函数中,更改 State 包装变量值?...对于像 @StateObject 这类针对引用类型属性包装SwiftUI 会在属性图中将视图与包装对象实例( 符合 ObservableObject 协议 ) objectWillChange(...与符合 DynamicProperty 协议属性包装主动驱动视图更新机制不同,SwiftUI更新视图时,会通过检查子视图实例是否发生变化( 绝大多数都由构造参数值变化导致 )来决定对子视图更新与否

9.2K81

SwiftUI 状态管理系统指南

SwiftUI没有使用委托、数据源或任何其他在UIKit和AppKit等命令式框架中常见状态管理模式,而是配备了一些属性包装[1],使我们能够准确地声明我们数据如何被我们视图观察、渲染和改变。...本周,让我们仔细看看这些属性包装每一个,它们之间关系,以及它们如何构成SwiftUI整体状态管理系统不同部分。...其中一个机制是ObservableObject协议,当它与ObservedObject属性包装结合时,我们可以设置与我们视图层之外管理引用类型绑定。...有了上面的类型,现在让我们回到ProfileView,让它观察新UserModelController实例,作为一个ObservedObject,而不是用一个State属性包装来跟踪我们用户模型...最重要是,我们仍然可以很容易地将这个模型绑定到我们ProfileEditingView上,就像以前一样,因为ObservedObject属性包装也可以转换为绑定: struct ProfileView

5K20

SwiftUI @State @Published @ObservedObject 深入理解和使用

1.SwiftUI 是Apple 新出面向未来、跨多端解决方案、声明式编程 SwiftUI最新版本 2.0 但是需要 IOS 14 支持,多数现在还用是IOS 13 所以很多不完善东西都用SwiftUIX...@Published + @ObservedObject 介绍 @Published是SwiftUI最有用包装之一,允许我们创建出能够被自动观察对象属性,SwiftUI会自动监视这个属性,一旦发生了改变...因为SwiftUI更新数据前提是触发 第一层 绑定对象 wrapperModel下属性(字段)发生更新才会调用视图层更新数据 但是 第一次下绑定对象还绑定了 @ObservedObject 或者其他类型对象呢...{ /// /// 注意 /// 接收 子类model 时候要用 @ObservedObject 不能用 @Published /// 因为SwiftUI 更新机制是当前对象有...() { _lastUpdateTime = Date() } } /// 那当我们 包装类下对象更新时候 /// 可以直接 调用包装类 notifyUpdate() 方法更新当前对象属性

2.9K10

肘子 Swift 周报 #017 | 新博客数据盘点

原创 探讨 SwiftUI属性包装:@AppStorage、@SceneStorage、@FocusState、@GestureState 和 @ScaledMetric[2] Fatbobman...这些属性包装涵盖了数据持久化、交互响应、辅助功能、多窗口支持等多个方面, 为开发者提供了简洁实用解决方案。 这篇文章是关于探索 SwiftUI 属性包装系列第二部分。...第一部分为 探讨 SwiftUI关键属性包装:@State、@Binding、@StateObject、@ObservedObject、@EnvironmentObject 和 @Environment...整个系列包括四篇文章,旨在全面梳理 SwiftUI 中所有属性包装功能。...参考资料 [1] fatbobman.substack.com: https://fatbobman.substack.com [2] 探讨 SwiftUI属性包装:@AppStorage、

9310

SwiftUI:使用 @EnvironmentObject 从环境中读取自定义值

如果我们使用@ObservedObject,则需要将我们对象从每个视图传递到下一个视图,直到它最终到达可以使用该视图视图E,这很烦人,因为B,C和D不在乎它。...Apple已将此工作表情况描述为他们想要修复错误,因此我希望在以后对SwiftUI更新中会有所改变。...在向您展示一些代码之前,还有最后一件事:环境对象使用您已经学过ObservableObject协议,SwiftUI将自动确保共享同一环境对象所有视图在更改时都会更新。...这些将使用@EnvironmentObject属性包装来表示此数据值来自环境,而不是在本地创建: struct EditView: View { @EnvironmentObject var...EnvironmentObject var user: User var body: some View { Text(user.name) } } 该@EnvironmentObject属性包装将自动在环境中查找

9.5K20

TCA - SwiftUI 救星?(一)

虽然 SwiftUI 中提供了诸多状态管理关键字或属性包装 (property wrapper),比如 @State、@ObservedObject 等,但是你很难说官方 SwiftUI 教程里关于数据传递...我们类比一下这些步骤在 SwiftUI实现,可以发现步骤 4 其实已经包含在 SwiftUI 中了:当 @State 或 @ObservedObject @Published 发生变化时,SwiftUI...在 SwiftUI 中,TCA 使用 ViewStore (它本身是一个 ObservableObject) 来通过 @ObservedObject 触发 UI 刷新。...如果让 View 直接观察整个 Store,在其中某个状态发生变化时,SwiftUI 将会要求所有对 Store 进行观察 UI 更新,这会造成所有的 view 都对 body 进行重新求值,是非常大浪费...在 SwiftUI 中,body 刷新是 SwiftUI 运行时通过 @ObservedObject 属性包装所提供特性。现在这部分内容被包含在了 WithViewStore 中。

3.2K30

SwiftUI-数据流

,当数据源发生变化时会自动更新与该数据有依赖关系视图。...5.1 新特性 Property Wrapper来实现一种属性装饰语法糖(修饰/装饰) Property 这种形式最简单,就是在 View中定义常量或者变量,然后在内部使用 import SwiftUI...系统提供 Control(可操作View) 构造基本都需要 @Binding 属性,可以自动同步来自 API 调用方数据。...UI刷新,所以很适合值类型,因为对值类型里面属性更新,也会触发整个值类型重新设置。...数据流图 从上图可以看出SwiftUI 数据流转过程: 用户对界面进行操作,产生一个操作行为 action 该行为触发数据状态改变 数据状态变化会触发视图重绘 SwiftUI 内部按需更新视图,

10K20

SwiftUI数据流之State&Binding

SwiftUI中,以单一数据源(single source of truth)为核心,构建了数据驱动状态更新机制。...其中引入了多种新属性包装(property wrapper),用来进行状态管理。...@Binding 修饰属性无需有初始化值,Binding可以配合@State或ObservableObject对象中值属性一起使用,注意不是@ObservedObject属性包装 struct Product...,anotherFlag是没有使用属性包装普通变量,同时增加了一个mutating方法changeAnotherFlag被设计修改anotherFlag; 在body中通过几种方式对两个变量进行修改...user变量,类型是State,这个变量内部属性_value类型是User;这意味着,加了@State属性包装user实例变量,由本身User类型转变为一个新State类型

3.9K30

Ask Apple 2022 与 SwiftUI 有关问答(上)

访问我博客 www.fatbobman.com[1] 可以获得更好阅读体验以及最新更新内容。...如果你不想让父视图也被更新,可以在创建对象时不使用 @StateObject 或 @ObservedObject 。...官方文档主要试图指出人们最常见用法,这样他们就不会一开始就试图直接初始化他们属性包装。顺便提一下,试图通过底层存储来初始化 @State 是我们在过去警告过事情。...属性包装( property wrapper )类型在编译时候,首先会对用户自定义属性包装类型代码进行转译。...这就涉及到了所有符合 DynamicProperty 协议属性包装一个特点:在视图生存期内仅有第一次初始化实例会与视图创建关联。详细请阅读 避免 SwiftUI 视图重复计算[22] 。

12.2K20
领券