توضيح بخصوص الـ sheet

عند تمرير قيمة لـ 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"
        }
    }
}