Tôi đang cố thực hiện khôi phục trạng thái trong ứng dụng sử dụng iOS 6+ và bảng phân cảnh nhưng tôi gặp sự cố khi tìm cách ngăn các cuộc gọi trùng lặp đến các phương thức nặng.Cuộc gọi vòng đời UIViewController kết hợp với khôi phục trạng thái
Nếu tôi chỉ cần khởi động ứng dụng, sau đó tôi cần phải thiết lập giao diện người dùng trong viewDidLoad
:
- (void)viewDidLoad {
[super viewDidLoad];
[self setupUI];
}
này hoạt động tốt trong một bình thường, ngoài quốc doanh-phục hồi thế giới. Bây giờ tôi đã thêm phục hồi trạng thái và sau khi khôi phục một số tính tôi cần phải cập nhật giao diện người dùng với các thuộc tính:
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
[super decodeRestorableStateWithCoder:coder];
// restore properties and stuff
// [...]
[self setupUI];
}
Vậy điều gì sẽ xảy ra bây giờ là lần đầu tiên phương pháp setupUI
được gọi từ viewDidLoad
, và sau đó một lần nữa từ decodeRestorableStateWithCoder:
. Tôi không thấy một phương pháp mà tôi có thể ghi đè mà luôn được gọi là cuối cùng.
này được trình tự bình thường của phương pháp gọi:
- awakeFromNib
- viewDidLoad
- viewWillAppear
- viewDidAppear
Khi sử dụng khôi phục lại trạng thái, điều này được gọi là:
- awakeFromNib
- viewDidLoad
- decodeRestorableStateWithCoder
- viewWillAppear
- viewDidAppear
tôi không thể đặt cuộc gọi đến setupUI
trong viewWillAppear
vì sau đó nó cũng sẽ được thực hiện mỗi khi bạn thuần trở lại một cái nhìn.
Sẽ dễ dàng hơn nhiều nếu decodeRestorableStateWithCoder
được gọi là TRƯỚC viewDidLoad
vì sau đó bạn có thể sử dụng các thuộc tính đã được khôi phục. Đáng buồn là không phải vậy, vì vậy ... làm thế nào tôi có thể ngăn chặn làm công việc trong viewDidLoad
khi tôi biết rằng tôi cần phải làm điều đó trên một lần nữa trong decodeRestorableStateWithCoder
ngay sau đó?
Tôi muốn đặt giá trị boolean thành NO trong viewDidLoad và nếu KHÔNG, thì thực hiện các công cụ trong viewWillAppear. Tôi giả sử bạn không muốn làm điều đó theo cách này? –
Thực sự có thể là giải pháp thực dụng nhất, vâng. Nó chỉ cảm thấy "sai" :) –
@NitinAlabur không có lý do gì để đặt giá trị thành 'NO' trong' viewDidLoad' vì giá trị 'BOOL' mặc định. – k06a