2013-07-12 8 views
9

मेरा UITableView में पुन: प्रयोज्य कोशिकाओं का एक गुच्छा है, और जब मैं उनमें से किसी एक पर टैप करता हूं, तो यह मुझे उस सेल के विवरण दिखाते हुए एक और दृश्य नियंत्रक (पुश सेगू के माध्यम से) ले जाता है (मान लें यह एक वस्तु है, इसलिए यह किसी आइटम - नाम, मूल्य, छवि, आदि के बारे में विवरण दिखाएगा ...)। जब मैं उस व्यू कंट्रोलर को पॉप करता हूं (बैक बटन पर टैप करके), UITableView में एक अजीब व्यवहार है:एक दृश्य नियंत्रक पॉपिंग के बाद UITableViewController अजीब व्यवहार

ए) यदि यह नीचे तक सभी तरह से स्क्रॉल किया गया है, तो यह स्वचालित रूप से टैड अप (लगभग 50 अंक) स्क्रॉल करेगा, आखिरी सेल को मुश्किल से दिखाई दे रहा है, इसलिए मुझे फिर से नीचे स्क्रॉल करना होगा। मेरे सेल में ऊंचाई के लिए 60 अंक हैं।

बी) स्क्रॉलबार हमेशा दिखाता है और फिर गायब हो जाता है, यह इंगित करता है कि UITableView (हालांकि यदि नीचे स्क्रॉल नहीं किया गया है, तो सामग्री स्वचालित रूप से नहीं चली जाएगी)।

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

संपादित करें: ठीक है, मुझे पता चला है कि समस्या क्या है: मैं उस सेगू को दबाते समय UIToolbar छुपा रहा हूं। अगर मैं इसे हमेशा दिखाई देता हूं (जो मैं नहीं चाहता), यह अभी भी मेरे टेबल व्यू में पॉपिंग करते समय एनिमेटिंग स्क्रॉलबार दिखाता है लेकिन आखिरी कुछ पंक्तियों पर तालिका दृश्य को स्क्रॉल नहीं करता है।

उत्तर

2

मैं पहली समस्या को ठीक करने में कामयाब रहा। ऐसा लगता है कि टेबलव्यू UIToolbar के 44 अंक को ध्यान में रख रहा है।

tableview prepareForSegue: में ऑफसेट (एक CGPoint संपत्ति में सहेजें)

self.tableViewScrollOffset = self.tableView.contentOffset; 

फिर, viewWillAppear: में सहेजें, देखें कि क्या यह संशोधित किया गया है। यदि ऐसा है, तो इसे बहाल करें।

if(self.tableView.contentOffset.y != self.tableViewScrollOffset.y) { 
     [self.tableView setContentOffset:self.tableViewScrollOffset]; 
     self.tableViewScrollOffset = CGPointZero; 
    } 
+0

क्या आप विस्तार से समझा सकते हैं कि यह क्यों हो रहा है? या कोई हो सकता है। – Krtko

+0

इसकी अद्भुत ... इसी तरह की समस्या हल हो गई ... समस्या यह है कि, जब भी आप व्यू कंट्रोलर से वापस नेविगेट करते हैं, तो टेबलव्यू स्क्रॉल ऑफसेट तदनुसार बदल जाता है। तो आपको prePareForSegue के अंदर किसी प्रॉपर्टी में सामग्री ऑफ़सेट मान को कैप्चर करने की आवश्यकता है: विधि (यानी, नेविगेट करने से पहले) और उसके बाद उसी क्लास में देखें WillAppear: विधि। और यदि यह बदला जाता है तो स्क्रॉल ऑफसेट गुण मान को शून्य पर सेट करें –

0

बस एक झटका, क्या आपको एक नकली scrollToRowAtIndexPath:atScrollPosition:animated लटका हुआ है?

+0

नहीं, मैं Xcode में उस के लिए मेरी पूरी परियोजना की खोज और कोई कोड लाइनों पॉप अप। – swiftcode

+0

मैंने अपनी समस्या को कुछ और प्रासंगिक जानकारी के साथ अपडेट किया है। – swiftcode

7

DidLoad देखने के लिए निम्न जोड़ें।

self.automaticallyAdjustsScrollViewInsets = NO; 

इसने नियंत्रक को देखने के लिए नेविगेट करने के बाद तालिका दृश्य की मेरी समस्या को हल किया।

3

यह व्यवहार वास्तव में आईओएस 8.x में एक बग है।

अब तक दिए गए सभी उत्तर इस मुद्दे को वास्तव में हल नहीं कर सकते हैं। मुद्दा यह है कि आईओएस पहले गणना किए गए सेल आकारों को भूल जाता है (या नहीं), जब दृश्य को धक्का दिया जाता है, उदाहरण के लिए तालिका को फिर से खींचा जा रहा है।

इसे हल करने के लिए एक दृष्टिकोण यहां पाया जा सकता है: UITableView layout messing up on push segue and return. (iOS 8, Xcode beta 5, Swift) (इसलिए यह प्रश्न भी इस पर एक डुप्लिकेट है)।

हालांकि, समाधान प्रदान की वहाँ overkill है और कुछ स्थितियों क्यों इस कैशिंग

(उदाहरण के एक UIContentSizeCategoryDidChangeNotification नहीं माना जाता है के लिए) असफल हो जायेगी देखते हैं लेकिन वहाँ एक काफी सरल समाधान भले ही यह अजीब है:

यदि आप performSequeWithIdentifierdidSelectRowAtIndexPath में मैन्युअल का उपयोग कर रहे हैं, तो बस पहले [self.tableView reloadData] जोड़ें।

यदि आप सेल से आईबी सेक का उपयोग कर रहे हैं, तो बस अपने prepareForSeque कोड में [self.tableView reloadData] जोड़ें।

कारण, यह समस्या हल क्यों करती है, इससे यह आईओएस को दृश्यमान कोशिकाओं का पुन: अनुमान लगाने के लिए मजबूर कर देगा और इसलिए यह किसी अन्य स्थान पर सामग्री को स्क्रॉल नहीं करेगा। सौभाग्य से, tableView reloadData पर बहुत अधिक लागत नहीं है क्योंकि केवल दृश्यमान कोशिकाओं का पुन: अनुमान लगाया जाएगा।

0

मुझे भी इस मुद्दे का सामना करना पड़ रहा था। मैं इसे खोजने में कामयाब रहा। मेरे मामले में कारण तालिकादृश्य शीर्षलेख ऊंचाई आधारित पाठ की गणना कर रहा था और टेक्स्ट ऊंचाई नकारात्मक थी क्योंकि कंटेंटिनेट और स्क्रॉलिनेट शून्य होने के बावजूद कौन सा टेबलव्यू स्थानांतरित हो रहा था।

यह केवल पहली बार हुआ था। अगली बार यह सही गणना कर रहा है। मुझे मिली एक थका हुआ चीज यह है कि जब कक्षा ए (टेबलव्यू होने) ने कक्षा में एक और कक्षा बी को धक्का दिया है। जब कक्षा बी से कीबोर्ड खोला जाता है तो कक्षा ए के डिडलोड को कॉल किया जाता है। और कक्षा बी से पहले नेविगेशन नियंत्रक से अनलोड किया गया है। क्लास ए

0

स्वचालित रूप से सेट अप करने के रूप में स्वचालित समायोजन स्क्रॉल व्यूइन्ससेट सेट करना काम नहीं किया है और न ही तालिका को कैशिंग और सेट करने के लिए तालिका दृश्यवॉल ऑफसेट काम किया है।

इसलिए एक कामकाज के साथ आया जो मेरे लिए एक आकर्षण की तरह काम करता था।

कामकाज एक डमी UIView जोड़ने के लिए था जिसमें 320px की 1px और चौड़ाई की ऊंचाई है और इसे "शीर्ष लेआउट गाइड" और UITableView के बीच रखें। इस दृश्य की पृष्ठभूमि को साफ़ करने के लिए सेट किया जा सकता है ताकि यह अदृश्य हो।

अब ऑटोलाएआउट्स का उपयोग करके, डमी व्यू के शीर्ष पर शीर्ष को ठीक करें। अब डमी व्यू के संबंध में टेबलव्यू की शीर्ष बाधा सेट करें। पाया कि इसने टेबलव्यू के गलत स्थान के मुद्दे को हल किया।

ऑटोलायआउट बाधाओं के साथ डमी व्यू का स्क्रीनशॉट आसान संदर्भ के लिए प्रदान किया गया है। डमी व्यू केवल चित्रण उद्देश्य के लिए एक बड़ी ऊंचाई और लाल पृष्ठभूमि रंग पर सेट किया गया है।

enter image description here

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