Tài liệu là đúng, nhưng rất không đầy đủ. Đây là những gì đang xảy ra. Nếu chế độ xem web tham gia khôi phục trạng thái (tôi giả sử bạn biết điều này có nghĩa là gì - mọi thứ phải có restorationIdentifier
, v.v.) và nếu chế độ xem web có yêu cầu (không phải chuỗi HTML) khi người dùng rời khỏi ứng dụng, chế độ xem web sẽ tự động quay trở lại cuộc sống chứa cùng yêu cầu với thuộc tính request
và với danh sách Quay lại và Chuyển tiếp của nó còn nguyên vẹn. Do đó, bạn có thể sử dụng cơ chế phục hồi trạng thái để khôi phục trạng thái của chế độ xem web, nhưng bạn phải thực hiện thêm một chút điệu nhảy. Điệu nhảy này rất tò mò và mơ hồ đến nỗi ban đầu tôi cảm thấy rằng trạng thái của một trang web thực sự không thể được lưu và phục hồi, bất chấp sự khẳng định của tài liệu mà nó có thể.
Có hai bí mật ở đây; sau khi bạn biết họ, bạn sẽ hiểu khôi phục trạng thái chế độ xem web:
Chế độ xem web được khôi phục sẽ không tự động tải yêu cầu; điều đó tùy thuộc vào mã của bạn.
Sau khi chế độ xem web được khôi phục đã tải yêu cầu của nó, mục đầu tiên trong danh sách Quay lại của nó là cùng một trang trong trạng thái mà người dùng đã để nó (cuộn và thu phóng).
Biết điều này, bạn có thể dễ dàng nghĩ ra một chiến lược để khôi phục trạng thái xem web. Điều đầu tiên là để phát hiện rằng chúng tôi đang khôi phục trạng thái, và nâng cao một lá cờ mà nói như vậy:
-(void)decodeRestorableStateWithCoder:(NSCoder *)coder {
[super decodeRestorableStateWithCoder:coder];
self->_didDecode = YES;
}
Bây giờ chúng ta có thể phát hiện (có lẽ trong viewDidAppear:
) mà chúng ta đang khôi phục trạng thái, và rằng xem web kỳ diệu chứa một yêu cầu và tải yêu cầu đó:
if (self->_didDecode && wv.request)
[wv loadRequest:wv.request];
Bây giờ cho phần khó khăn. Sau khi lượt xem tải, chúng tôi ngay lập tức "quay lại". Điều này thực sự có tác dụng khôi phục vị trí cuộn trước đó của người dùng (và loại bỏ mục nhập bổ sung từ phía trên cùng của ngăn xếp Quay lại). Sau đó, chúng tôi hạ cờ của mình để chúng tôi không thực hiện thêm bước này vào bất kỳ lúc nào khác:
- (void)webViewDidFinishLoad:(UIWebView *)wv {
if (self->_didDecode && wv.canGoBack)
[wv goBack];
self->_didDecode = NO;
}
UIWebView hiện ở trạng thái khi người dùng rời khỏi ứng dụng. Chúng tôi đã lưu và khôi phục trạng thái bằng tính năng lưu và khôi phục trạng thái iOS 6 tích hợp sẵn.
Điều đó tốt hơn câu trả lời của tôi! – matt
Mọi người nên đọc câu trả lời của Matt để hiểu điều gì đang xảy ra và nơi hiển thị mã. Chỉ cần thay thế cuộc gọi "loadRequest" của mình bằng "tải lại". – jasonjwwilliams