عند تمرير قيمة لـ View اخر اثناء فتح الـ sheet او الـ fullCover والقيمة ماكانت من نوع State فلن ينتبه لها الصفحة الاخرى
مثال للمشكلة
struct ContentView: View {
@State private var showSheet = false
@State private var number = 0
var body: some View {
VStack {
Button {
number = 1
showSheet.toggle()
} label: {
Text("Tab Me" )
}
}
.sheet(isPresented: $showSheet) {
ResultView( number: number)
}
}
}
struct ResultView: View {
var number = 0
var body: some View {
Text("\(number)")
.font(.system(.largeTitle))
}
}
في المثال قمت بتغيير قيمة number الى 1
لكن عند الضغط على الزر سوف تجدها 0 وليس 1
كيف حل هذه المشكلة ؟
في حلين لها
الحل الاول
استخدام Binding في الصفحة الجديدة
بمعنى نغير الـ number من
var number: Int
الى
@ Binding var number: Int
وبالتالي الـ sheet يصبح
.sheet(isPresented: $showSheet) { ResultView(number: $ number) }
كذا الصفحة الثانية راح تنتبه لتغيير وراح تعرض نتيجة 1 وليس 0
فيديو يوضح المشكلة والحل السابق
الحل الثاني
مفيد في حال كنت تفتح كذا sheet او كذا fullCover في نفس الصفحة
تغيير isPresented الى item
والخطوات هيا تعمل enum مكون من case يقبل parameter
وبالتالي لما تضغط الزر تمرر الـ number له ولما تستخدم الـ sheet مع item
راح تحصل على المتغير بعد تغييره وبالتالي القيمة راح تطلع 1 وليس 0
لاحظ انه number في صفحة ResultView ماهو Binding
struct ContentView: View {
@State private var activeSheet: ActiveSheet?
@State private var number = 0
var body: some View {
VStack {
Button {
number = 1
activeSheet = .number(value: number)
} label: {
Text("Tab Me" )
}
}
.sheet(item: $activeSheet) { item in
switch item {
case . number (value: let num):
ResultView(number: num)
}
}
}
}
struct ResultView: View {
var number = 0
var body: some View {
Text("\(number)")
.font(.system(.largeTitle))
}
}
enum ActiveSheet: Identifiable, Equatable {
case number( value: Int)
public var id: String {
switch self {
case .number:
return "number"
}
}
}
