在 onAppear 中触发时工作表未打开

Posted

技术标签:

【中文标题】在 onAppear 中触发时工作表未打开【英文标题】:Sheet doesn't open when triggered in onAppear 【发布时间】:2021-01-21 17:09:08 【问题描述】:

sheetonAppear 中触发时无法打开,我遇到了一个奇怪的错误。

以下不会在 Xcode 12.3、ios 14.3 中触发sheet

struct ContentView: View 
    @State private var sheetActive = false

    var body: some View 
        Text("Test")
            .sheet(isPresented: $sheetActive) 
                Text("Sheet")
            
            .onAppear 
                sheetActive = true
            
    

sheet 只有在我以任何方式与屏幕交互后才会弹出。

但是,如果我将 Text 包装在 NavigationView / List 等中,它确实有效。

此外,即使附加一个简单的修饰符(如onChange)也会触发sheet

struct ContentView: View 
    @State private var sheetActive = false

    var body: some View 
        Text("Test")
            .sheet(isPresented: $sheetActive) 
                Text("Sheet")
            
            .onAppear 
                sheetActive = true
            
            .onChange(of: sheetActive) 
                print($0)
            
    

当我异步触发sheet 时它也有效:

struct ContentView: View 
    @State private var sheetActive = false

    var body: some View 
        Text("Test")
            .sheet(isPresented: $sheetActive) 
                Text("Sheet")
            
            .onAppear 
                DispatchQueue.main.async 
                    sheetActive = true
                
            
    

这是 iOS 14.3 中的错误还是我不知道的一些预期更改?

【问题讨论】:

已尝试更改工作表顺序和出现方法并添加延迟 更改顺序也不起作用。而且我什至不需要延迟,它也适用于简单的DispatchQueue.main.async。由于某种原因,只是 标准 方式不起作用。 【参考方案1】:

如果您将sheetActive 更改为true,它应该会在初始化时打开。

在 SO 和 Apple 论坛中不断提到使用 onAppear() 初始化/活动的东西的错误。这是非常不可靠的。

struct ActiveSheetView: View 
    @State private var sheetActive = true
    var body: some View 
        Text("Test")
            .sheet(isPresented: $sheetActive) 
                Text("Sheet")
            
    

【讨论】:

好的,所以这看起来像一个错误。

以上是关于在 onAppear 中触发时工作表未打开的主要内容,如果未能解决你的问题,请参考以下文章

带有导航器的颤振模态底部工作表未按预期弹出

Excel工作表未关闭[重复]

Google App Engine、Jinja2 CSS 样式表未加载 (404)

当 View.OnAppearing 被触发时 SafeAreaInsets 为 0

Worksheet_Activate 未在工作簿打开时触发

文本未出现但 onAppear 触发器