Button 如何有条件地隐藏或禁用按钮?

Button 如何有条件地隐藏或禁用按钮?,button,swiftui,Button,Swiftui,如何切换按钮是否隐藏? 我们有无条件的.hidden()属性;但我需要有条件的版本。 注意:我们有可用的.disabled(bool)属性,但没有.hidden(bool) struct ContentView: View { var body: some View { ZStack { Color("SkyBlue") VStack { Button("Detect") {

如何切换按钮是否隐藏?
我们有无条件的.hidden()属性;但我需要有条件的版本。 注意:我们有可用的.disabled(bool)属性,但没有.hidden(bool)

struct ContentView: View {
    var body: some View {
        ZStack {
            Color("SkyBlue")
            VStack {
                Button("Detect") {
                    self.imageDetectionVM.detect(self.selectedImage)
                }
                .padding()
                .background(Color.orange)
                .foreggroundColor(Color.white)
                .cornerRadius(10)
                .hidden() // ...I want this to be toggled.
            }
        }
    }
}

我希望
hidden
修饰符稍后获得参数,但从那时起,改为设置alpha:

@State var shouldHide = false

var body: some View {
    Button("Button") { self.shouldHide = true }
    .opacity(shouldHide ? 0 : 1)
}

它并不总是一个很好的解决方案,但在某些情况下,有条件地添加它也可能有效:

if shouldShowMyButton {
    Button(action: {
        self.imageDetectionVM.detect(self.selectedImage)
    }) {
        Text("Button")
    }          
}

在没有显示的情况下会出现空白问题,这可能或多或少取决于具体的布局。这可以通过添加一个
else
语句来解决,该语句也可以添加一个大小相等的空格。

您可以利用SwiftUI新的双向绑定并添加一个if语句,如下所示:

struct ContentView: View {

    @State var shouldHide = false

    var body: some View {
        ZStack {
            Color("SkyBlue")
            VStack {
                if !self.$shouldHide.wrappedValue { 
                    Button("Detect") {
                        self.imageDetectionVM.detect(self.selectedImage)
                    }
                    .padding()
                    .background(Color.orange)
                    .foregroundColor(Color.white)
                    .cornerRadius(10)
                }
            }
        }
    }
}

与将不透明度设置为0相比,这样做的好处是,它将从UI中删除由于按钮仍在视图中而导致的奇怪间距/填充,只是不可见(如果按钮位于其他视图组件之间,即).

对我来说,当你不想看到它时,将
框架的高度设置为零非常有效。当您想要计算大小时,只需将其设置为
nil

SomeView
.框架(高度:可见?无:0)
如果除了隐藏它之外还想禁用它,可以使用切换的布尔值设置
.disabled

SomeView
.框架(高度:可见?无:0)
.disabled(!isVisible)

这里的所有答案都特别适用于有条件隐藏的按钮

我认为可能有帮助的是有条件地制作一个修饰符本身,例如: .隐藏用于按钮/视图,或者可能.italic用于文本等

使用扩展

要使文本有条件地倾斜,这很容易,因为.italic修饰符返回文本:

extension Text {
    func italicConditionally(isItalic: Bool) -> Text {
        isItalic ? self.italic() : self
    }
}
然后像这样应用条件斜体:

@State private var toggle = false
Text("My Text")
    .italicConditionally(isItalic: toggle)
@State private var toggle = false
Button("myButton", action: myAction)
    .hiddenConditionally(isHidden: toggle)
但是,对于按钮来说,这很棘手,因为.hidden修饰符返回“some view”:

然后像这样应用条件隐藏:

@State private var toggle = false
Text("My Text")
    .italicConditionally(isItalic: toggle)
@State private var toggle = false
Button("myButton", action: myAction)
    .hiddenConditionally(isHidden: toggle)

您可以使用条件语句轻松地在SwiftUI中隐藏视图

struct TestView: View{
    
    @State private var isVisible = false
    
    var body: some View{
        
        if !isVisible {
            HStack{
                Button(action: {
                    isVisible.toggle()
                    // after click you'r view will be hidden
                }){
                    Text("any view")
                }
            }
        }
        
    }
}

如果这是你要找的,那就找这个问题。请和你一起帮助别人。张贴实际可搜索的代码!截图真的不好。谢谢根据反馈用代码替换图像。我同意你的观点,弗雷德里克。。。我看不出使用.hidden()有什么意义如果它不是有条件的,那么谁会编写完整的按钮代码来隐藏它呢!?在我尝试之前,我(错误地)认为这个解决方案只会在视图中隐藏按钮,但它仍然存在&可以单击。这种假设是不正确的;至少在模拟器中,不透明度为.opacity(0)的按钮不能点击。