इसलिए मैंने स्विफ्टयूआई के बारे में बहुत कुछ पढ़ा है और मैं भ्रमित हूं। मैं समझता हूं कि @State और यह कैसे पर्दे के पीछे के दृश्य को अपडेट करता है। जिस चीज को मैं समझ नहीं पा रहा हूं वह यह है कि जब मैं इस उदाहरण में सबव्यूव स्वचालित रूप से अपडेट हो जाता हूं जब राज्य शीर्ष दृश्य/संरचना में बदलता है, इस तथ्य को देखते हुए कि सबव्यू पर var उपनाम उपनाम नहीं है। कोड>@राज्य संपत्ति। मुझे उम्मीद है कि इसे अपडेट नहीं किया जाएगा। क्या कोई कृपया मुझे प्रबुद्ध कर सकता है?

import SwiftUI

struct SwiftUIView: View {
    @State private var name = "George"
    var body: some View {
        VStack{
            SubView(subName: name).foregroundColor(.red)
            Button(action: {
                self.name = "George2"
            }) {
                Text("Change view name")
            }
        }
    }
}

struct SubView: View {
    var subName:String
    var body: some View {
        Text(subName)
    }
}

struct SwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        SwiftUIView()
    }
}

पुनश्च. अगर मैं सबव्यू को . में बदल दूं

struct SubView: View {
    @State var subName:String
    var body: some View {
        Text(subName)
    }
}

जब मैं बटन दबाता हूं तो यह अपडेट नहीं होता है।

1
georgeok 5 अक्टूबर 2020, 12:45

2 जवाब

सबसे बढ़िया उत्तर

वर उपनाम: स्ट्रिंग

struct SubView: View {
    var subName: String
    // ...
}

उपरोक्त उदाहरण में आपके पास वास्तव में कोई राज्य नहीं है। जब पैरेंट व्यू में subName प्रॉपर्टी बदल जाती है, तो पूरे SubView को फिर से खींचा जाता है और इस तरह subName प्रॉपर्टी के लिए एक नया मान दिया जाता है। यह मूल रूप से स्थिर है (इसे let में बदलने का प्रयास करें, आपके पास वही परिणाम होगा)।

@State var उपनाम: String

struct SubView: View {
    @State var subName: String
    // ...
}

यहां आपके पास एक @State प्रॉपर्टी है जिसे एक बार इनिशियलाइज़ किया जाता है (पहली बार SubView बनाया जाता है) और एक व्यू को फिर से तैयार किए जाने पर भी वही रहता है। जब भी आप पैरेंट व्यू में subName वैरिएबल बदलते हैं, तो सबव्यू में यह वही रहेगा (इसे सबव्यू के भीतर से संशोधित किया जा सकता है लेकिन पैरेंट के वेरिएबल को नहीं बदलेगा)।

@ बाइंडिंग वर उपनाम: स्ट्रिंग

struct SubView: View {
    @Binding var subName: String
    // ...
}

अगर आपके पास @Binding प्रॉपर्टी है तो आप सीधे पैरेंट के @State वेरिएबल तक पहुंच सकते हैं। जब भी इसे पैरेंट में बदला जाता है तो इसे सबव्यू (और दूसरी तरफ) में बदल दिया जाता है - यही कारण है कि इसे बाइंडिंग कहा जाता है।

2
pawello2222 5 अक्टूबर 2020, 12:56

जब भी किसी View की @State संपत्ति में परिवर्तन होता है, तो दृश्य ताज़ा हो जाता है, जिसका अर्थ है कि उसका पूरा body पुनर्गणना हो जाता है। चूँकि SubView, SwiftUIView के body का हिस्सा है, जब भी SwiftUIView खुद को रीफ़्रेश करता है, तो वह अपने @State name के नए मान का उपयोग करके अपने SubView को फिर से खींचता है। संपत्ति।

1
Dávid Pásztor 5 अक्टूबर 2020, 12:49