是否可以禁用一半的步进器

问题描述 投票:0回答:3

我想在步进器的值为零时禁用一半的步进器。

我在步进器上尝试了 .disabled 功能,但它禁用了整个步进器,我只想禁用步进器的递减部分。

struct StepperLabelView : View {
    @ObservedObject var social: Social

    var body: some View {
        VStack {
            Stepper(onIncrement: {
                self.social.quantity += 1
                socialsInCanvas += [Social(companyName: self.social.companyName)]
            }, onDecrement: {
                self.social.quantity -= 1
                socialsInCanvas.removeLast()
            }, label: { Text("") })
                .disabled(social.quantity == 0)
        }
        .padding()
    }
}
swift swiftui
3个回答
6
投票

Stepper
可以在一定范围内激活每个按钮:

struct ContentView : View {

    @State var quantity = 3

    var body: some View {
        VStack {
            Stepper("Count: \(quantity)", value: $quantity, in: 0...Int.max)
        }
        .padding()
    }
}

您可以使用

onEditingChanged
参数来添加额外的工作。 您也可以在
quantity
上观察:

@State var quantity = 3 {
    didSet {
        if oldValue < quantity {
            // Probably + button touched
            return
        }

        if oldValue > quantity {
            // Probably - button touched
            return
        }

        if oldValue == quantity {
            // Unknown
        }

    }
}

1
投票

您可以将 onDecrement 代码包装在条件中,或使用两个按钮自行编写。

        HStack {
            Button(
                action: { self.item += "+" },
                label: { Image(systemName: "plus.circle") }
            )
            Text(item)
            Button(
                action: { self.item += "-" },
                label: { Image(systemName: "minus.circle") }
            )
        }

只需在适当的时候禁用“-”按钮即可。 plus.square 可能是一个更好的符号,https://sfsymbols.com 是比较它们的好地方。


0
投票

另一种替代方法是用户

Stepper(_:onIncrement:onDecrement:)
并将您的自定义条件放入
onIncrement
onDecrement
回调中。

以下是苹果的例子

import SwiftUI

struct StepperView: View {
    @State private var value = 0
    let colors: [Color] = [.orange, .red, .gray, .blue, .green,
                          .purple, .pink]

    func incrementStep() {
        value += 1
        if value >= colors.count { value = 0 }
    }

    func decrementStep() {
        value -= 1
        if value < 0 { value = colors.count - 1 }
    }

    var body: some View {
        Stepper(onIncrement: incrementStep,
                onDecrement: decrementStep) {
            Text("Value: \(value) Color: \(colors[value].description)")
        }
        .padding(5)
        .background(colors[value])
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.