.sheet:仅显示一次,然后不再显示

2023-12-02

使用Beta4,似乎该错误仍然存​​在。以下视图序列(列表,其中点击列表条目可打开另一个列表)允许呈现ListView正好一次;这onDisappear从未被调用过,所以showModal标志发生变化,但不会触发重新显示ListView再次点击时。所以,对于每个GridCellBodyEntry, the .sheet演示文稿只工作一次,然后就不再工作。

我尝试了几种建议和解决方法,但没有一个有效(例如,用 NavigationViewModel 封装)。我什至尝试删除该列表,因为有一个假设List导致这种行为,但即使这样也没有改变任何东西。

周围有什么想法吗?

设置:

  1. A GridCellBody有了这个观点:
var body: some View {

        GeometryReader { geometry in

            VStack {

                List {

                    Section(footer: self.footerView) {

                        ForEach(self.rawEntries) { rawEntry in

                            GridCellBodyEntry(entityType: rawEntry)
                        }
                    }
                }
                .background(Color.white)
            }
        }
    }
  1. A GridCellBodyEntry有了这个定义:
struct GridCellBodyEntry: View {


    let entityType: EntityType
    let viewModel: BaseViewModel


    init(entityType: EntityType) {

        self.entityType = entityType
        self.viewModel = BaseViewModel(entityType: self.entityType)
    }


    @State var showModal = false {

        didSet {

            print("showModal: \(showModal)")
        }
    }


    var body: some View {

        Group {

            Button(action: {

                self.showModal.toggle()
            },
                   label: {

                    Text(entityType.localizedPlural ?? "")
                        .foregroundColor(Color.black)
            })
            .sheet(isPresented: $showModal, content: {

                ListView(showModal: self.$showModal,
                         viewModel: self.viewModel)
            })
        }.onAppear{
            print("Profile appeared")
        }.onDisappear{
            print("Profile disappeared")
        }
    }
}
  1. A ListView有了这个定义:
struct ListView: View {


    // MARK: - Private properties


    // MARK: - Public interface


    @Binding var showModal: Bool
    @ObjectBinding var viewModel: BaseViewModel


    // MARK: - Main view


    var body: some View {

        NavigationView {

            VStack {

                List {

                    Section(footer: Text("\(viewModel.list.count) entries")) {

                        ForEach(viewModel.list, id: \.objectID) { item in

                            NavigationLink(destination: ItemView(),
                                           label: {

                                            Text("\(item.objectID)")
                            })
                        }
                    }
                }
            }
            .navigationBarItems(leading:

                Button(action: {

                    self.showModal = false
                }, label: {

                    Text("Close")
                }))

            .navigationBarTitle(Text(viewModel.entityType.localizedPlural ?? ""))
        }
    }
}
  1. The BaseViewModel(摘抄):
class BaseViewModel: BindableObject {

    /// The binding support. 
    var willChange = PassthroughSubject<Void, Never>()

    /// The context.
    var context: NSManagedObjectContext

    /// The current list of typed items.
    var list: [NSManagedObject] = []

    // ... other stuff ...
}

where willChange.send()每当发生更改(创建、修改、删除操作)时调用。


这是一个变体swiftUI PresentaionLink 第二次不起作用

以下简化代码展示了您遇到的行为(该工作表仅显示一次):

import SwiftUI

struct ContentView: View {
    @State var isPresented = false
    @State var whichPresented = -1

    var body: some View {
        NavigationView {
            List {
                ForEach(0 ..< 10) { i in
                    Button(action: {
                            self.whichPresented = i
                            self.isPresented.toggle()
                        })
                        { Text("Button \(i)") }
                    }.sheet(isPresented: $isPresented, content: { 
Text("Destination View \(self.whichPresented)") })
                }
            }
    }
}

当您将.sheet在 List 或 ForEach 中。如果您移动.sheet在列表之外,您应该能够获得正确的行为。

import SwiftUI

struct ContentView: View {
    @State var isPresented = false
    @State var whichPresented = -1

    var body: some View {
        NavigationView {
            List {
                ForEach(0 ..< 10) { i in
                    Button(action: {
                            self.whichPresented = i
                            self.isPresented.toggle()
                        })
                        { Text("Button \(i)") }
                    }
                }
            }.sheet(isPresented: $isPresented, content: { Text("Destination View \(self.whichPresented)") })
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.sheet:仅显示一次,然后不再显示 的相关文章

随机推荐

  • 更改通过 JsonExtensionData 加载的数据的键名称[重复]

    这个问题在这里已经有答案了 我有一个由系统数据和用户条目混合而成的 JSON 如下所示 Properties Type A Name aaa lorem ipsum 7 1 Type B Name bbb sit amet XYZ Type
  • 根据文件扩展名验证文件

    我从 Java 队列中获取文件 它们可能具有以下格式 docx pdf doc xls xlsx txt rtf 阅读它们的扩展名后 我想验证它们是否确实是这些类型的文件 例如 我收到一个文件并检查其扩展名是否为 xls 之后 我想检查它是
  • 在打印机兼容的设备上下文中调用 Windows SelectObject 返回 NULL

    最近的 Windows 10 更新 可能也是神秘的 KB4577586 似乎已经产生了引起调用的效果选择对象使用位图句柄作为参数 在打印机兼容的设备上下文中执行时返回 NULL 相关行可以在这个中看到位图打印示例 它在早期的 Windows
  • 从字节码解析类名

    是否可以从类源代码形成的字节码中挖掘类名称 情况是这样的 我从某个地方远程获取类字节码 它来自哪里并不重要 为了使用类加载器有效地加载该类 我还需要类名 对吗 如果您只需要类名 那么您自己解析类文件的开头可能会更容易 而不是为此目的添加用于
  • R 语言:使用 ff 包计算“group by”或拆分时出现问题

    我对 R 几乎是新手 很抱歉如果我提出一些基本问题 但我找不到这个 简单 问题的解决方案 我有一个患者数据库 大数据库 2500 万行 14 列 每个 id 有几行 例如以下结构 id birth date treatment date t
  • processing.js 加载外部文件

    我想将我的processing js 代码分割成几个文件 但我不知道如何分割 我尝试做
  • Flow Router 不适用于 ObjectID。有什么解决办法吗?

    我正在尝试在我的 Meteor 应用程序中构建路线 路由工作得很好 但使用路由路径从数据库获取信息却不起作用 我用这个创建我的页面特定路线 FlowRouter route level id 这条路线将我毫无问题地带到相关模板 然后我想从数
  • 位图区域已被锁定,多线程环境

    我正在使用一个通过多个线程调用主函数的 API 我试图通过该函数访问另一个类中的位图并从中写入 但即使将其设置为使用完全不同的对象实例后 我也遇到了 InvalidOperationException 位图区域已被锁定 我尝试在主函数和调用
  • 相当于 Office-js Excel 加载项中的 Application.ScreenUpdating 属性

    我正在将大量数据插入工作表中 这样做时屏幕会闪烁 在 VBA 和 com 加载项中 我可以设置一个属性来延迟更新 直到更新完成 Office js excel 加载项中是否有与 Application ScreenUpdating 属性等效
  • 如何在flutter中获得像facebook一样的微光效果?

    我正在尝试创建一个视频流应用程序并想要像 facebook 那样的微光效果 有什么建议如何获得它吗 微光 1 0 1 开启https pub dev packages shimmer 一个包提供了在Flutter项目中添加微光效果的简单方法
  • didSelectViewController 在某些情况下不会被调用

    我遇到了很多人已经报告过的问题 didSelectViewController不会被调用 但就我而言 有时会被调用 我有三个选项卡和三个视图控制器 每次用户按下第二个或第三个选项卡时 我都需要执行一些代码 在我的 SecondViewCon
  • 在android中使用webview将CSS注入到网站

    例如我想改变背景颜色www google comto red 我用过webview 和我的style css文件位于assest folder 我想注入这个style css文件至www google com 我的代码有什么问题吗 请为我写
  • 使用 jQuery 的 .focus() 在 Mac 上的 Firefox 中设置焦点

    我想得到 focus 在 Mac 上使用 Firefox 版本 33 1 1 一些类似的问题提到了具有以下效果的解决方案 focus 没有视觉效果 通过下面的每项测试 我什至无法完成这一任务 下面列出的各种测试都适用于 Chrome 但不适
  • 如何开始使用 directshow?

    我很难理解this 编译 运行 directshow 应用程序的最少设置是什么 我已经安装了 Visual C 2008 Express 你好世界会很好 RGS 设置您的环境 设置环境是一个繁琐的过程 因为 DirectShow 现在已经深
  • 如何判断api是否返回数据?

    如何检查我的 api 请求是否返回任何数据fetchData功能 我想返回boolean 或其他东西 给我的Index vue并在加载数据时显示加载程序 但是当加载数据时我想使用 this router push admin dashboa
  • 如何在窗口中安排 Oracle DBMS 作业

    我想创建一个 Oracle DBMS 作业 该作业在每个工作日 不是周末 的 09 00 到 20 00 每 10 分钟运行一次 我想知道我是否可以做到这一点FREQ作业定义的参数 否则我必须创建一个New Maintenance Wind
  • java中用数组常量定义的枚举

    我想知道是否可以用数组定义枚举作为常量 请参阅以下代码摘录 编译时不会出现非法表达式开始错误 有人可以帮助我吗 非常感谢 public enum Currency PENNY 1 one oneone NICKLE 5 five DIME
  • VSTS 安装后将代理状态从离线更改为在线

    我遇到 VSTS 代理状态离线的问题 我通过 cmd 在正确的池下安装了代理并在之后下载 但它仍然离线 请提供任何帮助吗 如果构建代理以交互模式运行 您需要通过运行来启动代理run cmd file 以管理员身份打开命令行 Run run
  • Visual Studio 减慢应用程序速度

    这是一个模糊的问题 但是对于 Visual Studio 减慢应用程序速度我能做些什么吗 如果我在 Visual Studio 之外运行可执行文件 它会以非常可接受的速度运行 如果我在启用调试器的情况下在 Visual Studio 中运行
  • .sheet:仅显示一次,然后不再显示

    使用Beta4 似乎该错误仍然存 在 以下视图序列 列表 其中点击列表条目可打开另一个列表 允许呈现ListView正好一次 这onDisappear从未被调用过 所以showModal标志发生变化 但不会触发重新显示ListView再次点