Skip to content
  • Home
  • Code
  • iOS & Swift
  • Combine
  • RxSwift
  • SwiftUI
  • Flutter & Dart
  • Tutorials
  • Art
  • Blog
Fx Studio
  • Home
  • Code
  • iOS & Swift
  • Combine
  • RxSwift
  • SwiftUI
  • Flutter & Dart
  • Tutorials
  • Art
  • Blog
Written by chuotfx on November 5, 2019

Basic iOS tutorial : ViewController life cycle

iOS & Swift

Contents

  • Chuẩn bị
  • 1. ViewController
    • 1.1. Định nghĩa
    • 1.2. Nhiệm vụ
  • 2. Life cycle
    • 2.1. init()
    • 2.2 loadview()
    • 2.3. viewDidLoad()
    • 2.4. viewDidUnload()
    • 2.5. viewWillAppear()
    • 2.6. viewDidAppear()
    • 2.7. viewWillDisappear()
    • 2.8. viewDidDisappear()
    • 2.8. deinit()
    • 2.9. didReceiveMemoryWarning()
  • 3. Demo
  • Tạm kết

Chào bạn đã quay lại với seri Lập trình iOS cho mọi người. Bài viết lần này sẽ chỉ nói về 1 vấn đề đơn giản thôi. Đó là vòng đời của một UIViewController. Nếu bạn chưa theo dõi các bài viết khác thì có thể ghé qua link sau:

    • https://fxstudio.dev/tag/basic-ios-tutorial/

Bắt đầu thôi!

Chuẩn bị

  • MacOS 10.14.4
  • Xcode 11.0
  • Swift 5.1

1. ViewController

1.1. Định nghĩa

An object that manages a view hierarchy for your UIKit app.

Theo Apple.
Định nghĩa theo dân gian thì UIViewController hay ViewController chính là một màn hình trong ứng dụng iOS của bạn.
Theo dân gian truyền miệng.
Kết hợp 2 định nghĩa trên thì chúng ta có thể nôm na về ViewController như sau:
  • Đại diện cho 1 màn hình của ứng dụng.
  • Ứng dụng có rất nhiều màn hình nên sẽ có rất nhiều ViewController được tạo ra
  • UIViewController là class cơ bản và có nhiều loại ViewController khác, như: UITableviewController, UITabbarController, UINavigationController…
  • Nó là nơi chứa và quản lý các view.

Tóm tắt:

View + Controller    =    ViewController

1.2. Nhiệm vụ

    1. Quản lý view, bao gồm hiển thị và nội dung.
    2. Phản ứng lại với các tác động của người dùng lên view.
Chúng ta có thể thấy 2 nhiệm vụ này trong bài trước. Đó chính là:
  • IBOutlet
  • IBAction

Ngoài ra, thì nhiệm vụ của ViewController còn phức tạp hơn nữa. Nhưng mình sẽ giải thích ở các bài viết nâng cao hơn. Giờ thì bạn có thể xem qua các nhóm nhiệm vụ chính của nó như sau:

  • View Management
  • Data Marshaling
  • User Interactions
  • Resource Management
  • Adaptivity

2. Life cycle

2.1. init()

Là function cội nguồn của mọi class trong Swift. Nên nó hiển nhiên là sẽ chạy đầu tiên. Tuy nhiên, bạn cũng không cần quan tâm nhiều lắm vì 99.99% là chúng ta không đụng tới function này.

2.2 loadview()

Khi bạn là dev cá tính, thích code chay và không sử dụng kéo thảo giao diện. Đồng nghĩa là UIViewController của bạn được tạo ra mà không dùng tới bất kì Storyboard hay file *.xib nào cả. Thì function loadView sẽ là function chạy đầu tiên (không tính hàm  init trên) thực thi.

Nhiệm vụ của nó là bạn hãy tạo ra 1 view cho ViewController của bạn. Tất nhiên, view đó sẽ phải có frame. Sau đó, việc còn lại của bạn sẽ là code chay giao diện. Bạn có thể tham khảo code sau:

import UIKit

class HomeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func loadView() {
        let view = UIView(frame: UIScreen.main.bounds)
        view.backgroundColor = .white
        
        self.view = view
    }
}

 

2.3. viewDidLoad()

Sau khi chạy loadView xong thì function viewDidLoad sẽ chạy. Hoặc nếu bạn sử dụng Storyboard hay *.xib thì nó sẽ được chạy đầu tiên. Một số lưu ý như sau:

  • Khi ViewController đã được nạp vào bộ nhớ ( điều kiện là cái ViewController này chưa tồn tại trong bộ nhớ), thì hàm viewDidLoad được gọi.
  • Chỉ được gọi một lần duy nhất trong chu kỳ sống của view đó thôi.
  • Thường dùng để chuẩn bị data hoặc là khởi tạo các giá trị mặc định cho các object cũng như UI trên màn hình.

2.4. viewDidUnload()

Đây là thế lực đối nghịch với function viewDidLoad.

  • Khi app của bạn nhận được cảnh báo từ hệ thống về trạng thái bộ nhớ đang gần hết thì hàm này sẽ được gọi
  • Tại hàm này sẽ giải phóng bớt các property không cần dùng, gán nil chúng để giải phóng bộ nhớ.

Nó đã được khai tử từ thời iOS 6.0. Nên giờ không thể gọi được trong code. Tuy nhiên, nó sử dụng ở low level.

2.5. viewWillAppear()

Trước mỗi lần ViewController bạn xuất hiện thì nó sẽ được gọi. Và nó sẽ được gọi nhiều lần nếu ViewController của bạn cứ ẩn hiện liên tục hay nhiều lần. Ví dụ cho các kiểu xuất hiện:

  • Là root của 1 cái gì đó, như: window
  • Được push từ navigation vào
  • App từ background được bật lên lại
  • Đang sử dụng thì kéo các Notification Center hay Control Center và ẩn tụi nó đi
  • …

Công dụng:

  • Biết trước được sự xuất hiện của View Controller
  • Chuẩn bị dữ liệu cho ViewController hay custom để làm cho ứng dụng mượt mà hơn

2.6. viewDidAppear()

Sau mỗi lần ViewController xuất hiện. Nó với viewWillAppear là một cặp đôi. Giúp bạn xác định đước ViewController đã xuất hiện xong rồi. Mục đích làm gì thì tuỳ ý bạn quyết.

2.7. viewWillDisappear()

Function sẽ được gọi khi ViewController sắp bị ẩn đi/ mất đi/ bị ViewController khác đè …. Ý nghĩa và mục đích sử dụng thì cũng khác tương tự 2 bạn ở trên

2.8. viewDidDisappear()

Khi ViewController đã mất đi thì function này sẽ được gọi. Nó với viewWillDisappear là một cặp đôi. Còn lại thì tương tự 3 đồng chí ở trên.

2.8. deinit()

Bí lắm mới sử dụng function này, nó sẽ được gọi khi ViewController bị remove khỏi bộ nhớ. Công việc của mình sẽ là dọn dẹp bộ nhớ ở đây. Tuy nhiên, với nền tảng iOS hiện tại thì tất cả được thiết kế theo ARC rồi, do đó bạn không cần bận tâm nhiều về việc giải phóng bộ nhớ.

2.9. didReceiveMemoryWarning()

Khi mà ứng dụng của mình sài hết RAM và bộ nhớ không đủ để cấp phát cho chương trình hoạt động. Thì function này sẽ được triệu hồi. Lúc đó:

  • Bản thân ViewController đang hiển thị sẽ phải làm công tác dọn dẹp lại bộ nhớ
  • Các ViewController đang ẩn thì sẽ được kích hoạt function didReceiveMemoryWarning của nó
  • Sau đó các ViewController sẽ được chạy function viewDidUnload, bạn phải gán nil cho các đối tưởng giao diện, giải phóng các biến …
  • Cuối cùng sẽ vào lại viewDidLoad mọi thứ lại bắt đầu lại

Thường cũng khó xãy ra trường hợp này, do iPhone giờ RAM nhiều quá. Nếu bạn muốn test thì cũng có cách đơn giản, xem hình sau:

Mở Simulator > Menu > Debug > Simulate Memory Warning

Ngoài ra, thì vẫn còn nhiều function nữa trong vòng đời đầy bất hạnh của ViewController. Tuy nhiên về cơ bản thì bạn chỉ cần nắm như thế này là OKE rồi.

3. Demo

Ví dụ demo cho vòng đời đầy đau khổ của ViewController thì lại khá là đơn giản.

  • Override lại các function trên (cái nào làm được thì làm, không thì thôi)
  • Dùng print() để in ra tên các function
  • Test các trường hợp thao tác ẩn hiện của ViewController
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        print("🔵 viewDidLoad")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        print("🔵 viewWillAppear")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        print("🔵 viewDidAppear")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        print("🔵 viewWillDisappear")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        print("🔵 viewDidDisappear")
    }

}

Kết quả

Tạm kết

  • Biết được ViewController từ đâu mà ra
  • Vòng đời đầy đau khổ của ViewController
  • Các function tương ứng cho mỗi trạng thái của ViewController

 

FacebookTweetPinYummlyLinkedInPrintEmailShares2

Related Posts:

  • RxCocoa Basic – Binding Observables
    RxCocoa Basic – Binding Observables
  • RxCocoa Basic – Extend UIKit
    RxCocoa Basic – Extend UIKit
  • SwiftUI App Life Cycle - SwiftUI Notes #6
    SwiftUI App Life Cycle - SwiftUI Notes #6
  • RxCocoa Basic - Working with multi UI Control
    RxCocoa Basic - Working with multi UI Control
Tags: basic ios tutorial, iOS
Written by chuotfx

Hãy ngồi xuống, uống miếng bánh và ăn miếng trà. Chúng ta cùng nhau đàm đạo về đời, về code nhóe!

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Donate – Buy me a coffee!

Fan page

Fx Studio

Tags

Actor Advanced Swift api AppDistribution Asynchronous autolayout basic ios tutorial blog callback ci/cd closure collectionview combine concurrency CoreData Core Location crashlytics darkmode dart dart basic dart tour Declarative decoding delegate deploy fabric fastlane firebase flavor flutter GCD iOS mapview MVVM optional protocol rxswift Swift Swift 5.5 SwiftUI SwiftUI Notes tableview testing TravisCI unittest

Recent Posts

  • Raw String trong 10 phút
  • Dispatch Semaphore trong 10 phút
  • Tổng kết năm 2022
  • KeyPath trong 10 phút – Swift
  • Make color App Flutter
  • Ứng dụng Flutter đầu tiên
  • Cài đặt Flutter SDK & Hello world
  • Coding Conventions – người hùng hay kẻ tội đồ?
  • Giới thiệu về Flutter
  • Tìm hiểu về ngôn ngữ lập trình Dart

You may also like:

  • RxSwift vs. UIKit – Tương tác giữa các ViewController
    RxSwift vs. UIKit – Tương tác giữa các ViewController
  • Basic Grid Layout - SwiftUI Notes #52
    Basic Grid Layout - SwiftUI Notes #52
  • RxCocoa Basic – Merge Observables Input
    RxCocoa Basic – Merge Observables Input
  • RxSwift vs. UIKit - Hello ViewController
    RxSwift vs. UIKit - Hello ViewController
  • RxCocoa Basic – Delegate Proxy
    RxCocoa Basic – Delegate Proxy

Archives

  • February 2023 (1)
  • January 2023 (2)
  • November 2022 (2)
  • October 2022 (1)
  • September 2022 (5)
  • August 2022 (6)
  • July 2022 (7)
  • June 2022 (8)
  • May 2022 (5)
  • April 2022 (1)
  • March 2022 (3)
  • February 2022 (5)
  • January 2022 (4)
  • December 2021 (6)
  • November 2021 (8)
  • October 2021 (8)
  • September 2021 (8)
  • August 2021 (8)
  • July 2021 (9)
  • June 2021 (8)
  • May 2021 (7)
  • April 2021 (11)
  • March 2021 (12)
  • February 2021 (3)
  • January 2021 (3)
  • December 2020 (3)
  • November 2020 (9)
  • October 2020 (7)
  • September 2020 (17)
  • August 2020 (1)
  • July 2020 (3)
  • June 2020 (1)
  • May 2020 (2)
  • April 2020 (3)
  • March 2020 (20)
  • February 2020 (5)
  • January 2020 (2)
  • December 2019 (12)
  • November 2019 (12)
  • October 2019 (19)
  • September 2019 (17)
  • August 2019 (10)

About me

Education, Mini Game, Digital Art & Life of coders
Contacts:
contacts@fxstudio.dev

Fx Studio

  • Home
  • About me
  • Contact us
  • Mail
  • Privacy Policy
  • Donate
  • Sitemap

Categories

  • Art (1)
  • Blog (22)
  • Code (4)
  • Combine (22)
  • Flutter & Dart (24)
  • iOS & Swift (86)
  • RxSwift (37)
  • SwiftUI (76)
  • Tutorials (70)

Newsletter

Stay up to date with our latest news and posts.
Loading

    Copyright © 2023 Fx Studio - All rights reserved.

    Share this ArticleLike this article? Email it to a friend!

    Email sent!