2010-12-31 9 views
15

मेरे पास UITableViewController है। मैं एक कस्टम headerView बनाने के लिए यह loadView विधि इतनी तरह में tableView है:कस्टम UITableView हेडर दृश्य स्मृति चेतावनी के बाद गायब हो जाता है

(void)loadView { 
    [super loadView]; 

    UIView* containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height * 2)]; 
    containerView.tag = 'cont'; 
    containerView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin; 

    UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    button.frame = CGRectMake(padding, height, width, height); 
    ... //configure UIButton and events 

    UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"] highlightedImage:[UIImage imageNamed:@"highlight.png"]];  
    imageView.frame = CGRectMake(0, 0, width, height); 
    ... //configure UIImageView 

    [containerView addSubview:button]; 
    [containerView addSubview:imageView]; 
    self.tableView.tableHeaderView = containerView; 

    [imageView release]; 
    [containerView release]; 
} 

अन्य विधियों (viewDidLoad/अनलोड, आदि) में से कोई भी अतिभारित रहे हैं।

यह नियंत्रक एक टैब में होस्ट किया गया है। जब मैं किसी अन्य टैब पर स्विच करता हूं और स्मृति चेतावनी अनुकरण करता हूं, और फिर इस टैब पर वापस आ जाता है, तो मेरे UITableView में मेरा कस्टोन हेडर गुम है। जैसा कि मैं उम्मीद करता हूं सभी पंक्तियां/खंड दिखाई दे रहे हैं। उपरोक्त loadView कोड में एक बीपी डालने पर, मुझे लगता है कि जब मैं स्मृति चेतावनी के बाद टैब पर वापस स्विच करता हूं, तब भी इसे लागू किया जा रहा है, और फिर भी मैं वास्तव में हेडर नहीं देख सकता।

मैं यहां क्या खो रहा हूं इसके बारे में कोई विचार?

संपादित करें: यह डिवाइस और सिम्युलेटर पर होता है। डिवाइस पर, मैं पृष्ठभूमि में होने पर अलग-अलग ऐप्स के समूह को खोलकर बस एक स्मृति चेतावनी देता हूं।

+0

मैं तुम्हें इस तरह से अपनी viewDidUnload() विधि में कोड है लगता है: self.tableView.tableHeaderView = nil; ? –

+0

नहीं "अन्य विधियों में से कोई भी नहीं (viewDidLoad/Unload, आदि) अधिभारित हैं"। क्या मुझे इसकी ज़रूरत है? क्यूं कर? – psychotik

+0

उलझन में। उम्मीद है कि कोई और मदद कर सकता है। –

उत्तर

2

इसे जारी करने के बजाय व्यूव्यू रखें। और इसे तालिका में वापस देखें दृश्य: viewForHeaderInSection: (UITableViewDelegate विधि)।

+0

इसे जारी करने में क्या गलत है? 'tableHeaderView' इसे बरकरार रखता है। भले ही, जब मैं इस टैब पर वापस जाता हूं तो 'loadView' लागू किया जा रहा है, इसलिए मुझे समझ में नहीं आता कि यह प्रारंभ में क्यों काम करता है लेकिन यादगार चेतावनी के बाद नहीं। – psychotik

-2

केवल loadView पर देखकर मैं देख सकता हूं कि एक स्ट्रिंग के साथ आप अपने containerView को टैग करने का प्रयास कर रहे हैं। जहां तक ​​मुझे पता है कि यह NSInteger होना चाहिए।

+0

यह एक स्ट्रिंग नहीं है। एकल उद्धरण पर ध्यान दें। – psychotik

+0

यह एक 'एनएसएसटींग' नहीं है लेकिन यह एक char * है, नहीं? टैग प्रॉपर्टी को 'एनएसआईएनटेगर' की उम्मीद है। – Bringo

+0

नंबर चार * अभी भी डबल कोट्स के साथ घोषित किया गया है। यह एक 32-बिट int मान है, जिसे अनुक्रमिक वर्ण के रूप में परिभाषित किया गया है। मैं आपको आश्वस्त करता हूं कि यह मान्य है, और इस समस्या से संबंधित नहीं है। – psychotik

-1

यह समस्या ज्ञात है। उदाहरण के लिए, यदि आप TableViewDelegate tableView:viewForHeaderInSection: का उपयोग करते हैं तो यह भी काम नहीं करेगा।

समस्या आईओएस है और आप नहीं। TableHeaderView के बारे में बहुत से प्रश्न नहीं हैं क्योंकि कोई इसका उपयोग नहीं करता है, और इसलिए ऐप्पल को कोई भी बगट्रैकर प्रविष्टियां नहीं मिलीं ...

पुराने प्रश्न पर एक नज़र डालें: here। और here अन्य समस्याएं हैं।

तो मुझे लगता है वास्तव में यह एक एसडीके बग है ...

+0

क्या^कहा।ध्यान दें कि यह स्मृति स्मृति चेतावनी तक अपेक्षित के रूप में काम करता है, इसलिए मुझे लगता है कि मैं मूल रूप से गलत तरीके से गलत तरीके से गलत तरीके से गलत तरीके से गलत हूं। – psychotik

6

loadView विधि सुपर नहीं बुलाना चाहिए। [सुपर लोड व्यू] को हटाने का प्रयास करें; और यह आपकी समस्या को अच्छी तरह से हल कर सकता है। अन्य ओवरराइड व्यू विधियों (viewDidLoad, viewWillAppear इत्यादि) सुपर को ठीक ठीक कह सकते हैं।

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

पुष्टि करने के लिए

: पर दस्तावेज़ देखें।

+0

यह लोडव्यू में स्पष्ट रूप से बताता है: "इस विधि के आपके कस्टम कार्यान्वयन को सुपर कॉल नहीं करना चाहिए" – Eiko

+0

यह समस्या नहीं है, लेकिन नोट के लिए धन्यवाद। – psychotik

+1

दिलचस्प बात यह है कि UITableViewController क्लास संदर्भ में कहा गया है, "आप लोड व्यू या किसी अन्य सुपरक्लास विधि को ओवरराइड कर सकते हैं, लेकिन यदि आप विधि के सुपरक्लास कार्यान्वयन को आम तौर पर पहली विधि कॉल के रूप में आमंत्रित करना सुनिश्चित करते हैं।" – cduhn

-1

तालिका दृश्य पर एक रीलोडडेटा करने से

+0

अरे, -1 वोटों के लिए धन्यवाद, लेकिन मैंने पहले देखा है कि ज्यादातर सही टेबलव्यू उनके हेडर खो देते हैं, केवल टेबल रीलोड करके हल किया जा सकता है। –

0

चौड़ाई और ऊंचाई क्या हो सकती है? क्या यह संभव है कि स्मृति स्मृति के बाद वे शून्य हों?

+0

अच्छा विचार - मैंने सत्यापित किया कि वे स्मृति चेतावनी के बाद मान्य हैं। – psychotik

0

सामान्य तरीका है, आईओएस मेमोरी को कम करने के लिए मेमोरी को कम करने के लिए इस तरह का उपयोग करता है, फिर यह कुछ यूआई तत्व मुक्त कर देगा, जो विधि 'didUnLoad' को भी बुलाएगा ... आपको हेडर को मुक्त करना होगा विधि में देखें 'didUnLoad', nil पर सेट करें, और फिर शीर्षलेख बनाने के लिए 'didLoad' विधि में देखें यदि यह शून्य है और फिर इसे तालिका में भी जोड़ें। आईओएस स्वचालित रूप से कुछ यूआई तत्वों को मुक्त कर देगा जबकि स्मृति चेतावनी का सामना करेंगे।

2

मुझे इस तरह की एक ही समस्या थी, हालांकि ऐसा लगता है कि ओपी की स्थिति उसके कोड के आधार पर नहीं है; अगर मैं किसी और के पास आता हूं तो मैं इसे यहां रखना चाहता हूं।

मैं एक उदाहरण चर में अपना हेडर व्यू बरकरार रखता हूं। मेरे विचार में डिडलोड मैं यह देखने के लिए जांचता हूं कि यह चर शून्य है, अगर ऐसा है तो मैं दृश्य बनाता हूं, इसे आवृत्ति चर रखता हूं और सेट करता हूं और tableHeaderView पर सेट करता हूं। समस्या यह है कि यह स्थिति केवल एक बार सच होगी, क्योंकि पहली बार जब मैं इसे बना देता हूं तो मेरा इंस्टेंस वैरिएबल कभी भी शून्य नहीं होगा; हालांकि, तालिका दृश्य tableHeaderView संपत्ति मेमोरी चेतावनी होने पर शून्य पर सेट हो जाएगी, इसलिए कोई हेडर व्यू नहीं होगा, भले ही मेरे पास अभी भी एक आवृत्ति चर में दृश्य हो।

समाधान या तो यह देखने के लिए जांच को बदलने के लिए था कि तालिका दृश्य tableHeaderView की संपत्ति शून्य है (और उसके बाद हर बार हेडर व्यू को फिर से बनाएं), या (क्योंकि इस मामले में मैं अभी भी यदि इवेंट-ब्लॉक के बाहर tableHeaderView पर असाइनमेंट को स्थानांतरित करने के लिए एक आवृत्ति चर में रखा गया दृश्य है, इस प्रकार हर बार viewDidLoad चलाया जाता है, तो हम हेडर व्यू को tableHeaderView पर सेट करने के लिए फिर से असाइन करना सुनिश्चित करेंगे।

+0

+1 @psychotik आवेदन प्रवाह के मामले में, 'loadView'' के बजाय 'viewDidLoad' में 'हेडर व्यू' कोड होना बेहतर है: 'loadView' को बस ऐसा करना चाहिए,' self.view' को वापस सेट किया गया है। एक बार 'लोड व्यू' रिटर्न हो जाने पर, नियंत्रक वर्ग पर 'viewDidLoad'' कहा जाता है, जहां आप अतिरिक्त गुण सेट कर सकते हैं। मैं कहूंगा कि 'viewDidLoad' में हेडर व्यू सेटिंग लागू करें, और इसे' viewDidUnload' में साफ़ करें। – darvids0n

0

मैं बस इसी तरह की समस्या में भाग गया जो मेमोरी चेतावनी प्राप्त करने के बाद uitableview के लिए मेरे कस्टम हेडर को पुनः लोड नहीं किया जा रहा था। मेरे वर्तमान कार्यान्वयन हेडर बनाने के लिए

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    if (_tableHeaderView == nil) 
    { 
     [[NSBundle mainBundle] loadNibNamed:@"DetailHeaderView" owner:self options:nil]; 
     self.tableView.tableHeaderView = _tableHeaderView; 
    } 
} 

है और समस्या मैं बस मेरी didReceiveMemoryWarning

_tableHeaderView = nil 

को यह लाइन जोड़ा ठीक करने के लिए और अब यह करने के बाद एक स्मृति चेतावनी भेज दिया जाता है पुन: लोड कर रहा है।
क्षमा करें अगर इसका उत्तर पहले ही दिया जा चुका है लेकिन मुझे मेरी समस्या के लिए स्पष्ट कट जवाब नहीं मिला और मुझे लगा कि मैं इसे अपनी स्थिति में किसी और के लिए यहां पॉप अप करूंगा।

मुबारक कोडिंग

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