2013-01-29 16 views
6

अनुसार docs:आईओएस 6 UIWebView राज्य बहाली कैसे काम करता है?

iOS 6 में और बाद में, अगर आप इस दृश्य की restorationIdentifier संपत्ति को कोई मान निर्दिष्ट है, यह प्रत्येक पृष्ठ के लिए अपने URL के इतिहास, स्केलिंग और स्क्रॉल पदों को संरक्षित करने का प्रयास करता है, और जानकारी के बारे में जो पेज वर्तमान में देखा जा रहा है। बहाली के दौरान, दृश्य इन मानों को पुनर्स्थापित करता है ताकि वेब सामग्री पहले जैसा दिखाई दे।

मैं यह सब कर रहा हूं, लेकिन कुछ भी नहीं हो रहा है। और यहां तक ​​कि यदि मैं मैन्युअल रूप से यूआरएल को सहेजता और पुनर्स्थापित करता हूं तो उपयोगकर्ता पहले देख रहा था, स्क्रॉल स्थिति बहाल नहीं की गई है। क्या दस्तावेज़ सिर्फ गलत हैं?

उत्तर

5

मैंने मैट के जवाब की कोशिश की है और यह अच्छी तरह से काम करता है, हालांकि इतिहास स्टैक में 'आगे' पृष्ठ हैं- वे वेब दृश्य ऑब्जेक्ट के पुनर्स्थापित अनुरोध द्वारा प्रतिस्थापित किए जाएंगे।

वेबव्यू ऑब्जेक्ट पर 'रीलोड' विधि को कॉल करने के लिए एक बेहतर तरीका है, यह दोनों दिशाओं के साथ-साथ ज़ूम और सामग्री स्क्रॉल ऑफ़सेट में इतिहास को पुनर्स्थापित करेगा।

आप अपने स्वयं के वेब दृश्य के लिए अपने दृष्टिकोण का एक उदाहरण है या कुछ और अधिक कार्यक्षमता चाहते SVWebViewController here.

+1

यह मेरे उत्तर से बेहतर है! – matt

+0

हर किसी को यह समझने के लिए मैट का जवाब पढ़ना चाहिए कि कोड क्या चल रहा है और जहां कोड दिखाया गया है। बस "रीलोड" के साथ अपने "loadRequest" कॉल को प्रतिस्थापित करें। – jasonjwwilliams

11

दस्तावेज़ सही हैं, लेकिन बहुत अपूर्ण हैं। यहां क्या हो रहा है। यदि कोई वेब व्यू राज्य बहाली में भाग लेता है (मुझे लगता है कि आप जानते हैं कि इसका क्या अर्थ है - सब कुछ restorationIdentifier होना चाहिए, और इसी तरह), और यदि उपयोगकर्ता के पास कोई अनुरोध था (HTML स्ट्रिंग नहीं) तो जब उपयोगकर्ता ने छोड़ा ऐप, वेब व्यू स्वचालित रूप से उसी प्रतिक्रिया वाले जीवन में वापस आ जाएगा, जिसकी request संपत्ति है, और इसकी बैक और फॉरवर्ड सूचियां बरकरार हैं। इस प्रकार, आप वेब दृश्य की स्थिति को पुनर्स्थापित करने के लिए राज्य बहाली तंत्र का उपयोग कर सकते हैं, लेकिन आपको थोड़ा अतिरिक्त नृत्य करना होगा। यह नृत्य इतना उत्सुक और अस्पष्ट है कि शुरुआत में मैं इस धारणा के तहत था कि दस्तावेज़ के दावे के बावजूद वेब दृश्य का राज्य वास्तव में सहेजा और बहाल नहीं किया जा सका।

यहां दो रहस्य हैं; एक बार जब आप उन्हें जानते हैं, तो आप वेब व्यू स्टेट बहाली को समझेंगे:

  • एक पुनर्स्थापित वेब दृश्य स्वचालित रूप से इसके अनुरोध को लोड नहीं करेगा; यह आपके कोड पर निर्भर है।

  • एक पुनर्स्थापित वेब दृश्य के बाद अपना अनुरोध लोड हो गया है, इसकी पिछली सूची में पहली वस्तु उस उपयोगकर्ता में एक ही पृष्ठ है जिसे उपयोगकर्ता ने छोड़ा (स्क्रॉल और ज़ूम)।

यह जानकर, आप वेब दृश्य राज्य बहाली के लिए आसानी से रणनीति तैयार कर सकते हैं। पहली बात का पता लगाने है कि हम राज्य को बहाल कर रहे हैं, और कहा कि इसलिए कहते हैं एक झंडा उठाने के लिए है:

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder { 
    [super decodeRestorableStateWithCoder:coder]; 
    self->_didDecode = YES; 
} 

अब हम पता लगा सकते हैं (viewDidAppear: में शायद) है कि हम राज्य को बहाल कर रहे हैं, और वेब दृश्य जादुई होता है अनुरोध करें, और उस अनुरोध को लोड करें:

if (self->_didDecode && wv.request) 
    [wv loadRequest:wv.request]; 

अब मुश्किल भाग के लिए। दृश्य भार के बाद, हम तुरंत "वापस जाओ।" इसका वास्तव में उपयोगकर्ता की पिछली स्क्रॉल स्थिति को पुनर्स्थापित करने का प्रभाव है (और बैक स्टैक के शीर्ष से अतिरिक्त प्रविष्टि को हटाने का)। तो फिर हम अपने ध्वज को कम इसलिए है कि हम किसी अन्य समय में इस अतिरिक्त कदम नहीं है:

- (void)webViewDidFinishLoad:(UIWebView *)wv { 
    if (self->_didDecode && wv.canGoBack) 
     [wv goBack]; 
    self->_didDecode = NO; 
} 

UIWebView राज्य यह उपयोगकर्ता पहले से एप्लिकेशन छोड़ दिया जब में था में है। हमने अंतर्निहित आईओएस 6 राज्य की बचत और बहाली सुविधा का उपयोग कर राज्य को सहेजा और बहाल कर दिया है।

+0

मैं अगर यह वेब विचारों का एक मोड़ है पता नहीं है की मेरी खुला स्रोत कांटा पर एक नज़र डालें चाहते हैं, तो लेकिन '[wv goBack]' के बाद, परीक्षण '[wv canGoBack]' अभी भी 'YES' लौटाता है। इसे इतिहास में केवल एक पृष्ठ (आईओएस 6.1.4) के साथ वेब दृश्य पर आज़माएं। –

+1

क्या इस काम के साथ कहीं भी कोई परियोजना है? इसे काम करने के लिए नहीं मिल सकता – cannyboy

+0

जिज्ञासा से, कोई एक जटिल, परेशानी की समस्या के लिए एक महान प्रश्न को तैयार करने के बारे में कैसे जाता है, और फिर इसे व्यापक रूप से एक व्यापक आत्म-उत्तर के साथ समाप्त कर देता है, बहुत विस्तार से, सभी 2 की अवधि के भीतर मिनट? अच्छा! उस चाल के लिए एसओ बैज कहां है? –

संबंधित मुद्दे