Middle
Μίλησέ μου για τους κύκλους ζωής του ελεγκτή και πώς καλούνται.
sobes.tech AI
Απάντηση από AI
Ο κύκλος ζωής του UIViewController περιλαμβάνει μεθόδους που καλούνται σε συγκεκριμένες στιγμές της ύπαρξής του: από τη δημιουργία μέχρι την καταστροφή.
Βασικές μέθοδοι κύκλου ζωής:
-
viewDidLoad():- Καλείται μετά τη φόρτωση της προβολής του ελεγκτή στη μνήμη, αλλά πριν από την εμφάνισή της στην οθόνη.
- Χρησιμοποιείται για την αρχικοποίηση δεδομένων, τη ρύθμιση στοιχείων UI που δεν εξαρτώνται από τη γεωμετρία της προβολής.
- Καλείται μόνο μία φορά κατά τη διάρκεια ζωής του ελεγκτή.
-
viewWillAppear(_ animated: Bool):- Καλείται ακριβώς πριν εμφανιστεί η προβολή του ελεγκτή στην οθόνη.
- Χρησιμοποιείται για εργασίες που πρέπει να εκτελούνται κάθε φορά που η προβολή γίνεται ορατή (π.χ. ενημέρωση δεδομένων, animations).
- Μπορεί να καλείται πολλές φορές.
-
viewDidAppear(_ animated: Bool):- Καλείται αφού η προβολή του ελεγκτή εμφανιστεί πλήρως στην οθόνη και γίνει ορατή στον χρήστη.
- Κατάλληλο για την εκκίνηση animations ή άλλων εργασιών που απαιτούν η προβολή να είναι πλήρως έτοιμη.
- Μπορεί να καλείται πολλές φορές.
-
viewWillDisappear(_ animated: Bool):- Καλείται ακριβώς πριν η προβολή του ελεγκτή αφαιρεθεί από την οθόνη (π.χ. κατά μετάβαση σε άλλη οθόνη).
- Χρησιμοποιείται για την αποθήκευση κατάστασης ή το σταμάτημα εργασιών που δεν πρέπει να εκτελούνται όσο η προβολή δεν είναι ορατή (π.χ. διακοπή timers).
- Μπορεί να καλείται πολλές φορές.
-
viewDidDisappear(_ animated: Bool):- Καλείται αφού η προβολή του ελεγκτή αφαιρεθεί πλήρως από την οθόνη.
- Χρησιμοποιείται για τον καθαρισμό πόρων ή το σταμάτημα εργασιών που δεν χρειάζονται πλέον όταν η προβολή δεν είναι ορατή.
- Μπορεί να καλείται πολλές φορές.
-
viewWillLayoutSubviews():- Καλείται πριν ο ελεγκτής αρχίσει να τοποθετεί τα υπο-προβολές του.
- Χρησιμοποιείται για την τροποποίηση constraints ή frames πριν από την αυτόματη διάταξη.
- Μπορεί να καλείται πολλές φορές.
-
viewDidLayoutSubviews():- Καλείται αφού ο ελεγκτής ολοκληρώσει την τοποθέτηση των υπο-προβολών.
- Χρησιμοποιείται για εργασίες που εξαρτώνται από τα τελικά μεγέθη των υπο-προβολών (π.χ. ρύθμιση scroll indicators ή σκιάδων).
- Μπορεί να καλείται πολλές φορές.
-
didReceiveMemoryWarning():- Καλείται σε περίπτωση χαμηλού επιπέδου μνήμης.
- Χρησιμοποιείται για την απελευθέρωση πόρων που μπορούν να ξαναδημιουργηθούν αργότερα.
-
deinit:- Καλείται ακριβώς πριν καταστραφεί και ελευθερωθεί από τη μνήμη το αντικείμενο
UIViewController. - Χρησιμοποιείται για την εκτέλεση τελικού καθαρισμού, π.χ. διαγραφή παρατηρητών ή κλείσιμο δικτυακών συνδέσεων.
- Καλείται ακριβώς πριν καταστραφεί και ελευθερωθεί από τη μνήμη το αντικείμενο
Σειρά κλήσεων:
Τυπική σειρά κλήσεων μεθόδων κατά την εμφάνιση του ελεγκτή:
viewDidLoad()viewWillAppear(_ animated: Bool)viewWillLayoutSubviews()viewDidLayoutSubviews()viewDidAppear(_ animated: Bool)
Τυπική σειρά κλήσεων μεθόδων κατά την εξαφάνιση του ελεγκτή:
viewWillDisappear(_ animated: Bool)viewDidDisappear(_ animated: Bool)deinit(εάν ο ελεγκτής δεν χρειάζεται πλέον)
Παράδειγμα υλοποίησης:
import UIKit
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Ρύθμιση UI, αρχικοποίηση δεδομένων
print("viewDidLoad")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Ενημέρωση UI πριν από την εμφάνιση
print("viewWillAppear")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Η εμφάνιση ολοκληρώθηκε, εκκίνηση animations
print("viewDidAppear")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Προετοιμασία για εξαφάνιση, αποθήκευση κατάστασης
print("viewWillDisappear")
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// Η εξαφάνιση ολοκληρώθηκε, καθαρισμός
print("viewDidDisappear")
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
// Πριν από το auto layout
print("viewWillLayoutSubviews")
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Μετά το auto layout
print("viewDidLayoutSubviews")
}
deinit {
// Καθαρισμός πόρων
print("deinit")
}
}