Cho tới thời điểm này, bạn đã được học những kiến thức cơ bản và có thể xây dựng được một số ứng dụng có giao diện nho nhỏ. Để hiểu rõ hơn về thành phần quản lý giao diện thì không thể không nhắc tới View Controller. Đây là thành phần đã được mình nhắc sơ trong bài 2 rồi, không biết bạn còn nhớ không? Hôm nay, mình sẽ trình bày tới bạn vai trò và chức năng của View Controller trong lập trình iOS.
View Controller là gì?
View Controller chính là đối tượng Controller trong mô hình thiết kế Model-View-Controller (MVC). Nói tới điều này thì có bạn sẽ hình dung ra ngay View Controller là gì nếu đã biết mô hình MVC. Và lẽ ra trong phần này mình nên nhắc và giới thiệu về mô hình MVC. Nhưng theo kinh nghiệm thì mình nhận thấy rằng với những bạn mới học về lập trình mà nhắc tới mô hình này chỉ rối thêm mà không giúp ích được gì. Vì vậy mình sẽ “lờ” nó đi, và bạn cũng không cần bận tâm lắm về mô hình này đâu. Bạn sẽ dần dần hiểu được nó thông qua việc học và ứng dụng. Sau này nếu có thời gian mình sẽ có bài viết riêng giành cho vấn đề này sau nhé. Còn bây giờ, bạn chỉ cần nắm cho mình những ý như sau:
- View Controller là một liên kết quan trọng giữa dữ liệu và giao diện của ứng dụng.
- Nói cách khác, với mỗi một giao diện người dùng sẽ được quản lý bởi một view controller hoặc một nhóm các view controller phối hợp với nhau.
- View controller cung cấp một framework quan trọng giúp bạn xây dựng ứng dụng iOS.
Tổng quan View Controller
Ứng dụng chạy trên các thiết bị iOS bị hạn chế về không gian màn hình để hiển thị nội dung, do đó bạn phải hết sức khéo trong cách trình bày thông tin tới người sử dụng. View Controller cung cấp cho bạn một nền tảng để quản lý nội dung trên giao diện người dùng.
Có nhiều lớp View Controller khác nhau giúp kiểm soát các thành phần trong giao diện người dùng. Vì vậy bạn nên chia giao diện của bạn thành các phần nhỏ để dễ dàng quản lý hơn.
Một trong những vai trò quan trọng của View Controller là quản lý các View hiển thị nội dung. Các View Controller đều có thể giao tiếp và kết hợp với các View Controller khác.
Bạn có thể sử dụng Interface Builder để tạo storyboard. Các storyboard sẽ giúp cho việc quản lý view controller được dễ dàng hơn.
Một view controller được định nghĩa bởi lớp UIViewController. Mỗi view controller sẽ tổ chức và điều khiển một view; view này thường là view gốc.
- Đối tượng UIScreen xác định màn hình vật lý (màn hình thật của thiết bị)
- Đối tượng UIWindow cung cấp cách thức vẽ và thể hiện giao diện trên màn hình.
- Đối tượng UIView thực hiện thể hiện nội dung lên giao diện. Đối tượng này được đính kèm vào UIWindow để thực hiện việc vẽ và thể hiện các thành phần giao diện người dùng.
Phân loại View Controller
View Controller (kể cả các controller của iOS hoặc do bạn tự tạo), được chia làm hai loại:
Content view controllers
Content view controller thể hiện nội dung trên màn hình bằng cách sử dụng một view hay một nhóm các view được tổ chức thành một hệ thống view. Các controller được mô tả đến thời điểm này đều là content view controller. Thông thường content view controller được dùng để:
- Hiển thị dữ liệu cho người sử dụng.
- Thu thập dữ liệu từ người sử dụng
- Thực hiện việc điều hướng.
➤ Ví dụ: Một dạng của content view controller là table view, được sử dụng để thể hiện dữ liệu dạng bảng (gồm nhiều dòng dữ liệu).
Container view controllers
Bạn có thể hiểu một cách đơn giản như sau: “Container view controller là thành phần có khả năng chứa và quản lý nhiều view controller con bên trong“.
➤ Ví dụ: Tab bar là một dạng của container view controller. Bên trong Tab bar chứa nhiều tab con, mỗi một tab con là thể hiện của một view controller mà tab bar quản lý.
View Controller Lifecycle
Dưới đây là sơ đồ mô tả chu trình sống của một View Controller. Hình ảnh bìa trong video dưới đây chính là sơ đồ hoàn chỉnh của View controller lifecycle. Nếu bạn muốn xem chi tiết từ bước hoạt động thì hãy play video bên dưới.
Ngoài ra bạn có thể xem demo ví dụ bên dưới, để nắm rõ hơn chu trình sống của view controller thực tế được trải qua như thế nào.
Từ demo trên bạn đã nắm được chu trình sống của một View Controller chưa? Dưới đây là trình tự tóm tắt lại chu trình sống của View Controller trong demo trên. Hãy thử suy ngẫm lại một lần nữa bạn nhé.
➤ Lưu ý:
- viewDidLoad: Được gọi một lần khi lần đầu tiên đối tượng view của UIViewController hiển thị.
- viewWillAppear: có thể được gọi nhiều lần. Hàm này được gọi trước khi view được hiển thị lên màn hình (nếu trước đó view có phát sinh viewDidLoad thì hàm này sẽ chạy sau viewDidLoad).
- viewDidAppear: có thể được gọi nhiều lần. Hàm này được gọi sau khi view đã hiển thị lên màn hình.
- Lưu ý khi load dữ liệu tại các hàm:
- Nếu dữ liệu là dạng tĩnh và không thay đổi nhiều, bạn nên load chúng ở phương thức viewDidlLoad.
- Nếu dữ liệu là động và thay đổi thường xuyên, bạn nên load tại phương thức viewDidAppear.
- Lưu ý là tại 2 phương thức, dữ liệu cần phải load theo dạng bất đồng bộ ở một thread khác để tránh ảnh hưởng đến UI.
Tổng kết
Bài viết này mang tính lý thuyết hơi nhiều, nhưng đây là kiến thức nền tảng. Việc nắm được chu trình sống của View Controller sẽ giúp ích bạn rất nhiều trong việc quản lý dữ liệu khởi tạo cho các view. Do đó bạn vẫn nên nắm vững những kiến thức này để việc vận dụng thực tiễn được tốt hơn.
Mh1 -> Mh2 -> Mh1 -> Mh2 chổ này mình thấy có hàm viewDidLoad() của Mh2 nó gọi lại chổ này mình đang còn thắc mắc mong bạn giải thích giùm mình.
“viewDidLoad: Được gọi một lần khi lần đầu tiên đối tượng view của UIViewController hiển thị.”
Đúng rồi bạn, viewDidLoad sẽ được gọi một lần khi đối tượng view của UIViewController được tạo, nếu bạn để ý minh hoạ trên thì khi view 1 được gọi lại thì không có viewDidLoad vì nó chỉ bị đè lên thôi chứ không mất đi.
Nhưng view2 có gọi lại viewDidLoad vì lần trước đó view2 đã bị đóng hoàn toàn nên khi gọi view2 thì giống như tạo view mới, nên vẫn sẽ có viewDidLoad.