.onAppear: işləmə prinsipi, həyat dövürü və SwiftUI-də nümunələr

Müəllif: IT Sectr Dərc olunub: 2026-06-26 Oxuma vaxtı: 10 dəq

.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 — View ekranda göründükdə kod icrası üçün SwiftUI modifikatoru.
  • Bir dəfəlik — onAppear View həyat dövüründə bir dəfə çağırılır, əgər yaddaşda qalırsa.
  • Məlumat yüklənməsi — onAppear əsas ssenarisi: API-dən fetch, Core Data və ya UserDefaults-dan oxuma.
  • Animasiyalar — onAppear giriş animasiyalarını işə salır: opacity, scale, offset gecikmə ilə.
  • Analitika — onAppear vasitəsilə screen view, impression, page open hadisələri göndərilir.

.onAppear nədir?

.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.

onAppear sintaksisi

Ə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.

swift
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 View həyat dövüründə necə işləyir

.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.

onAppear çağırış sırası

Ç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.

swift
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 nə vaxt çağırılır

.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.

ListScrollView-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-də çağırılma xüsusiyyətləri

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.

SsenarionAppearonDisappear
PushYeni ekranXeyr (ekran yığında qalır)
PopQayıdılan ekranTərk edilən ekran
Tab dəyişməsiYeni şəbəkəKöhnə şəbəkə
Sheet bağlanmasıValideyn ekranAçıq sheet

.onAppear istifadə nümunələri

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.

API-dən məlumat yüklənməsi

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.

swift
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ının başladılması

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.

swift
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.

.onAppear vs .task — fərq nədir

.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əyiYalnız Task {} vasitəsiləNative async/await
Avtomatik ləğvXeyrView yox olduqda
Təkrar çağırışHər görünmədəSusmaya görə bir dəfə
Sinxron kodBəliYalnı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.

.onAppear ilə tipik səhvlər

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.

Təkrar çağırışlardan necə qaçınmaq olar

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.

swift
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

.onAppear UIKit-dəki viewDidLoad-dan nə ilə fərqlənir?

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.

.onAppear daxilində async funksiyasını çağırmaq olarmı?

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.

Nüə .onAppear bir neçə dəfə çağırılı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.

.onAppear watchOS və tvOS-da işləyirmi?

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-a parametrləri necə ötürmək olar?

.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

  • .onAppear — View interfeys iyerarxiyasına əlavə edildikdə kod icrası üçün SwiftUI modifikatoru.
  • Bir dəfəlik çağırış — onAppear View nümunəsi üçün bir dəfə çağırılır, əgər yaddaşda qalırsa.
  • Parent-first sırası — valideyn View-lər onAppear-ı uşaqlardan əvvəl alır.
  • Əsas ssenarilər — məlumat yüklənməsi, animasiyaların başladılması, analitikanın göndərilməsi.
  • .task üstünlük təşkil edir async əməliyyatlar üçün View yox olduqda avtomatik ləğv etməyə görə.
  • Guard yoxlaması — View yenidən çəkilməsi zamanı təkrar çağırışlardan qorunmaq üçün məcburidir.

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.

Layihəni müzakirə et

Həm də oxuyun