SWIFTUI TextView 具有实时的、以编程方式附加的文本
Posted
技术标签:
【中文标题】SWIFTUI TextView 具有实时的、以编程方式附加的文本【英文标题】:SWIFTUI TextView with real-time, programmatically-appendable text 【发布时间】:2022-01-17 18:37:19 【问题描述】:我正在寻找一种方法来创建一个简单的文本视图(类似命令行),它将向用户展示应用程序内部发生的事情。它应该能够以编程方式实时附加元素,以便用户可以监视和复制其中的文本。我正在为 macOS 编写应用程序。
到目前为止,我这样做了:
class OutputElementStruct: Identifiable
var HEX: String
var Balance: String
init(HEX: String, Balance: String)
self.HEX = HEX
self.Balance = Balance
class OutputElements: ObservableObject
@Published var OutputElement = [OutputElementStruct]()
init()
self.OutputElement =
[
OutputElementStruct(HEX: "sometext", Balance: "sometext")
]
然后显示给用户
struct OutputView: View
@StateObject var OutputArray = OutputElements()
var body: some View
GeometryReader
Geo in
ZStack
BoxView(width: 600, height: 700, Name: "")
VStack
List
ForEach($OutputArray.OutputElement)
item in
Text(verbatim: item.HEX.wrappedValue)
.frame(width: 600, height: 700, alignment: .center)
这是添加的数据。
@StateObject var OutputArray = OutputElements()
.onTapGesture
print("button tapped")
OutputArray.OutputElement.append(OutputElementStruct(HEX: "sometext", Balance: "sometext"))
它正在工作,但不是实时的。当我点击按钮时,它会在 Xcode 中打印“点击按钮”,但文本视图除了在init()
中首先添加的项目外不显示任何内容。那么如何让它发挥作用呢?
【问题讨论】:
因为它是 onAppear ,你需要做的就是让它工作,之后用 DispatchQueue 异步延迟它。另外,通过反馈助手提交错误 这可能是一个错误吗?我正在使用 Xcode 版本 13.0 beta 3 (13A5192j) 是的,它似乎在 ios 15 中更频繁地发生。你不得不延迟一些 onAppear 似乎并不自然。我最常看到它更新文本字段并弹出跟踪透明度,还有其他实例,但这些似乎是最常见的。 iOS 15 的透明度问题绝对是许多人在发布后立即因 SO 帖子被拒绝,因为他们的弹出窗口突然没有显示。 等等,没有找到我需要添加延迟的地方?因为它是 swiftui Xcode 告诉我类型 '()' 没有确认到 'View',所以我已将代码更新为现在的整页。 Caleb 在下面发布了正确答案。您有两个对象实例 【参考方案1】:当我点击按钮时,它会在 Xcode 中打印“点击按钮”,但文本视图除了首先在 init() 中添加的项目外不显示任何内容。那么如何让它发挥作用呢?
看起来您有两个单独的数组,它们都命名为OutputArray
,而您要附加对象的数组不是您的视图正在显示的数组。这就是为什么您没有看到任何新对象出现的原因,即使您知道自己正在添加它们。
您需要在两个地方都使用的单个数组。我认为您使用@StateObject
的想法是正确的,但不是创建两个 @StateObject
变量,而是创建一个并将其添加到环境中,如StateObject
documentation 中所述。
【讨论】:
以上是关于SWIFTUI TextView 具有实时的、以编程方式附加的文本的主要内容,如果未能解决你的问题,请参考以下文章
Swiftui如何根据textview内容管理Scrollview Height
如何添加 onCommit、isEditing 以及自定义绑定到自定义 textview 的能力?