如何在 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.ModifiedContent>>' (0x28a18f8) 的值转换为 'test_watchapp_WatchKit_Extension。内容视图'(0x672b0)。这对我来说就像一个 tupel,我可以只访问第一个项目吗? 我明白了。需要包裹到AnyView中,比如WKHostingController<AnyView>var body: AnyViewreturn AnyView(contentView) 非常感谢您花时间帮助我。非常感谢,这解决了我所有的问题!祝您度过愉快的一周。

以上是关于如何在 SwiftUI 文本元素中创建可变字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中创建字符串的大写版本?

如何在 swiftUI 中创建具有多列的列表?

从文本字段输入在现有表中创建新行。 SwiftUI(故事板)

如何在android中创建可变数量的textviews

如何在 SwiftUI 中创建指数

在连续的内存块中创建具有可变元素的链表