.onAppear एक SwiftUI मॉडिफ़ायर है जो View को इंटरफ़ेस पदानुक्रम में जोड़ने पर क्लोज़र निष्पादित करता है। कॉल स्क्रीन पर इंस्टेंस के प्रकट होने पर एक बार होता है और डेटा लोड करने, एनिमेशन शुरू करने और एनालिटिक्स इवेंट भेजने के मुख्य बिंदु के रूप में कार्य करता है। Apple Developer Documentation (2026) के अनुसार, onAppear पहले रेंडर से पहले निष्पादन की गारंटी देता है, लेकिन यदि View मेमोरी में रहती है तो प्रत्येक बार-बार प्रदर्शन पर कॉल की गारंटी नहीं देता। SwiftUI के बारे में और पढ़ें SwiftUI लेख में।
मुख्य बातें
.onAppear SwiftUI में एक View मॉडिफ़ायर है जो Void क्लोज़र लेता है और इसे तब निष्पादित करता है जब View स्क्रीन पर दृश्य हो जाती है। यह मॉडिफ़ायर .onDisappear और .task के साथ SwiftUI घटक जीवनचक्र प्रणाली का हिस्सा है। Apple ने UIKit से viewDidLoad के प्रतिस्थापन के रूप में SwiftUI के iOS 13 और watchOS 6 में रिलीज़ के साथ onAppear पेश किया।
वाक्यात्मक रूप से, .onAppear किसी भी View को संशोधित करता है और संलग्न कार्रवाई के साथ उसी View को लौटाता है। SwiftUI कंपोज़र पारित क्लोज़र को एक बार कॉल करता है जब View पदानुक्रम में जोड़ी जाती है और रेंडरिंग चरण पास करती है। यदि View हटा दी जाती है और फिर से जोड़ी जाती है (उदाहरण के लिए, सूची में स्क्रॉल करते समय), onAppear फिर से कॉल होता है — यह व्यवहार अक्सर अप्रत्याशित बग का स्रोत बन जाता है।
मॉडिफ़ायर का मूल सिंटैक्स न्यूनतम है: बिना पैरामीटर के onAppear। SwiftUI में प्राथमिकता या एनिमेशन पास करने का कोई तरीका नहीं है — क्लोज़र रेंडरिंग के तुरंत बाद मुख्य थ्रेड पर सिंक्रोनस रूप से निष्पादित होता है।
struct ContentView: View {
var body: some View {
Text("Hello, SwiftUI!")
.onAppear {
print("View appeared on screen")
}
}
}
सीमाएँ: onAppear सीधे async/await का समर्थन नहीं करता। क्लोज़र के अंदर अतुल्यकालिक संचालन के लिए Task {} या Task.detached के माध्यम से कॉल की गई अलग async/await फ़ंक्शन की आवश्यकता है। यह onAppear को .task मॉडिफ़ायर की तुलना में नेटवर्क अनुरोधों के लिए कम सुविधाजनक बनाता है।
.onAppear layout+render चरण में SwiftUI रेंडरिंग पाइपलाइन में एम्बेडेड है। जब SwiftUI View बॉडी की गणना करता है और पदानुक्रम परिवर्तन का पता लगाता है, तो वह सभी नव जोड़े गए Views के लिए onAppear कॉलबैक चलाता है। कॉल क्रम नेस्टिंग का अनुसरण करता है: पहले पैरेंट onAppear, फिर चाइल्ड तत्व।
SwiftUI की एक महत्वपूर्ण विशेषता यह है कि onAppear भौतिक स्क्रीन उपस्थिति से बंधा नहीं है। मॉडिफ़ायर तब कॉल होता है जब View पदानुक्रम में जोड़ी जाती है भले ही वह उपयोगकर्ता को दिखाई दे रही हो या नहीं (उदाहरण के लिए, ScrollView में स्क्रीन से बाहर)। यह SwiftUI को UIKit से अलग करता है, जहाँ viewWillAppear केवल वास्तविक उपस्थिति पर चलता है।
कॉल क्रम पैरेंट-फ़र्स्ट नियम का पालन करता है: VStack या NavigationView पहले onAppear प्राप्त करता है, फिर क्रम में प्रत्येक चाइल्ड तत्व। यह साझा संसाधन आरंभीकरण के लिए महत्वपूर्ण है: यदि चाइल्ड तत्व पैरेंट द्वारा लोड किए गए डेटा पर निर्भर करते हैं, तो उन्हें Optional के माध्यम से उपलब्धता की जाँच करनी चाहिए।
struct ParentView: View {
var body: some View {
VStack {
ChildView()
ChildView()
}
.onAppear {
print("Parent onAppear — first")
}
}
}
struct ChildView: View {
var body: some View {
Text("Child")
.onAppear {
print("Child onAppear")
}
}
}
कंसोल आउटपुट होगा: Parent onAppear — पहले, फिर दो बार Child onAppear क्रम में। यह व्यवहार Apple द्वारा गारंटीकृत है और सभी SwiftUI संस्करणों (iOS 13–18) में स्थिर है।
.onAppear के कई कॉल परिदृश्य हैं जो कंटेनर और नेविगेशन पर निर्भर करते हैं। NavigationStack में, onAppear नए कंट्रोलर के प्रत्येक push पर और pop पर — रूट कंट्रोलर के लिए चलता है। TabView में, टैब स्विच करने से प्रदर्शित टैब के लिए onAppear और छिपे हुए के लिए onDisappear कॉल होता है।
List और ScrollView में, onAppear उन कोशिकाओं के लिए कॉल होता है जो दृश्य क्षेत्र में आई हैं या प्री-रेंडरिंग बफर में हैं। iOS 18 ने प्रीफ़ेच तंत्र पेश किया जो स्क्रॉल से 2–3 स्क्रीन पहले कोशिकाओं के लिए onAppear कॉल कर सकता है — यह धारणा को गति देता है लेकिन अनावश्यक नेटवर्क अनुरोधों को ट्रिगर कर सकता है।
NavigationStack (iOS 16+) स्क्रीन स्टैक को NavigationView से अलग तरीके से प्रबंधित करता है। नई स्क्रीन push करते समय, onAppear केवल नई स्क्रीन पर चलता है, जबकि वर्तमान स्क्रीन वास्तविक हटाने तक onDisappear प्राप्त नहीं करती। pop पर, विपरीत प्रक्रिया होती है: छोड़ी जा रही स्क्रीन पर onDisappear, लौट रही स्क्रीन पर onAppear।
| परिदृश्य | onAppear | onDisappear |
|---|---|---|
| Push | नई स्क्रीन | नहीं (स्क्रीन स्टैक में रहती है) |
| Pop | लौट रही स्क्रीन | छोड़ी जा रही स्क्रीन |
| टैब स्विच | नया टैब | पुराना टैब |
| शीट बंद करना | पैरेंट स्क्रीन | खुली शीट |
व्यावहारिक अनुप्रयोग onAppear तीन मुख्य श्रेणियों को कवर करते हैं: डेटा लोडिंग, एनिमेशन शुरू करना और एनालिटिक्स भेजना। डुप्लिकेट कॉल और मेमोरी लीक से बचने के लिए प्रत्येक परिदृश्य में SwiftUI जीवनचक्र सुविधाओं पर विचार करने की आवश्यकता है।
डेटा लोड करना onAppear का सबसे सामान्य उपयोग है। क्लोज़र के अंदर, async कॉल के लिए एक Task बनाया जाता है, और परिणाम @State या @StateObject में संग्रहीत किया जाता है। isLoading फ़्लैग या nil जाँच का उपयोग करके यह जाँचना महत्वपूर्ण है कि डेटा पहले लोड हो चुका है या नहीं।
struct ProfileView: View {
@StateObject private var viewModel = ProfileViewModel()
var body: some View {
VStack {
if viewModel.isLoading {
ProgressView()
} else {
Text(viewModel.userName)
}
}
.onAppear {
guard viewModel.userName == nil else { return }
Task {
await viewModel.loadProfile()
}
}
}
}
पुनः-fetch से सुरक्षा एक महत्वपूर्ण अभ्यास है। यदि SwiftUI View को पुनः बनाता है (उदाहरण के लिए, स्क्रीन रोटेशन पर), onAppear बिना सुरक्षा के फिर से चलेगा। एक विकल्प .task मॉडिफ़ायर है, जो स्वचालित रूप से पिछले अनुरोध को रद्द करता है।
प्रवेश एनिमेशन withAnimation या animation मॉडिफ़ायर के माध्यम से एनिमेशन ट्रिगर करने वाले स्टेट वेरिएबल को बदलने के लिए onAppear का उपयोग करता है। विशिष्ट पैटर्न: प्रारंभिक अवस्था (opacity 0, offset 100), प्रकट होने पर अंतिम अवस्था (opacity 1, offset 0) में संक्रमण।
struct AnimatedCard: View {
@State private var isVisible = false
var body: some View {
RoundedRectangle(cornerRadius: 12)
.fill(Color.blue)
.opacity(isVisible ? 1 : 0)
.offset(y: isVisible ? 0 : 50)
.animation(.spring(), value: isVisible)
.onAppear {
withAnimation(.spring().delay(0.3)) {
isVisible = true
}
}
}
}
0.3 सेकंड का विलंब अनुक्रमिक प्रकटन प्रभाव बनाता है यदि स्क्रीन पर कई ऐसे कार्ड हों। एनिमेटेड तत्वों की सूची के लिए, विलंब गुणक के रूप में तत्व सूचकांक का उपयोग करें।
.task iOS 15 में जोड़ा गया एक SwiftUI मॉडिफ़ायर है जो onAppear में async संचालन की समस्या को हल करता है। onAppear के विपरीत, .task एक async क्लोज़र स्वीकार करता है, स्वचालित रूप से इसके जीवनचक्र का प्रबंधन करता है, और View के गायब होने पर इसे रद्द करता है। जहाँ onAppear सिंक्रोनस रूप से निष्पादित होता है, .task एक अतुल्यकालिक संचालन शुरू करता है और SwiftUI को onDisappear पर इसे रद्द करने देता है।
मुख्य अंतर रद्दीकरण प्रबंधन है। जब .task एक async संचालन बनाता है, SwiftUI Task का संदर्भ सहेजता है और View के पदानुक्रम से हटाए जाने पर स्वचालित रूप से cancel() कॉल करता है। अंदर Task {} के साथ onAppear चल रहे संचालन को रद्द नहीं करता — यह View के गायब होने के बाद भी निष्पादित होता रहता है, जो रेस कंडीशन या डीलोकेटेड इंस्टेंस में लेखन का कारण बन सकता है।
| विशेषता | .onAppear | .task |
|---|---|---|
| iOS संस्करण | iOS 13+ | iOS 15+ |
| Async समर्थन | केवल Task {} के माध्यम से | मूल async/await |
| स्वतः रद्दीकरण | नहीं | View गायब होने पर |
| पुनः कॉल | प्रत्येक प्रकटन पर | डिफ़ॉल्ट रूप से एक बार |
| सिंक्रोनस कोड | हाँ | केवल async |
मॉडिफ़ायर चयन: सिंक्रोनस क्रियाओं (एनिमेशन, एनालिटिक्स, लॉगिंग) के लिए onAppear का उपयोग करें। async डेटा लोडिंग (API, Core Data, फ़ाइल सिस्टम) के लिए .task को प्राथमिकता दें — यह अधिक सुरक्षित और स्वच्छ है।
गलती 1: View पुनर्निर्माण के कारण कई कॉल. जब SwiftUI View बॉडी को पुनः बनाता है (स्टेट परिवर्तन, स्क्रीन रोटेशन), onAppear फिर से कॉल हो सकता है। समाधान — लोडिंग फ़्लैग जोड़ें या अनावश्यक पुनः चित्रण को रोकने के लिए .equatable() का उपयोग करें। SwiftLee (2025) के अनुसार, प्रोडक्शन में 40% SwiftUI बग onAppear के बार-बार कॉल से संबंधित हैं।
गलती 2: मजबूत संदर्भ के माध्यम से मेमोरी लीक. यदि onAppear क्लोज़र बिना कमज़ोर संदर्भ के self को कैप्चर करता है, तो यह View के साथ रिटेन साइकिल बनाता है। SwiftUI View के गायब होने पर कैप्चर की गई वस्तुओं के शून्यीकरण की गारंटी नहीं देता। ViewModel या सेवाओं के लिए कैप्चर लिस्ट [weak self] का उपयोग करें।
गलती 3: बैकग्राउंड थ्रेड पर निष्पादन. onAppear मुख्य थ्रेड पर निष्पादित होता है — यह UI संचालन के लिए सही है। लेकिन यदि आप onAppear के अंदर Task शुरू करते हैं, तो सुनिश्चित करें कि @State अपडेट MainActor.run के माध्यम से हो। Swift 5.9 और उससे ऊपर स्वचालित रूप से MainActor पर लौटता है, लेकिन @MainActor को स्पष्ट रूप से निर्दिष्ट करना बेहतर है।
लोडिंग फ़्लैग वाला पैटर्न दोहराव से बचाव का सबसे विश्वसनीय तरीका है। फ़्लैग को @State या @StateObject में स्टोर करें और केवल मैन्युअल अपडेट पर रीसेट करें। एक विकल्प onAppear के बजाय .task का उपयोग करना है: .task डिफ़ॉल्ट रूप से पुनः चित्रण पर पुनः प्रारंभ नहीं होता यदि async संचालन पहले से चल रहा है।
struct SafeView: View {
@State private var hasAppeared = false
@State private var items: [Item] = []
var body: some View {
List(items, id: \.id) { item in
Text(item.name)
}
.onAppear {
guard !hasAppeared else { return }
hasAppeared = true
Task {
items = await DataService.shared.fetchItems()
}
}
}
}
अक्सर पूछे जाने वाले प्रश्न
viewDidLoad UIViewController के जीवनकाल में एक बार कॉल होता है, दृश्यता से स्वतंत्र। .onAppear हर बार कॉल होता है जब View पदानुक्रम में जोड़ी जाती है — यदि View हटा दी जाती है और फिर से जोड़ी जाती है, onAppear फिर से चलता है। NavigationView में, viewDidLoad आरंभीकरण के दौरान कॉल होता है, जबकि onAppear प्रत्येक स्क्रीन प्रदर्शन पर कॉल होता है।
हाँ, Task { await asyncFunction() } रैपर के माध्यम से। हालाँकि, async संचालन के लिए .task प्राथमिकता है, जो स्वचालित रूप से रद्दीकरण प्रबंधित करता है और मैन्युअल रूप से Task बनाने की आवश्यकता नहीं है। .task View के गायब होने पर रद्दीकरण की गारंटी भी देता है, लीक को रोकता है।
कारण @State, @Published, या पूर्वज कॉन्फ़िगरेशन में परिवर्तनों के कारण View बॉडी का पुनर्निर्माण है। SwiftUI किसी भी देखने योग्य गुण में परिवर्तनों के जवाब में View को पुनः चित्रित कर सकता है। इसके अतिरिक्त, LazyVStack और List दृश्य क्षेत्र के पास आने वाली कोशिकाओं के लिए onAppear कॉल करते हैं, और ऊपर स्क्रॉल करने पर फिर से।
हाँ, .onAppear सभी SwiftUI प्लेटफ़ॉर्म पर उपलब्ध है: iOS 13+, watchOS 6+, tvOS 13+, macOS 10.15+. व्यवहार समान है: View को पदानुक्रम में जोड़ने पर मॉडिफ़ायर कॉल होता है। watchOS पर, onAppear ऐप के स्टैंडबाय स्थिति से सक्रिय होने पर चलता है, जिसे डिज़ाइन में ध्यान में रखा जाना चाहिए।
.onAppear पैरामीटर स्वीकार नहीं करता — केवल Void क्लोज़र। पैरामीटर पास करने के लिए, ऐसे क्लोज़र का उपयोग करें जो बाहरी वेरिएबल कैप्चर करता है। एक वैकल्पिक दृष्टिकोण ViewModifier या .onChange के समकक्ष के माध्यम से पैरामीटर के साथ कस्टम onAppear मॉडिफ़ायर बनाना है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें