2012-09-01 17 views
7

के साथ UITableView में "कोई पंक्ति नहीं मिली" संदेश प्रदर्शित करना मैंने एक आईफोन ऐप लागू किया है जो UITableViewController/UITableView और कोर डेटा का उपयोग करता है। इसके अलावा, मैं तालिका डेटा का प्रबंधन करने के लिए एक NSFetchedResultsController का उपयोग करता हूं। यह सब बहुत सीधे आगे था और महान काम करता है। मैंने तब फैसला किया कि मुझे UITableView में एक संदेश प्रदर्शित करना चाहिए जब कोई पंक्तियां नहीं मिली/पुनर्प्राप्त की गईं। इस पर शोध करने के बाद, ऐसा प्रतीत होता है कि ऐसा करने का सबसे अच्छा तरीका (शायद एकमात्र तरीका) एक "डमी" सेल वापस करना था जिसमें संदेश शामिल था। हालांकि, जब मैं ऐसा करता हूं, तो मुझे रनटाइम सिस्टम से एक गंदाग्राम मिलता है जो डेटा असंगतताओं के बारे में शिकायत करता है (और सही तरीके से): "अमान्य अद्यतन: खंडों की अवैध संख्या। तालिका दृश्य में निहित अनुभागों की संख्या ..."। यहाँ प्रासंगिक कोड है: इसी तरह के सवाल सेकोर डेटा

- (NSInteger) numberOfSectionsInTableView: (UITableView *)tableView 
{ 
    if ([[self.fetchedResultsController fetchedObjects] count] == 0) return 1; 
    return [[self.fetchedResultsController sections] count]; 
} 

- (NSInteger) tableView: (UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if ([[self.fetchedResultsController fetchedObjects] count] == 0) return 1; 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex: section]; 
    return [sectionInfo numberOfObjects]; 
} 

- (UITableViewCell *) tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath 
{ 
    if ([[self.fetchedResultsController fetchedObjects] count] == 0) { 
     UITableViewCell *cell = [[UITableViewCell alloc] init]; 
     cell.textLabel.text = @"No widgets found."; 
     return cell; 
    } 

    STCellView *cell = (STCellView *)[tableView dequeueReusableCellWithIdentifier: @"ShieldCell"]; 
    [self configureCell: cell atIndexPath: indexPath]; 
    return cell; 
} 

मैंने पढ़ लिया है प्रतिक्रियाएं और ऐसा लगता है कि मैं

insertRowsAtIndexPaths: withRowAnimation: 

का उपयोग करना चाहिए मेरी तालिका में "डमी" संदेश पंक्ति सम्मिलित करने के लिए। हालांकि, इसका मतलब यह भी है कि वास्तविक पंक्ति डालने पर "डमी" पंक्ति को हटा दिया जाता है। मैं यह कर सकता हूं, लेकिन ऐसा लगता है कि इसे पूरा करने का एक आसान तरीका होना चाहिए। मैं बस इतना करना चाहता हूं, एक संदेश प्रदर्शित करना है जो इंगित करता है कि तालिका में कोई पंक्ति नहीं है (पर्याप्त सरल?)। तो, मेरा सवाल यह है: क्या "डमी" सेल दृष्टिकोण का उपयोग किए बिना UITableView में एक संदेश प्रदर्शित करने का कोई तरीका है या UITableViewController/NSFetchResulsController को मनाने के लिए कोई तरीका है कि यह केवल "डमी" पंक्ति है और उन्हें नहीं मिलना चाहिए इस बारे में परेशान है क्योंकि यह तालिका में एक वास्तविक पंक्ति (मेरे दृष्टिकोण से) नहीं है?

कोई भी सहायता जो आप प्रदान कर सकते हैं उसकी बहुत सराहना की जाएगी (मैं आईफोन विकास के लिए एक संघर्षशील नौसिखिया हूं और मैं सर्वोत्तम प्रथाओं को सीखना चाहता हूं)। धन्यवाद।

+2

इच्छित यूआई प्राप्त करने के लिए टेबलव्यू डेटासोर्स के साथ हैक करने की बजाय क्यों "टेबल नहीं मिला" संदेश को तालिकादृश्य शीर्षलेख में जोड़ने के बजाय क्यों नहीं? – Rog

+0

@Rog उपयोगी टिप। +1 –

+0

यदि आपके टेबल व्यू में केवल एक अनुभाग है तो यह सबसे अच्छा तरीका है। एकाधिक अनुभाग – Brett

उत्तर

12

इच्छित यूआई प्राप्त करने के लिए टेबलव्यू डेटासोर्स के साथ हैक करने की बजाय आपको तालिका दृश्य शीर्षलेख में "कोई पंक्ति नहीं मिली" संदेश जोड़ना चाहिए।

+0

यह सबसे साफ और सबसे अच्छा जवाब था। बहुत बहुत धन्यवाद!! – user1092808

+0

मुझे इसकी आवाज़ पसंद है। क्या आप कह रहे हैं कि आप पंक्तियों की संख्या के लिए देखते हैं, फिर टेबलव्यू हेडर को सशर्त रूप से दिखाएं/छुपाएं? या हमेशा हेडर दिखाएं और बस अपना टेक्स्ट "कोई पंक्ति नहीं मिली" में बदलें? –

+0

शीर्षलेख में खोज बार के मामले में काम नहीं करेगा – Andy

1

एक खाली संदेश प्रदर्शित करने का मेरा सरल सुझाव है अपने नियंत्रक को एक सरल UIViewController (UITableViewController नहीं) को पुनर्व्यवस्थित करना है।

यह UIViewController और एक UILabel (या एक UIView कि एक UILabel शामिल हैं) कि रिक्त पंक्ति संदेश प्रदर्शित करता है के द्वारा एक UITableView द्वारा रचित है (नियंत्रक डेटा स्रोत और अपनी मेज के लिए प्रतिनिधि है)।

इस तरह से आप तालिका की दृश्यता और पुनर्प्राप्त पंक्तियों के आधार पर लेबल को नियंत्रित कर सकते हैं।

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

जैसा कि @Rog ने सुझाव दिया है कि आप उस संदेश को प्रदर्शित करने के लिए तालिका दृश्य शीर्षलेख का भी उपयोग कर सकते हैं। जैसा आप चाहें।

उम्मीद है कि यह मदद करता है।

+0

यह एक अच्छा समाधान नहीं है क्योंकि आप 'UITiewViewController'' 'अंतर्निहित' 'UIRefreshControl'' का उपयोग नहीं कर सकते हैं, जो' 'UIViewController'' को ठीक से उपclassing कर रहा है। टेबल व्यू कंट्रोलर सबक्लास को एम्बेड करने और कंटेनर व्यू कंट्रोलर में खाली दृश्य को संभालने के लिए व्यू कंट्रोलर कंटेंटेशन का उपयोग करना बेहतर है। – amb

+0

@amb यह एक संभावित समाधान है ... सेशन ने कार्यक्षमता को रीफ्रेश करने के लिए पुल डाउन का उपयोग करने का अनुरोध नहीं किया है ... मेरे opionion में यहां पर रोकथाम बहुत अधिक है। आपके कमेंट के लिए धन्यवाद। –

+0

ठीक है, आप बिल्कुल सही हैं, लेकिन एक ''UITableViewController'' और'' UIRefreshControl' 'दोनों का उपयोग करना एक बहुत ही आम है जब आपको खाली तालिका दृश्य संदेश प्रदर्शित करना होता है। – amb

1

एक वैकल्पिक दृष्टिकोण, जिसका मैंने पहले उपयोग किया है, उस अनुभाग के लिए 'नो पंक्ति' इकाई डालने के द्वारा आपके लिए अद्यतन प्रबंधित करने के लिए कोर डेटा का उपयोग करना है, जहां आपके मॉडल वर्ग में कोई पंक्ति नहीं मिली है, जो डेटा को संभालती है अद्यतन करें।

इसे लागू करने के कई तरीके हैं उदा। किसी ज्ञात स्थिति संदेश या इकाई के भीतर ध्वज पर नाम/शीर्षक फ़ील्ड सेट करें। एक बार डालने के बाद आप cellForRowAtIndexPath प्रतिनिधि विधि में 'नो पंक्ति' इकाई का पता लगा सकते हैं और संदेश दिखाने के लिए एक वैकल्पिक तालिका कक्ष डाल सकते हैं।

बस उस अनुभाग के डेटा को रीफ्रेश करने से पहले 'कोई पंक्तियां' इकाई को हटा दें।

+0

नीचे वोट क्यों? मैं सिर्फ कई वर्गों को संभालने के लिए एक समाधान समाधान प्रदान कर रहा था! – Brett

7

मैंने डीडलोड में निम्नानुसार किया था।

UILabel *label = [[UILabel alloc] init]; 
[label setTextColor:[UIColor lightGrayColor]]; 
[label setText:@"No widgets found."]; 
[label sizeToFit]; 
label.frame = CGRectMake((self.tableView.bounds.size.width - label.bounds.size.width)/2.0f, 
         (self.tableView.rowHeight - label.bounds.size.height)/2.0f, 
         label.bounds.size.width, 
         label.bounds.size.height); 
[self.tableView insertSubview:label atIndex:0]; 

इस मामले में, प्रत्येक तालिका दृश्य कक्ष लेबल को छिपाने के लिए अपारदर्शी होना चाहिए। या पंक्ति गणना के अनुसार लेबल की छिपी हुई संपत्ति को टॉगल करने की आवश्यकता है।