如何在 SwiftUI 文本元素中创建可变字符串?
Posted
技术标签:
【中文标题】如何在 SwiftUI 文本元素中创建可变字符串?【英文标题】:How can i create mutable Strings in SwiftUI Text elements? 【发布时间】:2020-01-12 16:05:46 【问题描述】:我想在 SwiftUI 中显示一个具有可变字符串内容的文本(视图)。
@State var myvar : String = "Undefined"
var body: some view
Text("Content: \(myvar)")
func abc()
self.myvar = "Defined"
每当我调用 abc() 函数时,myvar 的值都不会更新。我已经使用 abc() 中的 debugPrint(self.myvar) 检查了这一点。
这段代码在我的 ContentView.swift 中,而我在委托回调方法中从 HostingController.swift 调用 contentView.abc()。
是否有一种解决方案可以为 SwiftUI 中的这种“外部”使用创建可变/可变字符串?
编辑:
来自 HostingController:
override var body: ContentView
let contentView = ContentView().environmentObject(contentModel)
...
return contentView
最后一行给出错误“无法将某些视图类型的返回表达式转换为返回类型内容视图”。 需要注意的是,我在 WatchKit 环境中工作,所以这是一个 Apple Watch 应用程序。
【问题讨论】:
它应该可以工作,而且确实可以。你能说明你是怎么称呼abc()
的吗? (我觉得原因就在其中)
@Asperi 感谢您的回复!这段代码在我的 ContentView.swift 中,而我在委托回调方法中从 HostingController.swift 调用 contentView.abc()。
就是这样 - 您只能在 View 本身内更改 @State
。
那我该怎么做呢,@Asperi?我想从 HostingController 更改它,因为该类包含调用 abc() 的逻辑。有什么想法吗?
是的,看答案。
【参考方案1】:
可以通过environmentObject
进行
创建视图模型类来保存myvar
状态
class ViewModel: ObservableObject
@Published var myvar: String = "Undefined"
将其声明为 SceneDelegate 的成员
let contentModel = ViewModel()
在添加到主机控制器之前将其传递给内容视图
let contentView = ContentView().environmentObject(contentModel)
其他场景委托(或其他通过引用传递的地方)的变化
self.contentModel.myvar = "Defined"
在内容视图中使用
struct ContentView: View
@EnvironmentObject var viewModel: ViewModel
var body: some view
Text("Content: \(viewModel.myvar)")
...
【讨论】:
感谢您的详细解释!这显然是要走的路。我仍然有一个问题:在“contentView = contentView.environmentObject(contentModel)”之后,我收到一个错误“无法将某些视图类型的值分配给 ContentView 类型” 你在哪里声明ContentView
类型?不应为 contentView 变量显式声明它。
我用 ContentView 的声明编辑了我的初始问题。如您所见,我正在使用 WatchKit,所以我需要返回一个 ContentView 对象。通过 return contentView as 进行强制类型转换! ContentView 不起作用,因为它给了我以下错误:无法将类型 'SwiftUI.ModifiedContentAnyView
中,比如WKHostingController<AnyView>
、var body: AnyView
和return AnyView(contentView)
非常感谢您花时间帮助我。非常感谢,这解决了我所有的问题!祝您度过愉快的一周。以上是关于如何在 SwiftUI 文本元素中创建可变字符串?的主要内容,如果未能解决你的问题,请参考以下文章