Trong khi điều tra rò rỉ bộ nhớ, tôi đã phát hiện ra một vấn đề liên quan đến kỹ thuật gọi setRootViewController:
bên trong khối hoạt ảnh chuyển tiếp:
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
Nếu bộ điều khiển chế độ xem cũ (bộ đang được thay thế) hiện đang trình bày bộ điều khiển chế độ xem khác, thì đoạn mã trên không loại bỏ chế độ xem đã trình bày khỏi hệ thống phân cấp chế độ xem.
Đó là, chuỗi hoạt động này ...
- X trở thành Bộ điều khiển Chế độ xem gốc
- X trình bày Y, để chế độ xem của Y hiển thị trên màn hình
- Sử dụng
transitionWithView:
để biến Z trở thành Bộ điều khiển Chế độ xem gốc mới
... có vẻ ổn đối với người dùng, nhưng công cụ Thứ bậc của Chế độ xem Gỡ lỗi sẽ tiết lộ rằng chế độ xem của Y vẫn ở đó phía sau chế độ xem của Z, bên trong a UITransitionView
. Tức là, sau ba bước trên, phân cấp chế độ xem là:
- UIWindow
- UITransitionView
- UIView (góc nhìn của Y)
- UIView (góc nhìn của Z)
- UITransitionView
Tôi nghi ngờ đây là một vấn đề bởi vì, tại thời điểm chuyển đổi, chế độ xem của X thực sự không phải là một phần của hệ thống phân cấp chế độ xem.
Nếu tôi gửi dismissViewControllerAnimated:NO
tới X ngay trước đó transitionWithView:
, hệ thống phân cấp chế độ xem kết quả là:
- UIWindow
- UIView (góc nhìn của X)
- UIView (góc nhìn của Z)
Nếu tôi gửi dismissViewControllerAnimated:
(CÓ hoặc KHÔNG) tới X, sau đó thực hiện chuyển đổi trong completion:
khối, thì phân cấp chế độ xem là chính xác. Thật không may, điều đó cản trở hoạt ảnh. Nếu tạo hiệu ứng cho việc sa thải, nó sẽ lãng phí thời gian; nếu không hoạt ảnh, nó trông bị hỏng.
Tôi đang thử một số cách tiếp cận khác (ví dụ: tạo một lớp bộ điều khiển chế độ xem vùng chứa mới để phục vụ như bộ điều khiển chế độ xem gốc của tôi) nhưng không tìm thấy bất kỳ thứ gì hoạt động. Tôi sẽ cập nhật câu hỏi này khi tôi tiếp tục.
Mục tiêu cuối cùng là chuyển đổi trực tiếp từ chế độ xem đã trình bày sang bộ điều khiển chế độ xem gốc mới và không để lại các cấu trúc phân cấp chế độ xem lạc chỗ.
UIWindow
có phải là điều nên làm hay không, nhưng tôi không có thời gian để thử nghiệm nhiều.