如何在 SwiftUI 中初始化 View Again?

2024-02-29

我在我的项目中使用 SwfitUI,并且有一个 NavigationView 和 List。我在打开详细视图后单击单元格,然后单击导航后退按钮。我想在单击导航后退按钮后删除视图(它是 SwiftUI 中的结构)。因为如果我再次单击相同的单元格或按钮,它不会初始化新视图,而是显示旧视图。我想刷新这个视图。我该怎么做?

我的 FirstView 结构是:

struct FirstView: View {

    @ObservedObject var viewModel: FirstViewModel

    var body: some View {
        List(self.viewModel.objects, id: \.id) { object in
            ZStack {
                DetailViewCell(object: object)
                NavigationLink(destination: DetailViewBuilder.make(object)) {
                    EmptyView()
                }.buttonStyle(PlainButtonStyle())
            }
        }
    }
}

我的 DetailView 结构是:

struct DetailView: View {

    @ObservedObject var viewModel: DetailViewModel

    var body: some View {
        ZStack(alignment: .top) {
            Color.mainBackground.edgesIgnoringSafeArea(.all)
            VStack {
                ZStack {
                    Image("Square")
                    Image(self.viewModel.currentImage)
                }
                Text(self.viewModel.currentText)
                    .padding()
                    .frame(alignment: .center)
                    .minimumScaleFactor(0.1)
                Spacer()
                Button(action: {
                    self.viewModel.pressedPlayOrPauseButton()
                }, label: {
                    Image(self.viewModel.isPlaying ? "Pause" : "Play").foregroundColor(Color("Orange"))
                }).padding()
            }
        }
    }
}

首先,我通过单击 FirstView 中的一个单元格来查看详细信息。然后我用后退按钮回来。我再次单击单元格以转到详细信息,但没有打开新视图。它显示了旧的视图。

在我忘记之前,我的构建器类是:

final class DetailViewBuilder {
    static func make(object: Something) -> DetailView {

        let viewModel = DetailViewModel(object: object)
        let view = DetailView(viewModel: viewModel)

        return view
    }
}

注意:如果我使用提供的表格,它就可以工作。它正在创建新视图。但我想使用 NavigationLink。谢谢。


您只需要在构建器中推迟目的地创建,然后@ViewBuilder是一个很好的工具。

可以使用以下包装器仅在以下情况下创建真正的目的地:body将被渲染(即在您的情况下在导航时明确单击)

使用 Xcode 11.4 / iOS 13.4 进行测试

struct DeferView<Content: View>: View {
    let content: () -> Content

    init(@ViewBuilder _ content: @escaping () -> Content) {
        self.content = content
    }
    var body: some View {
        content()          // << everything is created here
    }
}

现在你的建造者

final class DetailViewBuilder {
    static func make(object: Something) -> some View {
        DeferView {
           DetailView(viewModel: DetailViewModel(object: object))
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 SwiftUI 中初始化 View Again? 的相关文章

  • 如何在 Windows 7 中模拟内存不足的情况

    我有一个用 C 编写的应用程序 运行良好 但有时在现场会出现错误 我们认为这些错误是由于内存不足或与垃圾收集器的交互造成的 如果有人感兴趣 这里有描述 无法将 NHibernate Impl ExpandedQueryExpression
  • 保存 ScrollViews 位置并稍后滚动回该位置(偏移位置)

    我找到了保存 ScrollViews 的方法offset with a GeometryReader and a PreferenceKey SwiftUI 从 ScrollView 获取当前滚动位置 https stackoverflow
  • Python:如何使用 struct.pack_into 将不同类型的数据打包到字符串缓冲区中

    我正在尝试将一些无符号 int 数据打包到使用创建的字符串缓冲区中ctypes create string buffer 这是以下代码段 以及显示错误的运行示例在键盘上 http codepad org S8nUWMcW import st
  • 如何在 TextField (SwiftUI) 上添加底线

    I use Rectangle 在 TextField SwiftUI 上添加底部边框 但我想用protocol TextFieldStyle对于 TextField 样式的底线 如 RoundedBorderTextFieldStyle
  • 在 C 中使用另一个结构中的二维结构数组的编码问题

    我正在使用一个二维结构数组 它是另一个结构的一部分 这不是我做过很多事的事情 所以我遇到了问题 该函数在接近末尾的 测试 for 循环后最终失败 它在出现段错误之前正确打印出一行 我的代码中将数据读入虚拟二维结构数组的部分工作得很好 所以它
  • 演员邮箱溢出。斯卡拉

    我目前正在与 scala 的两位演员合作 一 producer 产生一些数据并将其发送到parcer 生产者发送一个HashMap String HashMap Object List Int 通过消息 以及this标记发件人 parcer
  • SwiftUI - 获取孩子的大小?

    有什么方法可以获取 SwiftUI 中子视图的大小吗 我基本上希望做 UIKit 相当于 self child frame origin x self child intrinsicContentSize width 2 0 我认为 Geo
  • 将结构体成员声明为 uint32_t 时的额外字节

    我在使用 stdint h 库中的 uint32 t 类型时遇到问题 如果我运行以下代码 在 Ubuntu linux 11 10 x86 64 g 版本 4 6 1 上 include stdint h include
  • 在 Swift 2.0 中隐藏 Home 指示器

    我希望隐藏 Home Indicator 虽然这在 Swift 中很简单 但在 SwiftUI 中似乎并不那么容易 我尝试使用这个 如何使用 SwiftUI 隐藏 home 指示器 https stackoverflow com quest
  • c++ 12位变量,我该怎么做?

    我正在构建一个体素引擎 所以我担心内存使用情况 使用 12 位而不是 16 位块 ID 可以节省大量内存 我有一个 3D 块 id 数组 每个 id 都有一个静态配置 我不确定实现这一目标的好方法是什么 有没有一种方法可以获取一块原始内存并
  • 如何在 Swiftui 中使列表项行内的按钮不可点击?

    有没有办法让列表的整行都不可点击 我正在尝试使按钮行上只有按钮可单击 正如您所看到的 如果我尝试单击按钮行中的任何位置 无论是按钮本身 还是按钮周围的空白区域 它都会将其视为点击 有没有办法让您只能单击按钮本身 而不能单击按钮周围的白色间距
  • SwiftUI 转义闭包捕获变异的“self”参数

    我有一个可以通过两种方式打开的视图 一个包含提供给它的数据 另一个包含对 Firestore 文档的文档引用 我创建了两个构造函数 在第一个构造函数中我提供数据 在另一个构造函数中我提供文档参考 然后我使用此引用进行网络调用 但出现错误 E
  • GLSL 中的二阶函数?

    我正在寻找一种方法来使用一个函数作为 GLSL 中另一个函数的参数 在常规 C 中 可以通过传递函数指针作为函数参数来模拟它 似乎其他语言 如 HLSL 现在提供了处理高级构造 如高阶函数 的方法 或者可以使用以下命令来模拟它们巧妙利用 H
  • SwiftUI 未知属性“可观察对象”

    所以我收到错误未知属性ObservableObject旁边的 ObservableObject var dataSource DataSource 下面打电话 这ObservableObject几天前在另一个项目中工作得很好 但现在不行了
  • 在 SwiftUI 中,如何执行手势但将手势转发到其后面的视图?

    我正在创建一个工具提示系统 如果用户触摸工具提示之外的任何地方 我想关闭工具提示 我希望这样在工具提示之外的触摸既可以消除工具提示 又可以激活用户点击的任何控件 因此 您可以打开一个工具提示 然后仍然单击工具提示外部的按钮 并在第一次点击时
  • SwiftUI - 从 NSObject 继承的 ObservableObject 在 iOS 13 中不会更新

    我知道 这是 无法在 iOS XX 中工作 问题之一 但我完全陷入困境 所以我有一个ObservableObject继承自的类NSObject 因为我需要听委托方法UISearchResultsUpdating class SearchBa
  • C++中delete和delete[]的区别[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的删除与删除 运算符 https stackoverflow com questions 2425728 delete vs delete operators in c 我写了一个包含两个指针的
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • HStack 中的 SwiftUI EditButton 未激活编辑模式

    作为更大表单的一部分 我希望有一个带有列表的部分 其条目可以重新排序 在整个视图中 应该只能编辑该特定列表 而不能编辑其他内容 因此我希望将编辑按钮放在列表附近 如果我只是将 EditButton 设置为节标题 则可以对列表项重新排序 但无
  • C++中const对象位于哪个内存区域? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐