SwiftUI如何为Slider设置最小和最大值,并在Text中显示其值?

5
import SwiftUI

struct ContentView : View {
    var body: some View {
        PasswordGeneratorSettings(settingsConfiguration: PasswordGeneratorSettings.Settings.init(passwordLength: 20))
    }
}


struct PasswordGeneratorSettings : View {
    @State var settingsConfiguration: Settings
    struct Settings {
        var passwordLength = UInt()
    }
    var body: some View {
        NavigationView {
            List {
                Slider(value: $settingsConfiguration.passwordLength) { pressed in
                    Text("Password Length: \(settingsConfiguration.passwordLength)")
                }
                }.navigationBarTitle(Text("Settings"))
        }
    }
}

我正在制作一个密码生成器,希望以一个滑动条开始,最小长度为1,最大长度为512,并在标签中显示其值(作为整数)。但目前我只能试着将更新标签放在tableview(列表)的左侧,将滑块放在右侧,但这甚至无法编译。

简而言之:

  1. 找出如何使用滑动条设置最小和最大值

  2. 在tableview单元格的左侧放置具有滑动条值(作为整数)的标签,滑动条放在右侧

并且我想在不使用UIKit的情况下实现所有这些,只用SwiftUI(如果需要,则使用Combine)。

3个回答

3

这是如何使用滑块:

import SwiftUI

struct ContentView : View {
    @State var length: Float = 20

    var body: some View {
        NavigationView {
            List {
                PasswordGeneratorSettings(length: $length)
            }.navigationBarTitle(Text("Settings"))
        }
    }
}


struct PasswordGeneratorSettings : View {
    @Binding var length: Float

    var body: some View {

        VStack(alignment: .leading) {
            Slider(value: $length, in: 1...512, step: 1)

            Text("Password Length: \(Int(length))")

        }
    }
}

这应该是Xcode beta 6的正确答案。签名需要是:value: in: start…end。 - JohnSF
这将显示非整数值。如何限制滑块只能为整数值? - Zonker.in.Geneva

2

你的代码无法编译,因为你需要在滑块值参数中使用double类型。你可以使用以下代码来实现你的要求。滑块有三个参数:value、from和through。简单来说,from是最小值,through是最大值,在任何给定时间,“value”将返回滑块中的当前值。

最初的回答:

struct PasswordGeneratorSettings : View {
    @State var settingsConfiguration: Settings
    struct Settings {
        var passwordLength: Double = 1.0
    }
    var body: some View {
        NavigationView {
            List {
                HStack {
                    Text("Password Length: \(Int(settingsConfiguration.passwordLength))")
                    Slider(value: $settingsConfiguration.passwordLength, from: 1, through: 512)
                }
                .padding()
            }.navigationBarTitle(Text("Settings"))
        }
    }
}

0
struct BoundsSlider : View {
    let min: CGFloat
    let max: CGFloat
    
    @Binding var value: CGFloat
    @State var lastValue: CGFloat
    
    init (min: CGFloat, max: CGFloat, value: Binding<CGFloat>) {
        self.min = min
        self.max = max
        _value = value
        _lastValue = State(initialValue: value.wrappedValue)
    }
    
    var body: some View {
        Slider(value: Binding.init(get: { () -> CGFloat in return value },
                                   set: { (newValue) in if true { value = newValue; lastValue = newValue } }), in: min...max)
    }
}

用法:

BoundsSlider(min: 0.7, max: 5, value: $speed)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接