2
votes

Comment utiliser SwiftUI Bindings pour créer une var?

J'ai un SwiftUI avec deux liaisons comme exemple. Je veux créer une plage à partir de ces deux liaisons.

Function declares an opaque return type, but has no return statements in its body from which to infer an underlying type

Maintenant, je veux initialiser mon curseur avec une plage. J'ai donc pensé que cela fonctionnerait:

var body: some View {
        var range = lowerBound...upperBound

mais où cela va-t-il? Si je le mets ci-dessous

var range = lowerBound...upperBound

J'obtiens cette erreur:

@Binding var lowerBound:Double
@Binding var upperBound:Double

Comment créer des variables à partir de liaisons? p>


2 commentaires

vous pouvez créer un viewmodel qui crée la plage var lors de la définition de lowerBound et upperBound


Votre approche semble ... fausse. Tout d'abord, le problème est que vous déclarez des variables en dehors de certaines vues , pas à l'intérieur. Deuxièmement, pourquoi ne pas simplement utiliser vos deux variables telles quelles ? Un Slider SwiftUI a besoin d'un paramètre appelé dans , ce que est cette plage que vous essayez de faire. Mes curseurs SwiftUI utilisent trois (et bientôt quatre) variables ObservableObject configurées comme un tableau d'une struct - min, max, default et soon - step. Ne pas paraître dur, mais il semble que vous n’avez pas «grokké» certaines bases de SwiftUI. (BTW, je ne vous ai pas voté contre.)


3 Réponses :


0
votes

J'étais trop nouveau sur SwiftUI. Mon problème était d'avoir à déclarer explicitement une vue de retour. On ne peut pas mélanger la logique avec les vues. Si tel est le cas, vous devez déclarer la vue que vous renvoyez. Cela provoquait mes erreurs de compilation.


0 commentaires

0
votes

Pour initialiser un curseur avec SwiftUI, vous n'avez pas besoin d'une plage. voir l'exemple ci-dessous:

struct ContentView: View {
    @State private var sliderValue: Double = 200
    @State private var lowerBound: Double = 10
    @State private var upperBound: Double = 1000

    var body: some View {
        CustomButton(sliderValue: $sliderValue, lowerBound: lowerBound, upperBound: upperBound)
    }
}

struct CustomButton: View {
    @Binding var sliderValue: Double
    var lowerBound: Double
    var upperBound: Double

    var body: some View {
        Slider(value: $sliderValue, from: lowerBound, through: upperBound, by: 10)
        .padding()        
    }
 }

Basé sur le document SwiftUI Slider pour initialiser un curseur, vous devez suivre cette signature:

public init (value: Binding, from minValue: V = 0.0, via maxValue: V = 1.0, onEditingChanged: @escaping (Bool) -> Void = {_ in}) où V: BinaryFloatingPoint, V.Stride: BinaryFloatingPoint

  • valeur: la valeur sélectionnée dans `minValue ... maxValue
  • minValue: Le début de la plage des valeurs valides. Par défaut à 0.0

  • maxValue: La fin de la plage de valeurs valides. La valeur par défaut est 1.0.

Et vous pouvez voir que le premier argument est une liaison et que minValue et maxValue ne sont pas contraignants.


0 commentaires

-1
votes

J'ai beaucoup appris depuis. Il était nécessaire d'utiliser à la fois les objets @State et @Environment dans l'initialisation et dans le rappel.

Voici mon exemple SQL Generator sur lequel tout est basé. Il utilise des liaisons avec un sélecteur et un curseur!

https://github.com/jimijon/SwiftUI-SQL-ExpMaker


1 commentaires

vous devez utiliser les wrappers de propriété comme prévu, ne pas essayer de les utiliser dans init