viewDidLoad στο iOS: τι είναι, σκοπός και παραδείγματα κώδικα

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-03-05 Χρόνος ανάγνωσης: 8 λεπ

viewDidLoad — είναι η πρώτη μέθοδος που καλεί το UIKit αφού φορτωθεί το View του UIViewController στη μνήμη. Σύμφωνα με το Apple Developer Documentation, αυτή η μέθοδος καλείται ακριβώς μία φορά κατά τη διάρκεια ζωής του ελεγκτή. viewDidLoad είναι το κύριο σημείο για την αρχική ρύθμιση της διεπαφής, την καταχώριση κελιών και την αρχικοποίηση δεδομένων.

Κύρια σημεία

  • viewDidLoad καλείται μία φορά μετά τη φόρτωση του View στη μνήμη
  • super.viewDidLoad είναι υποχρεωτικό — χωρίς αυτό ο Lifecycle χαλάει
  • Σε αυτήν τη μέθοδο ρυθμίζεται το UI, καταχωρούνται κελιά και δημιουργείται το data source
  • Δεν καλείται ξανά κατά την επιστροφή στην οθόνη — χρησιμοποιήστε το viewWillAppear
  • Κατάλληλο για εφάπαξ λειτουργίες και εγγραφή σε μόνιμες ειδοποιήσεις

Τι είναι το viewDidLoad

viewDidLoad — είναι μια μέθοδος στιγμιοτύπου του UIViewController που καλεί το UIKit αμέσως μετά τη φόρτωση του View του ελεγκτή στη μνήμη RAM. Αυτή τη στιγμή, όλες οι ιδιότητες IBOutlet είναι ήδη συνδεδεμένες με τα στοιχεία της διεπαφής, αλλά το View δεν έχει προστεθεί ακόμη στην ιεραρχία παραθύρων και δεν είναι ορατό στον χρήστη. Ο προγραμματιστής παρακάμπτει αυτήν τη μέθοδο για να εκτελέσει την αρχική ρύθμιση της οθόνης.

Η μέθοδος αποτελεί μέρος του ViewController Lifecycle και ακολουθεί αμέσως μετά το loadView, εάν το View δημιουργείται προγραμματιστικά, ή μετά τη φόρτωση από το Storyboard. Σε ένα τυπικό έργο, το viewDidLoad είναι η πιο συχνά παρακαμπτόμενη μέθοδος του UIViewController, καθώς παρέχει ένα ασφαλές σημείο για εργασία με subviews που ήδη υπάρχουν και είναι έτοιμα για ρύθμιση.

Μια σημαντική λεπτομέρεια: τη στιγμή της κλήσης του viewDidLoad, οι διαστάσεις του View δεν αντιστοιχούν ακόμη στις τελικές — το Auto Layout δεν έχει ολοκληρώσει τα περάσματα και το frame μπορεί να διαφέρει από το αναμενόμενο. Για υπολογισμούς που εξαρτώνται από διαστάσεις χρησιμοποιείται το viewDidLayoutSubviews.

Πότε καλείται το viewDidLoad

Ο χρόνος κλήσης του viewDidLoad εξαρτάται από το πώς αρχικοποιείται ο ελεγκτής. Στις περισσότερες περιπτώσεις, το UIKit καλεί αυτόματα αυτήν τη μέθοδο κατά την πρώτη πρόσβαση στην ιδιότητα view του ελεγκτή — αυτό ονομάζεται μηχανισμός lazy-loading του UIViewController.

Κατά το πρώτο άνοιγμα της οθόνης

Όταν το NavigationController ή το TabBarController εμφανίζει για πρώτη φορά την οθόνη σας, το UIKit ελέγχει εάν το View έχει φορτωθεί. Εάν όχι — καλείται το loadView (ή φόρτωση από το Storyboard), μετά το οποίο ενεργοποιείται αμέσως το viewDidLoad. Αυτό είναι το τυπικό σενάριο και συμβαίνει μία φορά για κάθε στιγμιότυπο του ελεγκτή.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    print("Το View φορτώθηκε — η διεπαφή μπορεί να ρυθμιστεί")
    setupUI()
    configureTableView()
}

Κατά την επιστροφή σε υπάρχουσα οθόνη

Το viewDidLoad δεν καλείται ξανά κατά την επιστροφή στην οθόνη μέσω back button ή dismiss. Εάν η λογική σας εξαρτάται από την εκ νέου εμφάνιση της οθόνης — τοποθετήστε την στο viewWillAppear. Αυτό είναι ένα από τα πιο συνηθισμένα εννοιολογικά λάθη: οι προγραμματιστές περιμένουν ότι το viewDidLoad θα ενεργοποιείται σε κάθε εμφάνιση, αλλά το UIKit το καλεί μόνο μία φορά.

Στο forcedViewLoad

Μερικές φορές οι προγραμματιστές εξαναγκάζουν την κλήση του view του ελεγκτή για να ξεκινήσουν τη φόρτωση εκ των προτέρων: let _ = controller.view. Αυτό εξαναγκάζει την κλήση του loadView και του viewDidLoad πριν εμφανιστεί ο ελεγκτής στην οθόνη. Αυτό το κόλπο χρησιμοποιείται όταν πρέπει να προετοιμαστεί το View εκ των προτέρων για ομαλή μετάβαση.

Τι κάνουν στο viewDidLoad

viewDidLoad προορίζεται για εφάπαξ λειτουργίες ρύθμισης που δεν εξαρτώνται από το εάν η οθόνη είναι ορατή. Η σωστή χρήση αυτής της μεθόδου είναι το κλειδί για καθαρή αρχιτεκτονική και προβλέψιμη συμπεριφορά του ελεγκτή.

Ρύθμιση στοιχείων UI

Στο viewDidLoad καταχωρούνται αρχεία nib και κλάσεις για UITableView και UICollectionView, ρυθμίζονται οι εκπρόσωποι και ορίζονται αρχικές τιμές ιδιοτήτων στοιχείων UI. Επειδή όλα τα IBOutlet είναι ήδη συνδεδεμένα αυτή τη στιγμή, μπορεί κανείς να έχει ασφαλή πρόσβαση σε label.text, imageView.image και άλλες ιδιότητες subviews.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(
        CustomCell.self,
        forCellReuseIdentifier: CustomCell.identifier
    )
    title = "Κύρια οθόνη"
}

Αρχικοποίηση δεδομένων και εγγραφές

Εδώ δημιουργείται το viewModel, αρχικοποιείται το data source με πίνακες και γίνεται εγγραφή σε ειδοποιήσεις που πρέπει να λειτουργούν καθ' όλη τη διάρκεια ζωής του ελεγκτή. Για παράδειγμα, η εγγραφή στο UIApplication.willEnterForegroundNotification για ενημέρωση δεδομένων κατά την επιστροφή από το παρασκήνιο — κατάλληλος υποψήφιος για το viewDidLoad. Το ViewModel στη σύγχρονη αρχιτεκτονική iOS λειτουργεί ως συνδετικός κρίκος μεταξύ του ελεγκτή και της επιχειρηματικής λογικής, και η αρχικοποίησή του ακριβώς στο viewDidLoad εξασφαλίζει την ετοιμότητα των δεδομένων τη στιγμή της πρώτης εμφάνισης της οθόνης.

Δώστε ιδιαίτερη προσοχή στη ρύθμιση του data source για πίνακες και συλλογές. Εάν ο πίνακάς σας χρησιμοποιεί UIFetchedResultsController ή NSFetchedResultsController με Core Data, αρχικοποιήστε το fetch request και τον εκπρόσωπο στο viewDidLoad. Αυτό εγγυάται ότι κατά την πρώτη εμφάνιση της οθόνης, ο πίνακας θα είναι ήδη γεμάτος με δεδομένα χωρίς πρόσθετα ερωτήματα.

Ρύθμιση πλοήγησης

Στο viewDidLoad ρυθμίζονται τα κουμπιά NavigationBar, ορίζεται το large title, προστίθεται το search controller και ορίζονται τα κουμπιά edit/done. Αυτά τα στοιχεία σπάνια αλλάζουν κατά την επαναλαμβανόμενη εμφάνιση της οθόνης, επομένως η αρχικοποίησή τους εδώ είναι βέλτιστη.

Τι δεν πρέπει να κάνετε στο viewDidLoad

Δεν είναι όλες οι λειτουργίες κατάλληλες στο viewDidLoad. Ορισμένες ενέργειες που τοποθετούνται σε αυτήν τη μέθοδο οδηγούν σε υπερβολική κατανάλωση μνήμης, εσφαλμένη συμπεριφορά ή σφάλματα κατά την εκ νέου εμφάνιση της οθόνης.

Αποφύγετε την εκκίνηση αιτημάτων δικτύου των οποίων το αποτέλεσμα επηρεάζει μόνο το UI. Εάν το αίτημα ολοκληρωθεί πριν από την εμφάνιση της οθόνης, ο χρήστης δεν θα δει το αποτέλεσμα, και εάν μετά — τα δεδομένα μπορεί να είναι παρωχημένα. Ξεκινήστε τη φόρτωση στο viewDidLoad, αλλά ενημερώστε το UI στο viewWillAppear.

Μην εκτελείτε στο viewDidLoad λειτουργίες που εξαρτώνται από τις διαστάσεις και τη θέση του View. Τη στιγμή της κλήσης, το Auto Layout δεν έχει ολοκληρώσει τα περάσματα και το frame μπορεί να μην είναι τελικό. Για υπολογισμούς χρησιμοποιήστε το viewDidLayoutSubviews ή παρακάμψτε το updateViewConstraints.

Μην εγγράφεστε σε ειδοποιήσεις που λειτουργούν μόνο όταν η οθόνη είναι ορατή. Ειδοποιήσεις πληκτρολογίου, ειδοποιήσεις αλλαγής περιεχομένου θυγατρικών ελεγκτών — εγγραφείτε σε αυτές στο viewWillAppear και ακυρώστε την εγγραφή στο viewDidDisappear για να αποφύγετε περιττές κλήσεις και διαρροές μνήμης.

Μην καλείτε μεθόδους που απαιτούν ορατή οθόνη. Για παράδειγμα, η προσπάθεια εμφάνισης του UIAlertController από το viewDidLoad θα προκαλέσει σφάλμα, επειδή το View του ελεγκτή δεν έχει προστεθεί ακόμη στην ιεραρχία παραθύρων. Όλες οι λειτουργίες UI που εξαρτώνται από το window ή το presentedViewController πρέπει να εκτελούνται μόνο μετά την εμφάνιση της οθόνης.

Μην αρχικοποιείτε βαριούς πόρους χωρίς ανάγκη. Εάν η οθόνη ανοίγει σπάνια ή τα δεδομένα δεν εμφανίζονται αμέσως, αναβάλετε τη δημιουργία αντικειμένων που απαιτούν πόρους μέχρι τη στιγμή που χρειάζονται πραγματικά. Η τεμπέλικη (lazy) αρχικοποίηση ιδιοτήτων στη Swift είναι ένας ενσωματωμένος μηχανισμός για την επίλυση αυτού του προβλήματος: μια ιδιότητα με τον τροποποιητή lazy θα δημιουργηθεί μόνο κατά την πρώτη πρόσβαση, εξοικονομώντας μνήμη και επιταχύνοντας τη φόρτωση της οθόνης.

Μην χρησιμοποιείτε το viewDidLoad για λειτουργίες που πρέπει να εκτελούνται σε κάθε εμφάνιση της οθόνης. Αυτό είναι το πιο θεμελιώδες λάθος: οι αρχάριοι προγραμματιστές συχνά τοποθετούν τη λογική ενημέρωσης δεδομένων στο viewDidLoad και απορούν που κατά την επιστροφή από άλλη οθόνη ο πίνακας δεν επαναφορτώνεται. Εάν η λειτουργία πρέπει να επαναλαμβάνεται σε κάθε εμφάνιση — χρησιμοποιήστε το viewWillAppear. Εάν πρέπει να εκτελεστεί μία φορά κατά τη διάρκεια ζωής — viewDidLoad. Θυμηθείτε αυτόν τον απλό κανόνα για να αποφύγετε τα περισσότερα προβλήματα με τον κύκλο ζωής του UIViewController.

Παραδείγματα κώδικα με viewDidLoad

Ας εξετάσουμε τρία πρακτικά παραδείγματα που δείχνουν τη σωστή χρήση του viewDidLoad σε πραγματικά έργα. Κάθε παράδειγμα λύνει μια συγκεκριμένη εργασία ρύθμισης οθόνης.

Παράδειγμα 1: ρύθμιση συλλογής με προσαρμοσμένα κελιά

swift
override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.register(
        PhotoCell.self,
        forCellWithReuseIdentifier: PhotoCell.reuseId
    )
    collectionView.register(
        HeaderView.self,
        forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader,
        withReuseIdentifier: HeaderView.reuseId
    )
    viewModel.delegate = self
    viewModel.fetchInitialPage()
}

Παράδειγμα 2: προγραμματική ρύθμιση περιορισμών

swift
override func viewDidLoad() {
    super.viewDidLoad()
    let label = UILabel()
    label.text = "Γεια, κόσμε!"
    label.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(label)

    NSLayoutConstraint.activate([
        label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
    ])
}

Παράδειγμα 3: ρύθμιση κενής κατάστασης και φορτωτή

Στο viewDidLoad ρυθμίζονται επίσης στοιχεία που εμφανίζονται όταν δεν υπάρχουν δεδομένα: κενή κατάσταση, φορτωτής, placeholder. Αυτά τα στοιχεία δημιουργούνται μία φορά και επαναχρησιμοποιούνται σε κάθε εμφάνιση της οθόνης. Η απόκρυψη ή εμφάνιση αυτών των στοιχείων ελέγχεται στο viewWillAppear ανάλογα με τα τρέχοντα δεδομένα.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    emptyStateLabel = UILabel()
    emptyStateLabel.text = "Δεν υπάρχουν δεδομένα"
    emptyStateLabel.textAlignment = .center
    emptyStateLabel.isHidden = true
    view.addSubview(emptyStateLabel)

    activityIndicator = UIActivityIndicatorView(style: .medium)
    activityIndicator.hidesWhenStopped = true
    view.addSubview(activityIndicator)
}

Παράδειγμα 4: εγγραφή σε ειδοποιήσεις εφαρμογής

swift
override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(handleEnterForeground),
        name: UIApplication.willEnterForegroundNotification,
        object: nil
    )
}

@objc private func handleEnterForeground() {
    refreshContent()
}

Συχνές Ερωτήσεις

Μπορεί το viewDidLoad να κληθεί περισσότερες από μία φορές;

Υπό κανονικές συνθήκες όχι — το UIKit καλεί το viewDidLoad μία φορά μετά τη φόρτωση του View στη μνήμη. Εάν ο ελεγκτής καταστραφεί και δημιουργηθεί ξανά, το viewDidLoad θα λειτουργήσει για το νέο στιγμιότυπο.

Πρέπει να καλείται το super.viewDidLoad;

Ναι, υποχρεωτικά. Η κλήση του super.viewDidLoad εγγυάται ότι το UIKit θα εκτελέσει την εσωτερική ρύθμιση που είναι απαραίτητη για τη σωστή λειτουργία του Lifecycle. Πάντα καλείτε το super ως πρώτο πράγμα στη μέθοδο.

Ποια είναι η διαφορά μεταξύ viewDidLoad και viewWillAppear;

viewDidLoad καλείται μία φορά κατά τη φόρτωση του View. viewWillAppear καλείται κάθε φορά πριν από την εμφάνιση της οθόνης. Το πρώτο — για εφάπαξ ρύθμιση, το δεύτερο — για ενημέρωση δεδομένων και κατάστασης.

Μπορούν να γίνουν βαριές λειτουργίες στο viewDidLoad;

Οι βαριές σύγχρονες λειτουργίες στο viewDidLoad μπλοκάρουν το main thread και καθυστερούν την εμφάνιση της οθόνης. Οι ασύγχρονες φορτώσεις επιτρέπονται, αλλά κατά την ενημέρωση του UI μετά την ολοκλήρωσή τους πρέπει να λαμβάνεται υπόψη ότι η οθόνη μπορεί να είναι ήδη κρυμμένη.

Πώς να εξαναγκάσετε την κλήση του viewDidLoad;

Απευθείας δεν μπορεί να κληθεί το viewDidLoad — το καλεί το UIKit. Για να εξαναγκάσετε τη φόρτωση του View, αποκτήστε πρόσβαση στην ιδιότητα controller.view. Αυτό θα ενεργοποιήσει αυτόματα το loadView και το viewDidLoad.

Σύνοψη

  • viewDidLoad — μέθοδος εφάπαξ ρύθμισης του UIViewController μετά τη φόρτωση του View στη μνήμη
  • Καλείται μία φορά κατά τη διάρκεια ζωής του ελεγκτή κατά την πρώτη πρόσβαση στο View
  • Κατάλληλο για καταχώριση κελιών, ρύθμιση εκπροσώπων, αρχικοποίηση viewModel
  • Πάντα καλείτε το super.viewDidLoad για σωστή λειτουργία του Lifecycle
  • Μην χρησιμοποιείτε το viewDidLoad για λειτουργίες που εξαρτώνται από διαστάσεις του View
  • Για ενημέρωση δεδομένων σε κάθε εμφάνιση χρησιμοποιήστε το viewWillAppear
  • Εγγραφή σε μόνιμες ειδοποιήσεις — κατάλληλη, προσωρινές — στο viewWillAppear

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης