如何在 SwiftUI 中关闭工作表时刷新视图

Posted

技术标签:

【中文标题】如何在 SwiftUI 中关闭工作表时刷新视图【英文标题】:How to refresh a view on dismiss of a sheet in SwiftUI 【发布时间】:2019-09-05 15:38:49 【问题描述】:

我想从一个视图获取用户输入(使用TextField)并在另一个视图中显示它(用户输入的文本)。

这是一个最小的、可重现的例子

我创建了一个名为 UserDataObservableObject

import Foundation
import  SwiftUI
import Combine

class UserData: ObservableObject 
    @Published var name: String = ""

然后我用TextField 创建了一个名为Edit 的视图,用户可以在其中输入文本

import SwiftUI

struct Edit: View 

    @ObservedObject var userData = UserData()

    var body: some View 
        VStack 
            TextField("Enter Name", text: $userData.name)
        
    

这里是ContentView,我想在其中显示用户输入的文本的根视图(最初,文本是空的)。

import SwiftUI

struct ContentView: View 

    @State var isPresented = false
    @ObservedObject var userData = UserData()

    var body: some View 
        VStack 
            Text(self.userData.name)
                .font(.largeTitle)

            Button(action:  self.isPresented.toggle() ) 
                    Text("Click me to Edit")
            
            .sheet(isPresented: $isPresented) 
                Edit()
            
        
    

当我们单击ContentView 中的按钮时,会显示一个带有Edit 视图的工作表

当我点击那个按钮时,一个带有Edit 视图的工作表就会出现✅。 然后我可以使用TextField ✅ 输入文本。 但是当我通过向下拖动关闭工作表时,ContentView 中的Text 仍然是空的????。 据我所知,每当我在 TextField 中输入内容时,$userData.name 就会更新。 但是另一个视图中的Text 绑定self.userData.name 不会反映更新的值????。 当我们关闭工作表时,有什么方法可以更新Text,还是有其他方法可以做到这一点? 请帮帮我。 感谢您阅读我的问题????

【问题讨论】:

三件事。 (1) 乍一看,您的代码看起来不错——前提是您使用的是@State,而不是@ObservableObject。但是 (2) 为什么你使用@EnvironmentObject?我有这方面的工作代码。最后,(3)我现在有 6 票赞成我对您的 name 变量的未接受答案:***.com/questions/57511826/… 这可能对您有帮助吗? 【参考方案1】:

您的Edit 视图和ContentView 分别持有单独的UserData 对象。它们不共享对单个对象的引用,因此编辑其中一个不会更新另一个。

首先更新您的Edit 视图,使其初始化自己的UserData 对象:

@ObservedObject var userData: UserData

然后,在您的 ContentView 中,将 reference 传递给您的单个规范 UserData 对象到 Edit 视图中:

.sheet(isPresented: $isPresented) 
    Edit(userData: self.userData)

【讨论】:

以上是关于如何在 SwiftUI 中关闭工作表时刷新视图的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:在 macOS NavigationView 中关闭视图

SwiftUI:关闭第一个工作表时如何显示第二个工作表

使用 SwiftUI 时尝试在视图中显示工作表时应用程序崩溃

SwiftUI:.sheet() 在关闭当前工作表时不会使用预期数据转到上一个视图

在 SwiftUI 中关闭按钮突出显示

SwiftUI 2 - 如何防止顶部部分在 macOS 和 iPadOS 的列表中关闭