viewWillAppear trong iOS: bản chất của phương thức và cách sử dụng

Tác giả: IT Sectr Đã đăng: 2026-03-05 Thời gian đọc: 8 phút

viewWillAppear là một phương thức UIViewController mà UIKit gọi mỗi lần trước khi màn hình hiển thị cho người dùng. Theo Tài liệu Nhà phát triển Apple, phương thức này nhận một tham số boolean animated cho biết chuyển đổi có đi kèm hoạt ảnh hay không. viewWillAppear là nơi chính để cập nhật dữ liệu và đồng bộ hóa trạng thái màn hình.

Những điểm chính

  • viewWillAppear được gọi mỗi khi màn hình xuất hiện, không giống như viewDidLoad
  • Được sử dụng để cập nhật dữ liệu và đồng bộ hóa sau khi quay lại từ các màn hình khác
  • Tham số animated cho biết sự xuất hiện có đi kèm hoạt ảnh hay không
  • Tại đây cấu hình NavigationBar, TabBar và các thành phần giao diện khác
  • Phù hợp để đăng ký thông báo tạm thời chỉ hoạt động khi màn hình hiển thị

ViewWillAppear là gì

viewWillAppear là một phương thức UIViewController mà UIKit gọi ngay trước khi thêm View vào hệ phân cấp cửa sổ. Tại thời điểm này, View đã có kích thước cuối cùng sau các lượt Auto Layout, nhưng chưa hiển thị cho người dùng — hoạt ảnh chuyển đổi chưa bắt đầu hoặc đang diễn ra. Nhà phát triển ghi đè phương thức này để thực hiện các thao tác cần xảy ra trước mỗi lần hiển thị màn hình.

Không giống như viewDidLoad chỉ kích hoạt một lần, viewWillAppear được gọi mỗi lần màn hình sắp xuất hiện: khi mở lần đầu, khi quay lại từ bộ điều khiển con, sau khi đóng cửa sổ modal và khi chuyển đổi tab TabBar. Điều này làm cho nó trở thành phương thức chính để duy trì trạng thái giao diện cập nhật.

Phương thức chấp nhận một tham số animated kiểu Bool, là true nếu sự xuất hiện của màn hình đi kèm với hoạt ảnh. Tham số này thuận tiện để truyền cho các phương thức NavigationBar và TabBar, vốn cũng có tham số tương tự cho hành vi nhất quán.

Khi nào viewWillAppear được gọi

Thời điểm gọi viewWillAppear phụ thuộc vào loại điều hướng, nhưng quy tắc chung không thay đổi: phương thức kích hoạt trước khi View hiển thị. Hãy xem xét các kịch bản chính.

Khi mở màn hình lần đầu

Sau viewDidLoad, UIKit bắt đầu chuẩn bị hiển thị: View được thêm vào hệ phân cấp, các lượt layout được kích hoạt, và ngay trước khi hoạt ảnh chuyển đổi bắt đầu, viewWillAppear được gọi. Tại thời điểm này, màn hình chưa hiển thị, nhưng tất cả các subview đều có kích thước chính xác và nội dung của chúng có thể được cập nhật an toàn.

Khi quay lại từ NavigationController

Khi người dùng nhấn nút quay lại hoặc gọi popViewController theo chương trình, UIKit quay lại màn hình trước và gọi viewWillAppear của nó. Đây là kịch bản chính để sử dụng viewWillAppear — cập nhật danh sách sau khi thêm mục hoặc đồng bộ hóa cài đặt.

swift
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
    updateBadgeCount()
}

Khi đóng cửa sổ modal

Sau khi đóng bộ điều khiển được trình bày dạng modal, UIKit gọi viewWillAppear trên bộ điều khiển đã trình bày nó. Kịch bản này cần chú ý đặc biệt nếu bạn sử dụng delegate hoặc closure để truyền dữ liệu trở lại — viewWillAppear đảm bảo màn hình cập nhật sau khi nhận kết quả.

Khi chuyển đổi tab TabBar

TabBarController gọi viewWillAppear trên bộ điều khiển của tab được chọn mỗi khi chuyển đổi. Nếu tab hiển thị dữ liệu động — tỷ giá hối đoái, thông báo, trạng thái người dùng — viewWillAppear là nơi lý tưởng để cập nhật chúng.

Các tác vụ thực tế trong viewWillAppear

viewWillAppear giải quyết một số tác vụ cụ thể mà không thể hoặc không tối ưu khi thực hiện trong các phương thức khác. Hãy xem xét những tác vụ chính.

Cập nhật dữ liệu bảng

Cách sử dụng phổ biến nhất của viewWillAppear là tải lại UITableView hoặc UICollectionView mỗi khi màn hình xuất hiện. Nếu dữ liệu có thể đã thay đổi trên màn hình trước (thêm mục, thay đổi trạng thái), gọi reloadData trong viewWillAppear đảm bảo người dùng thấy thông tin cập nhật.

swift
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    viewModel.synchronize()
    tableView.reloadData()
}

Cấu hình NavigationBar và TabBar

Trong viewWillAppear, có thể dễ dàng cấu hình giao diện NavigationBar: ẩn hoặc hiện, thay đổi màu sắc, đặt tiêu đề lớn. Nếu các màn hình khác nhau có kiểu NavigationBar khác nhau, viewWillAppear là nơi thích hợp cho những thay đổi này, vì viewDidLoad chỉ được gọi một lần.

swift
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(
        false, animated: animated
    )
    navigationController?.navigationBar.prefersLargeTitles = true
    tabBarController?.tabBar.isHidden = false
}

Đăng ký thông báo tạm thời

Các thông báo chỉ có ý nghĩa khi màn hình hiển thị — thông báo bàn phím, thông báo thay đổi nội dung — được đăng ký trong viewWillAppear và hủy đăng ký trong viewDidDisappear. Điều này ngăn chặn các trình xử lý không cần thiết khi màn hình không hoạt động và bảo vệ khỏi rò rỉ bộ nhớ.

Khôi phục trạng thái giao diện

Nếu màn hình có thể bị ẩn bởi ứng dụng hoặc thu nhỏ, viewWillAppear là nơi thuận tiện để khôi phục trạng thái giao diện: chuyển đổi đoạn, khôi phục vị trí cuộn, đặt lại các thay đổi tạm thời. Người dùng nhận được màn hình ở trạng thái có thể dự đoán được mỗi khi nó xuất hiện.

Cập nhật huy hiệu và bộ đếm

Trên các màn hình hiển thị bộ đếm tin nhắn chưa đọc, xếp hạng hoặc thông báo, viewWillAppear là nơi thích hợp để cập nhật chúng. Nếu người dùng có thể đã thay đổi số lượng trên màn hình khác, việc tính toán lại và cập nhật UITabBarItem.badgeValue hoặc các chỉ báo tùy chỉnh được gọi tại đây. Điều này đảm bảo người dùng luôn thấy số liệu hiện tại bất kể họ đã ở trên màn hình khác bao lâu.

Cần chú ý đặc biệt khi làm việc với collectionView: nếu dữ liệu trên màn hình được trình bày dưới dạng lưới với các ô chứa bộ đếm hoặc trạng thái, việc cập nhật chúng trong viewWillAppear phải chọn lọc. Thay vì reloadData toàn bộ, hãy sử dụng reloadItemsAtIndexPaths cho các ô hiển thị để tránh nhấp nháy và mất vị trí cuộn.

Sự khác biệt giữa viewWillAppear và viewDidLoad

Hiểu sự khác biệt giữa viewWillAppear và viewDidLoad là nền tảng của kiến trúc UIViewController đúng đắn. Các phương thức này có tần suất gọi, ngữ cảnh và mục đích khác nhau.

viewDidLoad được gọi một lần và phù hợp cho cấu hình không thay đổi theo thời gian: đăng ký ô, thiết lập delegate, khởi tạo hằng số. viewWillAppear được gọi mỗi lần xuất hiện và phù hợp cho các thao tác cần lặp lại: cập nhật dữ liệu, cấu hình các thành phần hiển thị, đồng bộ hóa trạng thái.

Đặc điểmviewDidLoadviewWillAppear
Tần suấtMột lầnMỗi lần xuất hiện
View hiển thịKhôngKhông (sắp hiển thị)
Kích thước ViewChưa cuối cùngCuối cùng
Phù hợp choThiết lập một lầnCập nhật và đồng bộ hóa
Hoạt ảnhKhông áp dụngTham số animated

Nguyên tắc vàng: nếu một thao tác chỉ cần thực hiện một lần — đặt nó trong viewDidLoad. Nếu cần thực hiện mỗi lần quay lại màn hình — đặt nó trong viewWillAppear.

Các lỗi thường gặp trong viewWillAppear

Sử dụng sai viewWillAppear có thể dẫn đến các vấn đề về hiệu suất, cập nhật quá mức và trạng thái giao diện không nhất quán. Hãy xem xét các lỗi phổ biến nhất.

Lỗi thứ nhất — sao chép logic từ viewDidLoad. Nếu bạn đăng ký ô bảng trong cả viewDidLoad và viewWillAppear, việc đăng ký sẽ được thực hiện nhiều lần, mặc dù thiết lập một lần là đủ. Di chuyển tất cả cấu hình một lần vào viewDidLoad.

Lỗi thứ hai — reloadData vô điều kiện mỗi lần xuất hiện. Nếu dữ liệu không thay đổi, việc tải lại bảng gây ra các truy vấn không cần thiết đến nguồn dữ liệu và vẽ lại ô, làm giảm hiệu suất. Kiểm tra xem trạng thái có thực sự thay đổi trước khi gọi reloadData.

Lỗi thứ ba — làm việc với yêu cầu mạng mà không xem xét rằng màn hình có thể bị ẩn lại trước khi yêu cầu hoàn thành. Nếu bạn bắt đầu yêu cầu URLSession trong viewWillAppear và người dùng ngay lập tức điều hướng đến màn hình khác, kết quả có thể được áp dụng cho View đã ẩn. Sử dụng các tác vụ có thể hủy hoặc kiểm tra isViewLoaded và window trước khi cập nhật.

Lỗi thứ tư — quên gọi super. Không gọi super.viewWillAppear có thể phá vỡ hành vi của bộ điều khiển cha (UINavigationController, UITabBarController) và dẫn đến xử lý cử chỉ và chuyển đổi không chính xác. super phải luôn được gọi.

Lỗi thứ năm — sửa đổi ràng buộc mà không gọi layoutIfNeeded. Nếu bạn thay đổi ràng buộc theo chương trình trong viewWillAppear, UIKit không áp dụng chúng ngay lập tức — các thay đổi tích lũy cho đến lượt layout tiếp theo. Để áp dụng ngay lập tức các thay đổi sau khi sửa đổi ràng buộc, hãy gọi view.layoutIfNeeded(). Điều này đặc biệt quan trọng khi điều chỉnh chiều cao của các thành phần phụ thuộc vào nội dung.

Lỗi thứ sáu — cố gắng thực hiện hoạt ảnh trong viewWillAppear. Như đã đề cập ở trên, UIKit vẫn đang xử lý hoạt ảnh chuyển đổi và hoạt ảnh của bạn có thể cạnh tranh với hoạt ảnh hệ thống. Nếu bạn cần một thành phần xuất hiện với hiệu ứng, hãy sử dụng hoạt ảnh đến trong viewDidAppear và trong viewWillAppear chỉ cấu hình trạng thái ban đầu: độ trong suốt 0, transform ở tỷ lệ 0,8, v.v.

Lỗi thứ bảy — bỏ qua tham số animated. Một số nhà phát triển không kiểm tra giá trị animated trong viewWillAppear và thực hiện các thao tác lẽ ra phải phụ thuộc vào sự hiện diện của hoạt ảnh. Ví dụ: ẩn NavigationBar khi animated = false có thể thực hiện không có hoạt ảnh, còn khi animated = true — có hoạt ảnh, để chuyển đổi trông mượt mà. Luôn truyền tham số animated cho các phương thức UIKit thích hợp.

Lỗi thứ tám — sửa đổi giao diện khi màn hình không hiển thị. Nếu bạn bắt đầu yêu cầu mạng trong viewWillAppear và khối hoàn thành của nó cập nhật giao diện khi màn hình đã biến mất, người dùng sẽ thấy nhấp nháy hoặc trạng thái không nhất quán. Luôn kiểm tra isViewLoaded và window trước khi cập nhật giao diện trong closure. Hành động đơn giản này ngăn chặn sự cố và vẽ lại giao diện không cần thiết.

Các câu hỏi thường gặp

ViewWillAppear khác viewDidAppear như thế nào?

viewWillAppear được gọi trước khi hoạt ảnh xuất hiện bắt đầu, khi View chưa hiển thị. viewDidAppear được gọi sau khi hoạt ảnh kết thúc, khi màn hình đã hiển thị đầy đủ và sẵn sàng cho tương tác.

ViewWillAppear có thể không được gọi không?

Trong điều kiện bình thường, viewWillAppear luôn được gọi khi màn hình xuất hiện. Ngoại lệ là buộc thoát ứng dụng, trong đó UIKit không có thời gian để gọi các phương thức Lifecycle.

Có cần gọi super.viewWillAppear không?

Có, nhất định phải gọi. UIKit sử dụng lời gọi này để phối hợp nội bộ với UINavigationController và UITabBarController. Nếu không có super, cử chỉ và hoạt ảnh chuyển đổi có thể bị hỏng.

Bao lâu thì viewWillAppear được gọi trong TabBarController?

Mỗi lần chuyển tab. UIKit gọi viewWillAppear trên bộ điều khiển của tab được chọn ngay sau khi người dùng chạm vào biểu tượng tương ứng trong TabBar.

Làm thế nào để truyền dữ liệu trở lại qua viewWillAppear?

Sử dụng thuộc tính của bộ điều khiển hoặc nguồn dữ liệu chung. Trước khi gọi popViewController, hãy đặt các giá trị cần thiết trên bộ điều khiển trước đó và chúng sẽ có sẵn trong viewWillAppear của nó.

Tổng kết

  • viewWillAppear được gọi trước mỗi lần màn hình xuất hiện, không giống như viewDidLoad chỉ gọi một lần
  • Được sử dụng để cập nhật dữ liệu bảng, bộ sưu tập và trạng thái giao diện
  • Tham số animated cho phép điều chỉnh hành vi cho các chuyển đổi có và không có hoạt ảnh
  • NavigationBar, TabBar và các thành phần điều hướng khác được cấu hình trong viewWillAppear
  • Đăng ký thông báo tạm thời là trường hợp sử dụng hợp lệ cho viewWillAppear
  • Tránh sao chép logic viewDidLoad và reloadData vô điều kiện
  • Luôn gọi super.viewWillAppear để có hành vi điều hướng chính xác

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm