दिलचस्प पोस्ट
स्क्रीन पर एक पॉपअप विंडो केंद्र? एक्लिप्स् एंड्रॉइड प्लग इन में "डिबग सर्टिफिकेट की अवधि समाप्त हो गई" त्रुटि खिड़कियों के रूपों में स्पलैश स्क्रीन को कैसे बनाया जाए? जावास्क्रिप्ट में JSON पार्स करें? जावा एरे अजीब संख्याओं को छपाई, और पाठ मूल समारोह में मूल के कार्यान्वयन की आवश्यकता है एक तत्व के लिए लागू सभी सीएसएस नियम खोजें TINYTEXT, टेक्स्ट, MEDIUMTEXT और LONGTEXT अधिकतम संग्रहण आकार आर में एक ही साजिश में दो रेखांकन प्लोट करें आपके गणितिका उपकरण बैग में क्या है? जीएसएम मॉडेम का उपयोग करते हुए सिस्टम। आईओओपोर्ट्स का उपयोग कर सी # कोड के माध्यम से एसएमएस भेजने में असमर्थ एक कॉलम (लम्बी प्रारूप) में माप स्तंभ (चौड़े प्रारूप) के एकाधिक सेटों को फिर से करना पॉसिक्स धागे और संकेत आगे c ++ में एक एन्यूम घोषित कर रहा है बाधाओं को सक्षम करने में विफल एक या अधिक पंक्तियों में गैर-अशक्त, अनूठे, या विदेशी-प्रमुख बाधाओं का उल्लंघन करने वाले मान शामिल हैं

UITableView स्थिर कोशिकाओं के लिए सेट। क्या कुछ कोशिकाएं प्रोग्राम को छिपाना संभव है?

UITableView स्थिर कोशिकाओं के लिए सेट।

क्या कुछ कोशिकाएं प्रोग्राम को छिपाना संभव है?

वेब के समाधान से एकत्रित समाधान "UITableView स्थिर कोशिकाओं के लिए सेट। क्या कुछ कोशिकाएं प्रोग्राम को छिपाना संभव है?"

आप इस समाधान की तलाश कर रहे हैं:

स्टेटिकडेटाटेबल दृश्य नियंत्रक 2.0

https://github.com/xelvenone/StaticDataTableViewController

जो एनीमेशन के साथ या इसके बिना किसी भी स्थिर सेल (एस) को दिखा / छिपाना / पुनः लोड कर सकता है!

 [self cell:self.outletToMyStaticCell1 setHidden:hide]; [self cell:self.outletToMyStaticCell2 setHidden:hide]; [self reloadDataAnimated:YES]; 

हमेशा (केवल पुनः लोडडेटाअनिमित: हाँ / सं) उपयोग करने के लिए नोट (सीधे [self.tableView reloadData] को कॉल न करें)

यूआईटेबल में स्थिर कोशिकाओं को छिपाने के लिए:

  1. इस विधि को जोड़ें :

आपके UITableView नियंत्रक प्रतिनिधि वर्ग में:

उद्देश्य सी:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell* cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; if(cell == self.cellYouWantToHide) return 0; //set the hidden cell's height to 0 return [super tableView:tableView heightForRowAtIndexPath:indexPath]; } 

स्विफ्ट:

 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { var cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath) if cell == self.cellYouWantToHide { return 0 } return super.tableView(tableView, heightForRowAtIndexPath: indexPath) } 

इस पद्धति को यूआईटेबल में प्रत्येक सेल के लिए बुलाया जाएगा। एक बार सेल जिसे आप छिपाना चाहते हैं, के लिए इसे कॉल करने के बाद, हम इसकी ऊंचाई 0 पर सेट करते हैं। हम इसके लिए एक आउटलेट बनाकर लक्ष्य सेल की पहचान करते हैं:

  1. डिजाइनर में, उस सेल (सेल) के लिए एक आउटलेट बनाएं जिसे आप छिपाना चाहते हैं इस तरह के एक सेल के लिए आउटलेट को "सेल वेलवट टूहाइड" कहा जाता है
  2. जिन कक्षों को आप छिपाना चाहते हैं उनके लिए आईबी में "क्लिप सबव्यूज़" की जांच करें जिन कोशिकाओं को आप छुपा रहे हैं वे क्लिपटौबॉन्स = हाँ हैं। अन्यथा पाठ UITableView में ढेर होगा।

मेरा समाधान गैरेथ के समान दिशा में जाता है, हालांकि मैं कुछ चीजें अलग तरीके से करता हूं।

यहाँ जाता हैं:

1. कोशिकाओं को छिपाएं

कक्षों को सीधे छिपाने का कोई रास्ता नहीं है UITableViewController डेटा स्रोत है जो स्थिर कोशिकाओं को प्रदान करता है, और वर्तमान में यह कहने का कोई तरीका नहीं है कि "सेल x प्रदान न करें" इसलिए हमें अपना डेटा स्रोत प्रदान करना होगा, जो कि स्थिर कोशिकाओं को प्राप्त करने के लिए UITableViewController प्रतिनिधि हैं।

सबसे आसान तरीका है UITableViewController subclass, और सभी विधियों को ओवरराइड करने की आवश्यकता है जो अलग ढंग से व्यवहार करने की आवश्यकता है जब कोशिकाओं छुपा

सरलतम मामले में (एकल खंड तालिका, सभी कोशिकाओं की एक ही ऊंचाई है), यह इस तरह से होगा:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [super tableView:tableView numberOfRowsInSection:section] - numberOfCellsHidden; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // Recalculate indexPath based on hidden cells indexPath = [self offsetIndexPath:indexPath]; return [super tableView:tableView cellForRowAtIndexPath:indexPath]; } - (NSIndexPath*)offsetIndexPath:(NSIndexPath*)indexPath { int offsetSection = indexPath.section; // Also offset section if you intend to hide whole sections int numberOfCellsHiddenAbove = ... // Calculate how many cells are hidden above the given indexPath.row int offsetRow = indexPath.row + numberOfCellsHiddenAbove; return [NSIndexPath indexPathForRow:offsetRow inSection:offsetSection]; } 

यदि आपकी तालिका में एकाधिक अनुभाग हैं, या कक्षों में ऊंचाइयों की भिन्नता है, तो आपको अधिक विधियों को ओवरराइड करना होगा। यही सिद्धांत यहां पर लागू होता है: सुपर को नियुक्त करने से पहले आपको इंडेक्सपाथ, सेक्शन और पंक्ति को ऑफसेट करना होगा।

यह भी ध्यान रखें कि विधियों के लिए didSelectRowAtIndexPath: पैरामीटर की तरह didSelectRowAtIndexPath: एक ही सेल के लिए अलग होगा, राज्य के आधार पर (छिपी कोशिकाओं की संख्या)। इसलिए शायद यह हमेशा एक अच्छा विचार है कि वह किसी भी सूचकांक पैरामीटर को ऑफसेट करे और इन मानों के साथ काम करें।

2. परिवर्तन को चेतन करें

जैसा कि गैरेथ पहले ही reloadSections:withRowAnimation: चुका है, यदि आप reloadSections:withRowAnimation: परिवर्तनों को चेतन करते हैं, तो आपको बड़ी गलतियां reloadSections:withRowAnimation: विधि।

मुझे पता चला कि यदि आप पुनः reloadData: कहते हैं reloadData: तत्काल बाद, एनीमेशन बहुत सुधार हुआ है (केवल छोटी सी मुकाबला शेष)। एनीमेशन के बाद तालिका ठीक से प्रदर्शित होती है

तो मैं क्या कर रहा हूं:

 - (void)changeState { // Change state so cells are hidden/unhidden ... // Reload all sections NSIndexSet* reloadSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [self numberOfSectionsInTableView:tableView])]; [tableView reloadSections:reloadSet withRowAnimation:UITableViewRowAnimationAutomatic]; [tableView reloadData]; } 

सबसे अच्छा तरीका निम्न ब्लॉग http://ali-reynolds.com/2013/06/29/hide-cells-in-static-table-view/ में वर्णित है।

इंटरफ़ेस बिल्डर में सामान्य रूप में अपने स्थिर तालिका दृश्य को डिज़ाइन करें – सभी संभावित छुपे हुए कक्षों के साथ पूर्ण करें लेकिन एक चीज आप को हर संभावित सेल के लिए करना चाहिए जिसे आप छिपाना चाहते हैं – सेल की "क्लिप सबव्यूज़" की संपत्ति की जांच करें, अन्यथा सेल की सामग्री गायब नहीं होती जब आप कोशिश करते हैं और इसे छुपते हैं (इसकी ऊंचाई कम करके – और बाद में)।

अतः – आपके पास एक सेल में एक स्विच होता है और स्विच को कुछ स्थिर कोशिकाओं को छिपाना और दिखाया जाता है। इसे IBAction तक हुक करें और इसमें ऐसा करें:

 [self.tableView beginUpdates]; [self.tableView endUpdates]; 

इससे आपको दिखाई देने वाले और गायब होने वाले कोशिकाओं के लिए अच्छे एनिमेशन मिलेंगे। अब निम्नलिखित तालिका दृश्य प्रतिनिधि विधि को लागू करें:

 - (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 1 && indexPath.row == 1) { // This is the cell to hide - change as you need // Show or hide cell if (self.mySwitch.on) { return 44; // Show the cell - adjust the height as you need } else { return 0; // Hide the cell } } return 44; } 

और बस। स्विच को फ्लिप करें और सेल छुपाता है और एक अच्छा, चिकनी एनीमेशन के साथ फिर से दिखाई देता है।

मैं एक विकल्प के साथ आया था जो वास्तव में वर्गों को छुपाता है और उन्हें हटा नहीं देता। मैंने हेनिंग 77 के दृष्टिकोण की कोशिश की, लेकिन जब मैंने स्थिर UITableView के वर्गों की संख्या में परिवर्तन किया तो मैंने समस्याओं में चल रखा था इस पद्धति ने मेरे लिए वास्तव में अच्छा काम किया है, लेकिन मैं मुख्य रूप से पंक्तियों के बजाय वर्गों को छुपाने की कोशिश कर रहा हूं। मैं उड़ने पर कुछ पंक्तियों को सफलतापूर्वक हटा रहा हूं, लेकिन यह बहुत मेहनती है, इसलिए मैंने उन चीजों को समूह में चलाने की कोशिश की है जिनके लिए मुझे दिखाने या छिपाने की आवश्यकता है I यहां एक उदाहरण है कि मैं कैसे छुपा रहा हूं:

सबसे पहले मैं एक NSMutableArray संपत्ति घोषित

 @property (nonatomic, strong) NSMutableArray *hiddenSections; 

ViewDidLoad (या अपने डेटा की पूछताछ के बाद) में आप उन वर्गों को जोड़ सकते हैं, जिन्हें आप सरणी में छुपाना चाहते हैं।

 - (void)viewDidLoad { hiddenSections = [NSMutableArray new]; if(some piece of data is empty){ // Add index of section that should be hidden [self.hiddenSections addObject:[NSNumber numberWithInt:1]]; } ... add as many sections to the array as needed [self.tableView reloadData]; } 

उसके बाद TableView प्रतिनिधि विधियों का पालन करें

 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { if([self.hiddenSections containsObject:[NSNumber numberWithInt:section]]){ return nil; } return [super tableView:tableView titleForHeaderInSection:section]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if([self.hiddenSections containsObject:[NSNumber numberWithInt:indexPath.section]]){ return 0; } return [super tableView:tableView heightForRowAtIndexPath:[self offsetIndexPath:indexPath]]; } - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if([self.hiddenSections containsObject:[NSNumber numberWithInt:indexPath.section]]){ [cell setHidden:YES]; } } 

फिर छिपे हुए वर्गों के लिए हेडर और पाद लेख की ऊंचाई 1 सेट करें, क्योंकि आप ऊँचाई 0 पर सेट नहीं कर सकते हैं। यह एक अतिरिक्त 2 पिक्सेल अंतरिक्ष की वजह से है, लेकिन हम अगले दृश्यमान हेडर की ऊंचाई समायोजित कर सकते हैं।

 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { CGFloat height = [super tableView:tableView heightForHeaderInSection:section]; if([self.hiddenSections containsObject:[NSNumber numberWithInt:section]]){ height = 1; // Can't be zero } else if([self tableView:tableView titleForHeaderInSection:section] == nil){ // Only adjust if title is nil // Adjust height for previous hidden sections CGFloat adjust = 0; for(int i = (section - 1); i >= 0; i--){ if([self.hiddenSections containsObject:[NSNumber numberWithInt:i]]){ adjust = adjust + 2; } else { break; } } if(adjust > 0) { if(height == -1){ height = self.tableView.sectionHeaderHeight; } height = height - adjust; if(height < 1){ height = 1; } } } return height; } -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { if([self.hiddenSections containsObject:[NSNumber numberWithInt:section]]){ return 1; } return [super tableView:tableView heightForFooterInSection:section]; } 

उसके बाद, यदि आपके पास छिपाने के लिए विशिष्ट पंक्तियाँ हैं, तो आप संख्या को समायोजित कर सकते हैं ओफ्रोज़ इनसाइट्स और पंक्तियों को सेलफोररौएटीएंडएक्सपैथ में वापस कर दिया जाता है। इस उदाहरण में यहां मेरे पास एक ऐसा खंड है जिसमें तीन पंक्तियाँ हैं, जहां कोई भी तीन खाली हो सकता है और इसे हटाया जाना चाहिए।

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { NSInteger rows = [super tableView:tableView numberOfRowsInSection:section]; if(self.organization != nil){ if(section == 5){ // Contact if([self.organization objectForKey:@"Phone"] == [NSNull null]){ rows--; } if([self.organization objectForKey:@"Email"] == [NSNull null]){ rows--; } if([self.organization objectForKey:@"City"] == [NSNull null]){ rows--; } } } return rows; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { return [super tableView:tableView cellForRowAtIndexPath:[self offsetIndexPath:indexPath]]; } 

उन पंक्तियों के लिए सूचकांक की गणना करने के लिए इस ऑफसेट इंडेक्सपैथ का उपयोग करें जहां आप पंक्तियों को सशर्त रूप से निकाल रहे हैं यदि आप केवल वर्ग छुपा रहे हैं तो इसकी आवश्यकता नहीं है

 - (NSIndexPath *)offsetIndexPath:(NSIndexPath*)indexPath { int row = indexPath.row; if(self.organization != nil){ if(indexPath.section == 5){ // Adjust row to return based on which rows before are hidden if(indexPath.row == 0 && [self.organization objectForKey:@"Phone"] == [NSNull null] && [self.organization objectForKey:@"Email"] != [NSNull null]){ row++; } else if(indexPath.row == 0 && [self.organization objectForKey:@"Phone"] == [NSNull null] && [self.organization objectForKey:@"Address"] != [NSNull null]){ row = row + 2; } else if(indexPath.row == 1 && [self.organization objectForKey:@"Phone"] != [NSNull null] && [self.organization objectForKey:@"Email"] == [NSNull null]){ row++; } else if(indexPath.row == 1 && [self.organization objectForKey:@"Phone"] == [NSNull null] && [self.organization objectForKey:@"Email"] != [NSNull null]){ row++; } } } NSIndexPath *offsetPath = [NSIndexPath indexPathForRow:row inSection:indexPath.section]; return offsetPath; } 

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

हां, यह निश्चित रूप से संभव है, हालांकि मैं इस समय एक ही मुद्दे के साथ संघर्ष कर रहा हूं। मैं कोशिकाओं को छिपाने में कामयाब रहा हूँ और सबकुछ ठीक काम करता है, लेकिन मैं इस समय चीज़ों को बड़े करीने से चेतन नहीं कर सकता यहां मैंने पाया है:

मैं प्रथम अनुभाग की पहली पंक्ति में चालू / बंद स्विच की स्थिति के आधार पर पंक्तियों को छिपा रहा हूं। यदि स्विच चालू है, तो उसी अनुभाग में 1 पंक्ति नीचे है, अन्यथा 2 अलग-अलग पंक्तियां हैं

मेरे पास एक चयनकर्ता होता है जब स्विच को टॉगल किया जाता है, और मैं यह निर्धारित करने के लिए एक चर सेट करता हूं कि मैं किस राज्य में हूं। फिर मैं कॉल करता हूं:

 [[self tableView] reloadData]; 

मैं मेज पर ओवरराइड दृश्य: willDisplayCell: forRowAtIndexPath: फ़ंक्शन और यदि कक्ष छुपा हुआ है, तो मैं ऐसा करता हूं:

 [cell setHidden:YES]; 

वह सेल और उसकी सामग्री को छुपाता है, लेकिन उस स्थान को नहीं निकालता है जो इसे व्यस्त है।

स्थान को निकालने के लिए, तालिका दृश्य को ओवरराइड करें : ऊँचाईफ़ोअरअटइंडपैथ: फ़ंक्शन और उन पंक्तियों के लिए 0 जो वापस छुपाए जाने चाहिए।

आपको तालिका दृश्य को ओवरराइड करना भी आवश्यक है : numberOfRowsInSection: और उस अनुभाग में पंक्तियों की संख्या लौटाएं। आपको यहाँ कुछ अजीब करना होगा ताकि यदि आपकी मेज एक समूहीकृत शैली है तो गोल कोनों सही कोशिकाओं पर होती हैं। मेरी स्थैतिक तालिका में खंड के लिए कोशिकाओं का पूरा सेट होता है, इसलिए विकल्प वाला पहला सेल होता है, फिर ओएनआई राज्य के विकल्प के लिए 1 सेल और OFF राज्य विकल्प के लिए 2 अधिक कक्ष, कुल 4 कोशिकाएं। जब विकल्प चालू होगा, मुझे 4 लौटना होगा, इसमें छिपे हुए विकल्प शामिल हैं, ताकि आखिरी विकल्प का प्रदर्शित किया गया गोल बॉक्स हो। जब विकल्प बंद हो जाता है, तो पिछले दो विकल्प प्रदर्शित नहीं होते हैं इसलिए मैं 2 लौटाता हूं। यह सब घबराहट महसूस करता है। माफ करना, अगर यह बहुत स्पष्ट नहीं है, तो इसका वर्णन करना मुश्किल है। बस सेटअप को वर्णन करने के लिए, यह आईबी में तालिका अनुभाग का निर्माण होता है:

  • पंक्ति 0: चालू / बंद स्विच के साथ विकल्प
  • पंक्ति 1: जब विकल्प चालू होता है तो प्रदर्शित होता है
  • पंक्ति 2: विकल्प बंद होने पर प्रदर्शित होता है
  • पंक्ति 3: विकल्प बंद होने पर प्रदर्शित होता है

इसलिए जब विकल्प तालिका पर होता है तो दो पंक्तियों की रिपोर्ट होती है:

  • पंक्ति 0: चालू / बंद स्विच के साथ विकल्प
  • पंक्ति 1: जब विकल्प चालू होता है तो प्रदर्शित होता है

जब विकल्प बंद हो जाता है तो तालिका चार पंक्तियों की रिपोर्ट करती है:

  • पंक्ति 0: चालू / बंद स्विच के साथ विकल्प
  • पंक्ति 1: जब विकल्प चालू होता है तो प्रदर्शित होता है
  • पंक्ति 2: विकल्प बंद होने पर प्रदर्शित होता है
  • पंक्ति 3: विकल्प बंद होने पर प्रदर्शित होता है

यह दृष्टिकोण कई कारणों से सही नहीं लग रहा है, जहां तक ​​मेरा प्रयोग अब तक हुआ है, तो कृपया मुझे बताएं कि क्या आपको एक बेहतर तरीका मिल जाएगा। मैंने जो समस्याओं को अभी तक देखा है:

  • तालिका को बताते हुए यह गलत लगता है कि पंक्तियों की संख्या अंतर्निहित डेटा में संभवत: निहित है।

  • मैं परिवर्तन को चेतन नहीं कर सकता मैंने टेबल व्यू का उपयोग करने की कोशिश की है : पुनः लोड करेंसेक्शनः साथरेवलएनिमेशन: फिर से लोड किए जाने वाले डेटा के बजाय और परिणाम समझ में नहीं आता है, मैं अब भी यह काम करने की कोशिश कर रहा हूं। वर्तमान में जो दिखता है वह तालिकाव्यू सही पंक्तियों का अद्यतन नहीं करता है, इसलिए एक छिपी रहती है जिसे प्रदर्शित किया जाना चाहिए और पहले पंक्ति के नीचे शून्य छोड़ दिया गया है मुझे लगता है कि यह अंतर्निहित डेटा के बारे में पहले बिंदु से संबंधित हो सकता है

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

बाहर निकलता है, आप एक स्थिर UITableView – और एनीमेशन के साथ में कोशिकाओं को छुपा सकते हैं और दिखा सकते हैं। और यह पूरा करना कठिन नहीं है।

डेमो प्रोजेक्ट

डेमो प्रोजेक्ट वीडियो

सार:

  1. Use tableView:heightForRowAtIndexPath: किसी राज्य पर गतिशील रूप से सेल ऊंचाइयों को निर्दिष्ट करने के लिए।
  2. जब राज्य को कॉल करने से छुपाते / दिखाते हुए एनीमेट सेल को बदलता है tableView.beginUpdates();tableView.endUpdates()
  3. tableView.cellForRowAtIndexPath: कॉल न करें tableView.cellForRowAtIndexPath: tableView:heightForRowAtIndexPath: अंदर देखें tableView:heightForRowAtIndexPath: :। कक्षों को अंतर करने के लिए कैश्ड सूचकांक का उपयोग करें
  4. कोशिकाओं को छिपाना न करें बजाय Xcode में "क्लिप सबव्यूज़" संपत्ति सेट करें
  5. एक अच्छा छुपा एनीमेशन प्राप्त करने के लिए कस्टम कोशिकाओं का उपयोग करें (सादा आदि नहीं) साथ ही, जब भी सेल ऊँचाई == 0 होती है, तब उसके लिए ऑटो लेआउट सही तरीके से संभाल लें।

मेरे ब्लॉग में अधिक जानकारी (रूसी भाषा)

  1. डिजाइनर में, उस सेल (सेल) के लिए एक आउटलेट बनाएं जिसे आप छिपाना चाहते हैं उदाहरण के लिए आप 'सेलऑन' को छिपाना चाहते हैं, इसलिए दृश्य में डीडलोड () ऐसा करें

cellOneOutlet.hidden = सच

अब नीचे की विधि को ओवरराइड करें, जांचें कि कौन से कक्ष स्थिति छिपी है और उन सेल (सेल) के लिए ऊँचाई 0 वापस आती है। यह कई मायनों में से एक है जिसे आप स्थिर तालिका में किसी भी कक्ष को तेजी से छिपा सकते हैं।

 override func tableView(tableView: UITableView, heightForRowAtIndexPathindexPath: NSIndexPath) -> CGFloat { let tableViewCell = super.tableView(tableView,cellForRowAtIndexPath: indexPath) if tableViewCell.hidden == true { return 0 } else{ return super.tableView(tableView, heightForRowAtIndexPath: indexPath) } } 

ऑटो लेआउट मुद्दों के कारण ऊपर दिए गए उत्तर, जो कि छुपाते हैं / दिखाते हैं, पंक्ति बदलते हैं, या ऑटो लेआउट प्रतिबंधों के साथ गड़बड़ मेरे लिए काम नहीं कर रहे थे कोड असहनीय हो गया।

एक साधारण स्थिर तालिका के लिए, मेरे लिए सबसे अच्छा काम क्या था:

  1. स्थिर तालिका में हर सेल के लिए एक आउटलेट बनाएं
  2. केवल दिखाने के लिए कक्षों के आउटलेट के साथ एक सरणी बनाएँ
  3. सरणी से सेल लौटने के लिए सेलफ़ोरो अटूटपैथ की ओवरराइड करें
  4. सरणी की गिनती वापस करने के लिए संख्या ओवरराइड ओफ़्रॉ इनसैक्शन
  5. यह निर्धारित करने के लिए एक विधि लागू करें कि उस कक्ष में कौन सी कोशिकाओं की आवश्यकता हो, और उस विधि को जब आवश्यक हो, कॉल करें, और फिर पुनः लोड करेंडेटा।

यहां मेरे टेबल व्यू नियंत्रक का एक उदाहरण है:

 @IBOutlet weak var titleCell: UITableViewCell! @IBOutlet weak var nagCell: UITableViewCell! @IBOutlet weak var categoryCell: UITableViewCell! var cellsToShow: [UITableViewCell] = [] override func viewDidLoad() { super.viewDidLoad() determinCellsToShow() } func determinCellsToShow() { if detail!.duration.type != nil { cellsToShow = [titleCell, nagCell, categoryCell] } else { cellsToShow = [titleCell, categoryCell] } } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { return cellsToShow[indexPath.row] } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return cellsToShow.count } 

मुझे स्थैतिक तालिका में कोशिकाओं को छुपाने के लिए एक समाधान मिला।

 // Class for wrapping Objective-C block typedef BOOL (^HidableCellVisibilityFunctor)(); @interface BlockExecutor : NSObject @property (strong,nonatomic) HidableCellVisibilityFunctor block; + (BlockExecutor*)executorWithBlock:(HidableCellVisibilityFunctor)block; @end @implementation BlockExecutor @synthesize block = _block; + (BlockExecutor*)executorWithBlock:(HidableCellVisibilityFunctor)block { BlockExecutor * executor = [[BlockExecutor alloc] init]; executor.block = block; return executor; } @end 

केवल एक अतिरिक्त शब्दकोश आवश्यक है:

 @interface MyTableViewController () @property (nonatomic) NSMutableDictionary * hidableCellsDict; @property (weak, nonatomic) IBOutlet UISwitch * birthdaySwitch; @end 

और MyTableViewController के कार्यान्वयन को देखें दृश्यमान और अदृश्य इंडेक्स के बीच इंडेक्सपाथ कन्वर्ट करने के लिए हमें दो तरीकों की आवश्यकता है …

 - (NSIndexPath*)recoverIndexPath:(NSIndexPath *)indexPath { int rowDelta = 0; for (NSIndexPath * ip in [[self.hidableCellsDict allKeys] sortedArrayUsingSelector:@selector(compare:)]) { BlockExecutor * executor = [self.hidableCellsDict objectForKey:ip]; if (ip.section == indexPath.section && ip.row <= indexPath.row + rowDelta && !executor.block()) { rowDelta++; } } return [NSIndexPath indexPathForRow:indexPath.row+rowDelta inSection:indexPath.section]; } - (NSIndexPath*)mapToNewIndexPath:(NSIndexPath *)indexPath { int rowDelta = 0; for (NSIndexPath * ip in [[self.hidableCellsDict allKeys] sortedArrayUsingSelector:@selector(compare:)]) { BlockExecutor * executor = [self.hidableCellsDict objectForKey:ip]; if (ip.section == indexPath.section && ip.row < indexPath.row - rowDelta && !executor.block()) { rowDelta++; } } return [NSIndexPath indexPathForRow:indexPath.row-rowDelta inSection:indexPath.section]; } 

UISwitch मान बदलने पर एक IBAction:

 - (IBAction)birthdaySwitchChanged:(id)sender { NSIndexPath * indexPath = [self mapToNewIndexPath:[NSIndexPath indexPathForRow:1 inSection:1]]; if (self.birthdaySwitch.on) [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; else [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } 

कुछ UITableViewDataSource और UITableViewDelegate विधियों:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { int numberOfRows = [super tableView:tableView numberOfRowsInSection:section]; for (NSIndexPath * indexPath in [self.hidableCellsDict allKeys]) if (indexPath.section == section) { BlockExecutor * executor = [self.hidableCellsDict objectForKey:indexPath]; numberOfRows -= (executor.block()?0:1); } return numberOfRows; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { indexPath = [self recoverIndexPath:indexPath]; return [super tableView:tableView cellForRowAtIndexPath:indexPath]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { indexPath = [self recoverIndexPath:indexPath]; return [super tableView:tableView heightForRowAtIndexPath:indexPath]; } - (void)viewDidLoad { [super viewDidLoad]; // initializing dictionary self.hidableCellsDict = [NSMutableDictionary dictionary]; [self.hidableCellsDict setObject:[BlockExecutor executorWithBlock:^(){return self.birthdaySwitch.on;}] forKey:[NSIndexPath indexPathForRow:1 inSection:1]]; } - (void)viewDidUnload { [self setBirthdaySwitch:nil]; [super viewDidUnload]; } @end 

तेजी से उत्तर दें:

अपने तालिका दृश्य नियंत्रक में निम्नलिखित विधि जोड़ें:

 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return indexPathOfCellYouWantToHide == indexPath ? 0 : super.tableView(tableView, heightForRowAtIndexPath: indexPath) } 

यदि तालिका व्यू उस सेल को आकर्षित करने की कोशिश करता है जिसे आप छिपाना चाहते हैं, तो यह उसे प्रदर्शित नहीं करेगा क्योंकि इसकी ऊंचाई ऊपर की ओर से 0pt पर सेट हो जाएगी, बाकी सब कुछ अनछुए रहता है।

कृपया ध्यान दें कि indexPathOfCellYouWantToHide को किसी भी समय बदला जा सकता है 🙂

स्विफ्ट 2.2 में, मैंने कुछ जवाब जोड़ दिए हैं I

स्टोरीबोर्ड से एक आउटलेट बनाएं जिससे कि आप अपने स्थिर कैल से लिंक कर सकें।

 @IBOutlet weak var updateStaticCell: UITableViewCell! override func viewDidLoad() { ... updateStaticCell.hidden = true } override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { if indexPath.row == 0 { return 0 } else { return super.tableView(tableView, heightForRowAtIndexPath: indexPath) } } 

मैं अपना पहला सेल छिपाना चाहता हूं ताकि मैं ऊपर वर्णित ऊंचाई 0 पर सेट करूँ।

सबसे आसान परिदृश्य के लिए जब आप तालिका दृश्य के बहुत नीचे कोशिकाओं को छुपते हैं, तो आप सेल को छिपाने के बाद तालिका दृश्य की सामग्री को समायोजित कर सकते हैं:

 - (void)adjustBottomInsetForHiddenSections:(NSInteger)numberOfHiddenSections { CGFloat bottomInset = numberOfHiddenSections * 44.0; // or any other 'magic number self.tableView.contentInset = UIEdgeInsetsMake(self.tableView.contentInset.top, self.tableView.contentInset.left, -bottomInset, self.tableView.contentInset.right); } 

यह https://github.com/k06a/ABStaticTableViewController का उपयोग करने का यह नया तरीका है

 NSIndexPath *ip = [NSIndexPath indexPathForRow:1 section:1]; [self deleteRowsAtIndexPaths:@[ip] withRowAnimation:UITableViewRowAnimationFade] 

K06a ( https://github.com/k06a/ABStaticTableViewController ) से समाधान बेहतर है क्योंकि यह पूरे अनुभाग को कोष्ठकों और पाद लेखों सहित छुपाता है, जहां यह समाधान ( https://github.com/peterpaulis/StaticDataTableViewController ) पाद लेख को छोड़कर सब कुछ छुपाता है

संपादित करें

यदि आप StaticDataTableViewController में पाद लेख छिपाना चाहते हैं, तो मुझे अभी समाधान मिल गया है यह आपको StaticTableViewController.m फ़ाइल में प्रतिलिपि बनाने की आवश्यकता है:

 - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { return nil; } else { return [super tableView:tableView titleForFooterInSection:section]; } } - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { CGFloat height = [super tableView:tableView heightForFooterInSection:section]; if (self.originalTable == nil) { return height; } if (!self.hideSectionsWithHiddenRows) { return height; } OriginalSection * os = self.originalTable.sections[section]; if ([os numberOfVissibleRows] == 0) { //return 0; return CGFLOAT_MIN; } else { return height; } //return 0; return CGFLOAT_MIN; } 

निश्चित रूप से आप कर सकते हैं सबसे पहले, अपने टेबल पर वापस जाएं आप जो कक्ष दिखाना चाहते हैं, उनके नंबर देखें तो super को अपने स्टोरीबोर्ड से कुछ सेल हासिल करने के लिए कॉल करें और इसे तालिका के लिए लौटाएं देखें:

 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.mode.numberOfCells() } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = super.tableView(tableView, cellForRowAtIndexPath: self.mode.indexPathForIndexPath(indexPath)) return cell } 

यदि आपके कक्षों में अलग अलग है तो इसे भी वापस लौटाएं:

 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return super.tableView(tableView, heightForRowAtIndexPath: self.mode.indexPathForIndexPath(indexPath)) } 

@ सलेह मासुम समाधान के अलावा:

यदि आप स्वत: लेआउट की त्रुटियां प्राप्त करते हैं , तो आप केवल tableViewCell.contentView से बाधाओं को निकाल सकते हैं

स्विफ्ट 3:

 override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { let tableViewCell = super.tableView(tableView, cellForRowAt: indexPath) if tableViewCell.isHidden == true { tableViewCell.contentView.removeConstraints(tableViewCell.contentView.constraints) return 0 } else{ return super.tableView(tableView, heightForRowAt: indexPath) } } 

यह समाधान आपके ऐप के प्रवाह पर निर्भर करता है यदि आप एक ही दृश्य नियंत्रक उदाहरण में कक्ष को दिखाना / छुपाना चाहते हैं तो यह सर्वोत्तम विकल्प नहीं हो सकता, क्योंकि यह बाधाओं को हटा देता है

सरल आईओएस 11 और आईबी / स्टोरीबोर्ड संगत पद्धति

आईओएस 11 के लिए, मुझे पता चला कि मोहम्मद सालेह के उत्तर का एक संशोधित संस्करण सबसे अच्छा काम करता है, एप्पल के प्रलेखन के आधार पर कुछ सुधार के साथ। यह अच्छी तरह से उत्साहित है, किसी भी बदसूरत हैक्स या हार्डकोड मानों से बचा जाता है, और पहले से ही इंटरफ़ेस बिल्डर में सेट की गई पंक्ति ऊंचाइयों का उपयोग करता है

मूल अवधारणा किसी भी छिपी हुई पंक्तियों के लिए पंक्ति ऊंचाई 0 पर सेट करना है। फिर एक एनीमेशन ट्रिगर करने के लिए tableView.performBatchUpdates का उपयोग करें जो लगातार काम करता है।

सेल ऊंचाई निर्धारित करें

 override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath == indexPathOfHiddenCell { if cellIsHidden { return 0 } } // Calling super will use the height set in your storyboard, avoiding hardcoded values return super.tableView(tableView, heightForRowAt: indexPath) } 

आप यह सुनिश्चित करना चाहते हैं कि cellIsHidden और cellIsHidden आपके उपयोग के मामले में ठीक से सेट किए गए हैं। मेरे कोड के लिए वे मेरे तालिका दृश्य नियंत्रक पर गुण हैं I

सेल टॉगलिंग

किसी भी विधि में दृश्यता (संभवतः एक बटन कार्रवाई या didSelectRow ) को नियंत्रित करता है, एक performBatchUpdates भीतर cellIsHidden राज्य टॉगल करता है, performBatchUpdates ब्लॉक:

 tableView.performBatchUpdates({ // Use self to capture for block self.cellIsHidden = !self.cellIsHidden }, completion: nil) 

ऐप्पल की performBatchUpdates ऊपर performBatchUpdates की अनुशंसा करता performBatchUpdates / performBatchUpdates जब भी संभव हो।

स्विफ्ट 4:

 override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { var height = super.tableView(tableView, heightForRowAt: indexPath) if (indexPath.row == HIDDENROW) { height = 0.0 } return height }