.onAppear — SwiftUI modifikatoru olub, View interfeys iyerarxiyasına əlavə edildikdə bağlamı icra edir. Çağırış nümunənin ekranda görünməsi üçün bir dəfə baş verir və məlumatların yüklənməsi, animasiyaların başladılması və analitik hadisələrin göndərilməsi üçün əsas nöqtə kimi xidmət edir. Apple Developer Documentation (2026) məlumatlarına görə, onAppear ilk renderdən əvvəl icranı təmin edir, lakin View yaddaşda qaldıqda hər təkrar göstərmədə çağırılacağına zəmanət vermir. SwiftUI haqqında daha ətraflı SwiftUI materialında oxuyun.
Əsas məqamlar
.onAppear — SwiftUI-də View modifikatoru olub, Void bağlamı qəbul edir və View ekranda görünən an onu icra edir. Bu modifikator .onDisappear və .task ilə birlikdə SwiftUI komponentlərinin həyat dövürü sisteminin bir hissəsidir. Apple onAppear-ı SwiftUI ilə birlikdə iOS 13 və watchOS 6-da UIKit-dən viewDidLoad-un əvəzi kimi təqdim etdi.
Sintaktik olaraq .onAppear istənilən View-i modifikasiya edir və eyni View-i əlavə edilmiş hərəkətlə qaytarır. SwiftUI kompilyatoru ötürülən bağlamı bir dəfə, görüntü iyerarxiyaya əlavə edildikdə və render mərhələsindən keçdikdə çağırır. View silinir və sonra yenidən əlavə edilərsə (məsələn, siyahıda sürüşdürmə zamanı), onAppear yenidən çağırılır — bu davranış tez-tez gözlənilməz səhvlərin mənbəyinə çevrilir.
Əsas sintaksis modifikator minimaldir: parametrsiz onAppear. SwiftUI-də prioritet və ya animasiya ötürmək mümkün deyil — bağlama renderdən dərhal sonra əsas axında sinxron icra olunur.
struct ContentView: View {
var body: some View {
Text("Salam, SwiftUI!")
.onAppear {
print("View ekranda göründü")
}
}
}
Məhdudiyyətlər: onAppear birbaşa async/await dəstəkləmir. Bağlama daxilində asinxron əməliyyatlar üçün Task {} və ya Task.detached vasitəsilə çağırılan ayrıca async/await funksiyası tələb olunur. Bu, onAppear-ı .task modifikatoru ilə müqayisədə řəbəkə sorğuları üçün daha az rahat edir.
.onAppear layout+render mərhələsində SwiftUI render boru kəmərinə qoşulur. SwiftUI View-in gövdəsini hesablayıb iyerarxiya dəyişikliyi aşkar etdikdə, bütün yeni əlavə edilmiş görüntülər üçün onAppear callback-lərini işə salır. Çağırış sırası iç-içəlik sırasına uyğurdur: əvvəlcə valideyndə onAppear, sonra uşaq elementlərdə.
SwiftUI-nin vacib xüsusiyyəti — onAppear fiziki ekranda görünmə ilə bağlı deyil. Modifikator View iyerarxiyaya əlavə edildikdə çağırılır, istifadəçiyə görünüb-görünməməsindən asılı olmayaraq (məsələn, ScrollView-də ekrandan kənarda). Bu, SwiftUI-ni UIKit-dən fərqləndirir, burada viewWillAppear yalnız real görünmədə işləyir.
Çağırış sırası parent-first qaydasına tabedir: VStack və ya NavigationView əvvəlcə onAppear alır, sonra hər bir uşaq element növbə ilə. Bu, paylaşılan resursların işə salınması üçün kritikdir: əgər uşaq elementlər valideyn tərəfindən yüklənən məlumatlardan asılıdırsa, onlar Optional vasitəsilə çatışlılığı yoxlamalıdır.
struct ParentView: View {
var body: some View {
VStack {
ChildView()
ChildView()
}
.onAppear {
print("Parent onAppear — birinci")
}
}
}
struct ChildView: View {
var body: some View {
Text("Uşaq")
.onAppear {
print("Child onAppear")
}
}
}
Konsol çıxışı belə olacaq: Parent onAppear — birinci, sonra iki dəfə Child onAppear yerləşmə sırası ilə. Bu davranış Apple tərəfindən təminat altınadır və SwiftUI-nin bütün versiyalarında (iOS 13–18) sabitdir.
.onAppear çağırılma ssenariləri konteyner və naviqasiyadan asılı olaraq dəyişir. NavigationStack-də onAppear hər yeni kontroller push edildikdə və pop zamanı — kök kontroller üçün işləyir. TabView-də şəbəkə dəyişməsi göstərilən şəbəkə üçün onAppear, gizli şəbəkə üçün onDisappear çağırır.
List və ScrollView-də onAppear görünmə sahəsinə düşən və ya əvvəlcədən render buferində olan hücrələr üçün çağırılır. iOS 18 sürüşdürmədən 2–3 ekran əvvəl hücrələr üçün onAppear çağıra bilən prefetch mexanizmi təqdim etdi — bu qavrayışı sürətləndirir, lakin artıq řəbəkə sorğularına səbəb ola bilər.
NavigationStack (iOS 16+) ekran yığınını NavigationView-dən fərqli idarə edir. Yeni ekran push edildikdə onAppear yalnız yeni ekranda işləyir, cari ekran isə real silinənə qədər onDisappear almır. Pop zamanı əks proses baş verir: tərk edilən ekranda onDisappear, qayıdılan ekranda onAppear.
| Ssenari | onAppear | onDisappear |
|---|---|---|
| Push | Yeni ekran | Xeyr (ekran yığında qalır) |
| Pop | Qayıdılan ekran | Tərk edilən ekran |
| Tab dəyişməsi | Yeni şəbəkə | Köhnə şəbəkə |
| Sheet bağlanması | Valideyn ekran | Açıq sheet |
Praktik tətbiq onAppear üç əsas kateqoriyanı əhatə edir: məlumat yüklənməsi, animasiyaların başladılması və analitikanın göndərilməsi. Hər bir ssenari SwiftUI həyat dövürü xüsusiyyətlərinin nəzərə alınmasını tələb edir ki, təkrarlanan çağırışlardan və yaddaş sızıntılarından qaçınılsın.
Məlumat yüklənməsi — onAppear üçün ən geniş yayılmış ssenari. Bağlama daxilində async çağırış üçün Task yaradılır və nəticə @State və ya @StateObject-də saxlanılır. Məlumatların təkrar yüklənmədiyini yoxlamaq üçün isLoading flagı və ya nil yoxlamasından istifadə etmək vacibdir.
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()
}
}
}
}
Guard against re-fetch — kritik praktika. SwiftUI View-i yenidən yaradarsa (məsələn, ekranın fırladılması zamanı), onAppear guard olmadan yenidən çağırılacaq. Alternativ əvvəlki sorğunu avtomatik ləğv edən .task modifikatorudur.
Giriş animasiyası withAnimation və ya animation modifikatoru vasitəsilə animasiyanı tetikləyən state dəyişənlərini dəyişmək üçün onAppear-dan istifadə edir. Tipik nümunə: başlanğıc vəziyyət (opacity 0, offset 100), görünmədə son vəziyyətə (opacity 1, offset 0) keçid.
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
}
}
}
}
Gecikmə 0.3 saniyə ekranda bir neçə belə kart olduqda ardıcıl görünmə effekti yaradır. Animasiya olunmuş elementlər siyahısı üçün element indeksini gecikmə çarpanı kimi istifadə edin.
.task — iOS 15-də əlavə edilmiş SwiftUI modifikatoru olub, onAppear-dakı asinxron əməliyyatlar problemini həll edir. onAppear-dan fərqli olaraq, .task async-bağlamı qəbul edir, onun həyat dövürünə avtomatik nəzarət edir və View yox olduqda onu ləğv edir. onAppear sinxron icra olunursa, .task asinxron əməliyyatı başladır və SwiftUI-yə onDisappear zamanı onu ləğv etməyə imkan verir.
Əsas fərq — ləğv idarəçiliyi. .task async əməliyyatı yaratdıqda, SwiftUI Task-a istinad saxlayır və View iyerarxiyadan silindikdə avtomatik cancel() çağırır. İçərisində Task {} olan onAppear başladılmış əməliyyatı ləğv etmir — o, View yox olduqdan sonra da icranı davam etdirir, bu da yarış vəziyyətinə və ya artıq boşaldılmış nümunəyə yazılmağa səbəb ola bilər.
| Xüsusiyyət | .onAppear | .task |
|---|---|---|
| iOS versiyası | iOS 13+ | iOS 15+ |
| Async dəstəyi | Yalnız Task {} vasitəsilə | Native async/await |
| Avtomatik ləğv | Xeyr | View yox olduqda |
| Təkrar çağırış | Hər görünmədə | Susmaya görə bir dəfə |
| Sinxron kod | Bəli | Yalnız async |
Modifikator seçimi: sinxron hərəkətlər (animasiyalar, analitika, loglar) üçün onAppear istifadə edin. Asinxron məlumat yüklənməsi (API, Core Data, fayl sistemi) üçün .task üstünlük təşkil edir — daha təhlükəsiz və təmizdir.
Səhv 1: View-in yenidən yaradılması səbəbindən çoxsaylı çağırış. SwiftUI View gövdəsini yenidən yaratdıqda (@State dəyişməsi, ekranın fırladılması), onAppear yenidən çağırıla bilər. Həll yolu — yükləmə flag-ı əlavə etmək və ya lazımsız təkrarların qarşısını almaq üçün .equatable() istifadə etməkdir. SwiftLee (2025) məlumatlarına görə, istehsalda SwiftUI səhvlərinin 40%-i məhz onAppear-ın təkrar çağırılmaları ilə bağlıdır.
Səhv 2: güclü istinad vasitəsilə yaddaş sızıntısı. Əgər onAppear bağlaması self-i zəif istinad olmadan tutarsa, View ilə retain cycle yaranır. SwiftUI View yox olduqda tutulan obyektlərin sıfırlanmasına zəmanət vermir. ViewModel və ya xidmətlər üçün capture list [weak self] istifadə edin.
Səhv 3: fon axınında icra. onAppear əsas axında icra olunur — bu UI əməliyyatları üçün düzgündür. Lakin onAppear daxilində Task işə salınırsa, @State yenilənməsinin MainActor.run vasitəsilə baş verdiyinə əmin olun. Swift 5.9 və daha yuxarı versiyalar avtomatik olaraq MainActor-a qayıdır, lakin @MainActor-ı açıqca göstərmək daha yaxşıdır.
Nümunə yükləmə flag-ı ilə təkrarlardan qorunmağın ən etibarlı yoludur. Flag-ı @State və ya @StateObject-də saxlayın və onu yalnız əl ilə yeniləmə zamanı sıfırlayın. Alternativ — onAppear əvəzinə .task istifadə etməkdir: .task susmaya görə yenidən çəkiliş zamanı yenidən başlamır, əgər async əməliyyat artıq icra olunursa.
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()
}
}
}
}
Tez-tez verilən suallar
viewDidLoad UIViewController-in ömrü boyu bir dəfə, görünmədən asılı olmayaraq çağırılır. .onAppear View hər dəfə iyerarxiyaya əlavə edildikdə çağırılır — View silinib yenidən əlavə edilərsə, onAppear yenidən işləyir. NavigationView-də viewDidLoad inisializasiya zamanı, onAppear isə hər ekran göstərilməsində çağırılır.
Bəli, Task { await asyncFunction() } örtüyücüsü vasitəsilə. Lakin async əməliyyatları üçün .task üstünlük təşkil edir, çünki o, avtomatik olaraq ləğv etməni idarə edir və əl ilə Task yaratmağı tələb etmir. .task həmçinin View yox olduqda ləğvə zəmanət verir, sızıntıların qarşısını alır.
Səbəb @State, @Published və ya əcdad konfiqurasiyasının dəyişməsi səbəbindən View gövdəsinin yenidən yaradılmasıdır. SwiftUI hər hansı müşahidə edilən xüsusiyyətin dəyişməsinə cavab olaraq View-i yenidən çəkə bilər. Bundan əlavə, LazyVStack və List görünən sahəyə yaxınlaşan hücrələr üçün onAppear çağırır və yuxarı sürüşdürmə zamanı təkrarlayır.
Bəli, .onAppear SwiftUI platformalarının hamısında mövcuddur: iOS 13+, watchOS 6+, tvOS 13+, macOS 10.15+. Davranış eynidir: modifikator View iyerarxiyaya əlavə edildikdə çağırılır. watchOS-da onAppear gözləmə vəziyyətindən tətbiqin aktivləşməsi zamanı işləyir, bu da dizaynda nəzərə alınmalıdır.
.onAppear parametr qəbul etmir — yalnız Void bağlaması. Parametrləri ötürmək üçün xarici dəyişənləri tutan bağlamadan istifadə edin. Alternativ yanaşma — ViewModifier və ya .onChange analoqu vasitəsilə parametrlərlə fərqliləşdirilmiş onAppear yaratmaqdır.
Yekun
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun