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>
3 Réponses :
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.
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
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.
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!
vous devez utiliser les wrappers de propriété comme prévu, ne pas essayer de les utiliser dans init
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 ? UnSliderSwiftUI 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) variablesObservableObjectconfigurées comme un tableau d'unestruct- 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.)