2013-01-29 43 views
6

Theo các docs:Tính năng phục hồi trạng thái UIWebView của iOS 6 hoạt động như thế nào?

Trong iOS 6 và sau đó, nếu bạn gán giá trị cho tài sản restorationIdentifier của quan điểm này, nó cố gắng để gìn giữ lịch sử URL của nó, mở rộng quy mô và vị trí di chuyển cho mỗi trang, và thông tin về những trang hiện đang được xem. Trong quá trình khôi phục, chế độ xem khôi phục các giá trị này để nội dung web xuất hiện giống như trước đây.

Tôi đang làm tất cả những điều đó, nhưng không có gì đang xảy ra. Và ngay cả khi tôi lưu và khôi phục lại URL mà người dùng đã xem trước đây theo cách thủ công, vị trí cuộn sẽ không được khôi phục. Tài liệu có đúng không?

Trả lời

5

Tôi đã thử câu trả lời của Matt và nó hoạt động tốt, tuy nhiên nếu có các trang 'chuyển tiếp' trong ngăn xếp lịch sử, chúng sẽ được thay thế bằng yêu cầu được khôi phục trong đối tượng xem web.

Cách tiếp cận tốt hơn là thay vào đó gọi phương thức 'tải lại' trên đối tượng webview, điều này sẽ khôi phục lịch sử theo cả hai hướng cũng như độ lệch cuộn và thu phóng nội dung.

Nếu bạn muốn một ví dụ về cách tiếp cận của tôi hay một số chức năng hơn cho webview của riêng bạn, hãy nhìn vào ngã ba mã nguồn mở của tôi về SVWebViewController here.

+1

Điều đó tốt hơn câu trả lời của tôi! – matt

+0

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

11

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.

+0

Tôi không biết nếu đó là một điều không minh bạch của số lượt xem web, nhưng sau '[wv goBack]', kiểm tra '[wv canGoBack]' vẫn trả về 'YES', lặp đi lặp lại. Đã thử nó trên một lần xem web chỉ với một trang trong lịch sử (iOS 6.1.4). –

+1

Có dự án nào ở nơi làm việc này không? Không thể làm cho nó hoạt động – cannyboy

+0

Ngoài sự tò mò, làm thế nào để tạo ra một câu hỏi tuyệt vời cho một vấn đề phức tạp, khó hiểu, và sau đó nhanh chóng xóa sạch nó với một câu trả lời toàn diện, chi tiết, tất cả trong khoảng 2 phút? Tốt đẹp! Huy hiệu SO cho thủ thuật đó ở đâu? –

Các vấn đề liên quan