有条件呈现ActionSheet SwiftUI

时间:2020-06-26 01:30:51

标签: swiftui

我创建了一个更新表来通知用户有关更新的信息,但是我不希望每次推送更新时都显示该更新表,因为有时它只是一些错误修复程序,因此我创建了一个常数来切换该表。我正在打电话给下面的工作表:

VStack {
    Text(" ")
}
.sheet(isPresented: $isShowingAppStoreUpdateNotification) {
    UpdatesView()
}

如何有条件地检查常数?这是我尝试过的:

if(generalConstants.shouldShowUpdateSheet) {
    .sheet(isPresented: $isShowingAppStoreUpdateNotification) {
        UpdatesView()
    }
}

但我收到此错误:Cannot infer contextual base in reference to member 'sheet'

2 个答案:

答案 0 :(得分:0)

这是我的示例代码。

struct ContentView: View {
    @State private var showSheet = false
    @State private var toggle = false {
        didSet {
            self.showSheet = toggle && sheet
        }
    }
    @State private var sheet = false {
        didSet {
            self.showSheet = toggle && sheet
        }
    }
    var body: some View {
        VStack {
            Toggle(isOn: $toggle) {
                Text("Allow to show sheet")
            }
            Button(action: {
                self.sheet.toggle()
            }) {
                Text("Show sheet")
            }
        }.sheet(isPresented: $showSheet, content: {
            Text("Sheet")
        })
    }
}

答案 1 :(得分:0)

.sheet是实例方法VStack,所以您不能做您做的-这不是合法的Swift语法。

最简单的方法是在VStack视图上显示条件:

if(generalConstants.shouldShowUpdateSheet) {
   VStack {
      Text(" ")
   }
   .sheet(isPresented: $isShowingAppStoreUpdateNotification) {
      UpdatesView()
   }
} else {
   VStack {
      Text(" ")
   }
}

但是,当然,这不是很干。

相反,请保持视图在视图模型/状态下的行为逻辑,并让视图仅对数据更改做出反应。我的意思是,只有在满足所有想要的条件时,才将isShowingAppStoreUpdateNotification设置为true,并保持视图不变

@State var isShowingAppStoreUpdateNotification = generalConstants.shouldShowUpdateSheet

var body: some View {
   VStack {
      Text(" ")
   }
   .sheet(isPresented: $isShowingAppStoreUpdateNotification) {
      UpdatesView()
   }
}