viewDidLoad in iOS: cos'è, scopo ed esempi di codice

Autore: IT Sectr Pubblicato: 2026-03-05 Tempo di lettura: 8 min

viewDidLoad è il primo metodo che UIKit chiama dopo aver caricato la View di UIViewController in memoria. Secondo Apple Developer Documentation, questo metodo viene chiamato esattamente una volta per tutta la durata del controller. viewDidLoad è il posto principale per la configurazione iniziale dell'interfaccia, la registrazione delle celle e l'inizializzazione dei dati.

Punti chiave

  • viewDidLoad viene chiamato una volta dopo il caricamento della View in memoria
  • super.viewDidLoad è obbligatorio — senza di esso il Lifecycle si rompe
  • In questo metodo si configura l’UI, si registrano le celle e si crea la data source
  • Non viene richiamato al ritorno sullo schermo — usa viewWillAppear
  • Adatto per operazioni una tantum e abbonamento a notifiche permanenti

Cos'è viewDidLoad

viewDidLoad è un metodo di istanza di UIViewController che UIKit chiama immediatamente dopo che la View del controller è stata caricata in memoria. A questo punto, tutte le proprietà IBOutlet sono già collegate agli elementi dell'interfaccia, ma la View non è stata ancora aggiunta alla gerarchia delle finestre e non è visibile all'utente. Lo sviluppatore sovrascrive questo metodo per eseguire la configurazione iniziale dello schermo.

Il metodo fa parte del ViewController Lifecycle e segue immediatamente loadView se la View viene creata programmaticamente, o dopo il caricamento dallo Storyboard. In un progetto tipico, viewDidLoad è il metodo più sovrascritto di UIViewController, poiché fornisce un punto sicuro per lavorare con le subview che già esistono e sono pronte per la configurazione.

Un dettaglio importante: al momento in cui viene chiamato viewDidLoad, le dimensioni della View non corrispondono ancora a quelle finali — Auto Layout non ha completato i suoi passaggi e il frame potrebbe differire dalle aspettative. Per i calcoli che dipendono dalle dimensioni, usa viewDidLayoutSubviews.

Quando viene chiamato viewDidLoad

La tempistica della chiamata a viewDidLoad dipende da come viene inizializzato il controller. Nella maggior parte dei casi, UIKit chiama questo metodo automaticamente la prima volta che si accede alla proprietà view del controller — questo si chiama meccanismo di lazy-loading di UIViewController.

Alla prima apparizione dello schermo

Quando un NavigationController o TabBarController mostra lo schermo per la prima volta, UIKit controlla se la View è caricata. Se non lo è — viene chiamato loadView (o caricamento dallo Storyboard), dopo di che viewDidLoad viene immediatamente attivato. Questo è lo scenario standard e si verifica una volta per ogni istanza del controller.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    print("View caricata — puoi configurare l'interfaccia")
    setupUI()
    configureTableView()
}

Al ritorno su uno schermo esistente

viewDidLoad non viene richiamato al ritorno sullo schermo tramite il pulsante indietro o dismiss. Se la tua logica dipende dalla ricomparsa dello schermo — inseriscila in viewWillAppear. Questo è uno degli errori concettuali più comuni: gli sviluppatori si aspettano che viewDidLoad si attivi ad ogni visualizzazione, ma UIKit lo chiama solo una volta.

In caso di forcedViewLoad

A volte gli sviluppatori accedono forzatamente alla view del controller per attivare il caricamento in anticipo: let _ = controller.view. Questo forza la chiamata di loadView e viewDidLoad prima che il controller appaia sullo schermo. Questa tecnica viene utilizzata quando è necessario preparare la View in anticipo per una transizione fluida.

Cosa fare in viewDidLoad

viewDidLoad è destinato a operazioni di configurazione una tantum che non dipendono dal fatto che lo schermo sia visibile. L'uso corretto di questo metodo è la chiave per un'architettura pulita e un comportamento prevedibile del controller.

Configurazione dei componenti UI

In viewDidLoad, si registrano i file nib e le classi per UITableView e UICollectionView, si configurano i delegate e si impostano i valori iniziali delle proprietà degli elementi UI. Poiché tutti gli IBOutlet sono già collegati a questo punto, è possibile accedere in sicurezza a label.text, imageView.image e ad altre proprietà delle subview.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(
        CustomCell.self,
        forCellReuseIdentifier: CustomCell.identifier
    )
    title = "Schermo principale"
}

Inizializzazione dei dati e abbonamenti

Qui si crea una viewModel, si inizializza la data source con array e ci si abbona alle notifiche che devono rimanere attive per tutta la durata del controller. Ad esempio, abbonarsi a UIApplication.willEnterForegroundNotification per aggiornare i dati al ritorno dallo sfondo è un buon candidato per viewDidLoad. La viewModel nell'architettura iOS moderna funge da ponte tra il controller e la logica di business, e inizializzarla in viewDidLoad garantisce che i dati siano pronti al momento della prima apparizione dello schermo.

Presta particolare attenzione alla configurazione della data source per tabelle e collezioni. Se la tua tabella usa UIFetchedResultsController o NSFetchedResultsController con Core Data, inizializza la fetch request e il delegate in viewDidLoad. Questo garantisce che quando lo schermo appare per la prima volta, la tabella sia già popolata con dati senza richieste aggiuntive.

Configurazione della navigazione

In viewDidLoad, si configurano i pulsanti della NavigationBar, si imposta il large title, si aggiunge lo search controller e si impostano i pulsanti edit/done. Questi elementi cambiano raramente quando lo schermo viene mostrato di nuovo, quindi inizializzarli qui è ottimale.

Cosa non fare in viewDidLoad

Non tutte le operazioni sono appropriate in viewDidLoad. Alcune azioni inserite in questo metodo portano a un consumo eccessivo di memoria, un comportamento errato o bug quando lo schermo viene mostrato di nuovo.

Evita di avviare richieste di rete il cui risultato influisce solo sull'UI. Se la richiesta viene completata prima che lo schermo appaia, l'utente non vedrà il risultato, e se viene completata dopo — i dati potrebbero essere obsoleti. Avvia il caricamento in viewDidLoad, ma aggiorna l'UI in viewWillAppear.

Non eseguire operazioni in viewDidLoad che dipendono dalle dimensioni e dalla posizione della View. Al momento della chiamata, Auto Layout non ha completato i suoi passaggi e il frame potrebbe non essere definitivo. Per i calcoli, usa viewDidLayoutSubviews o sovrascrivi updateViewConstraints.

Non abbonarti a notifiche che sono rilevanti solo quando lo schermo è visibile. Notifiche della tastiera, notifiche di modifica del contenuto da controller figli — abbonati in viewWillAppear e disiscriviti in viewDidDisappear per evitare chiamate inutili e perdite.

Non chiamare metodi che richiedono uno schermo visibile. Ad esempio, tentare di mostrare un UIAlertController da viewDidLoad causerà un errore perché la View del controller non è stata ancora aggiunta alla gerarchia delle finestre. Qualsiasi operazione UI che dipende dalla finestra o da presentedViewController dovrebbe essere eseguita solo dopo la comparsa dello schermo.

Non inizializzare risorse pesanti inutilmente. Se lo schermo viene mostrato raramente o i dati non vengono visualizzati immediatamente, rimanda la creazione di oggetti che consumano risorse fino a quando non sono effettivamente necessari. L'inizializzazione lazy delle proprietà in Swift è un meccanismo integrato per risolvere questo problema: una proprietà con il modificatore lazy verrà creata solo al primo accesso, risparmiando memoria e accelerando il caricamento dello schermo.

Non usare viewDidLoad per operazioni che dovrebbero essere eseguite ogni volta che lo schermo appare. Questo è l'errore più fondamentale: gli sviluppatori principianti spesso inseriscono la logica di aggiornamento dei dati in viewDidLoad e si sorprendono che al ritorno da un altro schermo, la tabella non si ricarichi. Se un'operazione deve ripetersi ad ogni visualizzazione — usa viewWillAppear. Se deve eseguirsi una volta per durata di vita — usa viewDidLoad. Ricorda questa semplice regola per evitare la maggior parte dei problemi con il ciclo di vita di UIViewController.

Esempi di codice con viewDidLoad

Vediamo tre esempi pratici che dimostrano l'uso corretto di viewDidLoad in progetti reali. Ogni esempio risolve un compito specifico di configurazione dello schermo.

Esempio 1: configurare una collezione con celle personalizzate

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()
}

Esempio 2: impostare i vincoli programmaticamente

swift
override func viewDidLoad() {
    super.viewDidLoad()
    let label = UILabel()
    label.text = "Ciao, mondo!"
    label.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(label)

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

Esempio 3: configurare lo stato vuoto e il caricatore

In viewDidLoad, si configurano anche gli elementi visualizzati quando non ci sono dati: stato vuoto, caricatore, placeholder. Questi componenti vengono creati una volta e riutilizzati ogni volta che lo schermo appare. Nascondere o mostrare questi elementi viene gestito in viewWillAppear in base ai dati correnti.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    emptyStateLabel = UILabel()
    emptyStateLabel.text = "Nessun dato"
    emptyStateLabel.textAlignment = .center
    emptyStateLabel.isHidden = true
    view.addSubview(emptyStateLabel)

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

Esempio 4: abbonarsi alle notifiche dell'applicazione

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

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

Domande frequenti

viewDidLoad può essere chiamato più di una volta?

In condizioni normali, no — UIKit chiama viewDidLoad una volta dopo aver caricato la View in memoria. Se il controller viene distrutto e ricreato, viewDidLoad verrà eseguito per la nuova istanza.

Devo chiamare super.viewDidLoad?

Sì, assolutamente. Chiamare super.viewDidLoad garantisce che UIKit esegua la configurazione interna necessaria per il corretto funzionamento del Lifecycle. Chiama sempre super all'inizio del metodo.

Qual è la differenza tra viewDidLoad e viewWillAppear?

viewDidLoad viene chiamato una volta al caricamento della View. viewWillAppear viene chiamato ogni volta prima che lo schermo appaia. Il primo è per la configurazione una tantum, il secondo per aggiornare dati e stato.

Posso eseguire operazioni pesanti in viewDidLoad?

Le operazioni sincrone pesanti in viewDidLoad bloccano il thread principale e ritardano la comparsa dello schermo. I caricamenti asincroni sono accettabili, ma nell'aggiornare l'UI al completamento bisogna considerare che lo schermo potrebbe essere già nascosto.

Come forzare la chiamata di viewDidLoad?

Non puoi chiamare viewDidLoad direttamente — UIKit lo chiama. Per forzare il caricamento della View, accedi alla proprietà controller.view. Questo attiverà automaticamente loadView e viewDidLoad.

Riepilogo

  • viewDidLoad è un metodo di configurazione una tantum di UIViewController chiamato dopo il caricamento della View in memoria
  • Chiamato una volta durante la vita del controller al primo accesso alla View
  • Adatto per registrazione di celle, configurazione delegate, inizializzazione viewModel
  • Chiama sempre super.viewDidLoad per il corretto funzionamento del Lifecycle
  • Non usare viewDidLoad per operazioni che dipendono dalle dimensioni della View
  • Per aggiornare i dati ad ogni comparsa, usa viewWillAppear
  • Abbonarsi a notifiche permanenti è appropriato, a temporanee — in viewWillAppear

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche