2010-04-14 9 views
14

आज कहा जाता है मेरे सवाल का मैं देखा है कि डेटा स्रोत प्रतिनिधि विधिUITableView प्रतिनिधि विधि दो बार

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; 

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

+1

क्या आपने कभी यह पता लगाया कि यह क्यों है?मुझे भी हो रहा है। बिल्कुल वही ... – Remover

+0

मैं xcode 4.1 में ios 4.2 पर इस व्यवहार का भी अनुभव कर रहा हूं। मुझे लगता है कि यह अतिरिक्त कॉल कहां से आता है, क्या किसी को अभी तक कोई समाधान नहीं मिला है? या यह एक बग है? – Mellson

+0

मुझे भी एक ही समस्या दिखाई दे रही है (जिससे संख्याऑफसेक्शन इनटेबल व्यू को कुछ परिस्थितियों में दो बार बुलाया जाता है)। यह आईओएस 4.2 के साथ है। – kennethmac2000

उत्तर

11

मुझे एक ही समस्या का सामना करना पड़ रहा था, केवल कॉल करने के लिए कॉलऑफोज़ इनसेक्शन: उत्तर प्राप्त प्रत्येक कॉल के लिए स्टैक ट्रेस में दिए गए उत्तर।

  1. पहला कॉल तालिका दृश्य हेडर व्यू में बदलाव के कारण था जो मैं दृश्य में बना रहा था: मेरे व्यू कंट्रोलर के। जो heightForTable कहा जाता है: जो अंततः numberOfRowsInSection कहा जाता है:

    thumbView.tableHeaderView = nil; 
    thumbView.tableFooterView = nil; 
    

    यह _updateContentSize करने के लिए आंतरिक कॉल में हुई। यह कुछ ऐसा था जो मैंने ट्रिगर किया था, और उपर्युक्त कोड नहीं कर आसानी से बचा जा सकता है :)

  2. दूसरा कॉल पुनः लोड करने के लिए वैध था। यह किसी लेआउट ईवेंट द्वारा कहीं भी ट्रिगर किया जाता है और अधिकतर संभावना है कि आप इसे छोड़ नहीं सकते हैं।

मुझे यकीन है कि आप numberOfSections के लिए कुछ इसी तरह का निरीक्षण कर सकते हैं: विधि

तो, मेरे निष्कर्ष है कि के कारण UITableView के कार्यान्वयन वहाँ कई स्थितियों में, जहां कुछ प्रतिनिधि तरीकों दो बार कहा जाता हो जाएगा रहे हैं या अधिक क्योंकि तालिका दृश्य को कुछ ताज़ा करना है। मैं इस बग/फीचर/आदि के आसपास अपना कोड डिज़ाइन करने का प्रयास करता हूं।

यह

+0

अगर मैं सेट या सेट नहीं -> thumbView.tableHeaderView = nil; thumbView.tableFooterView = nil; "संख्याOfSectionsInTableView" 5 बार कहा जाता है। क्यूं कर ? –

2

में मदद करता है उम्मीद है कि अपने tableview एक बच्चे दृश्य नियंत्रक के अंतर्गत होता है, तो अपने माता पिता पर यह प्रयास करें ViewController

[parentViewController addChildViewController:childViewController]; 

[parentViewController.view addSubview:childViewController.view]

0

से पहले अपने कोड की जांच करें, TableView जोड़ने के बाद आपको फिर से realodData मेले में विधि की विधि कहा जा सकता है ViewWillAppear विधि

0

यह हो सकता है यदि आप टेबल व्यू के फ्रेम को कहानी बोर्ड में गलती से बदलते हैं। क्या आपने स्टोरीबोर्ड पर क्लिक किया है जहां आपने टेबल व्यू को सबव्यूव के रूप में जोड़ा है और अब आपकी तालिका में उचित फ्रेम नहीं हो सकता है शुरुआत में सेट किया है।