2009-07-28 7 views
26

मानक समूह UITableView शैली UITableViewCell एस को प्रत्येक अनुभाग के शीर्ष और नीचे गोलाकार कोनों के साथ खींचा जाने की अनुमति देता है। यह कैसे पूरा किया जाता है? सेल अपने अनुभाग के भीतर अपना स्थान कैसे जानता है, और यह कैसे पता चलता है कि इसके गोलाकार किनारों को कब बदला जाए?UITableViewCell को अपने स्वयं के इंडेक्सपाथ के बारे में कैसे पता चलेगा?

मैं अपने ही गोल कोशिकाओं बनाना चाहते हैं, और मैं उपयोग करने के लिए छवियों है, लेकिन दिखाने के लिए जब जो छवि

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

उत्तर

8

नहीं है कि पूर्णांक रिटर्न आपको बता रहा है कि तुम क्या जरूरत है UITableViewCell की sectionLocation विधि:

  • 1 - बीच सेल
  • 2 - शीर्ष सेल
  • 3 - नीचे सेल
  • 4 - एकल सेल

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

-1

कोशिकाएं नहीं जानते कि वे कहां जाते हैं ... तालिका दृश्य में कोशिकाएं हैं, आप टेबल तालिका को बता रहे हैं कि सेल में क्या चल रहा है। आप डेटा स्रोत में ऐसा करते हैं, जहां आप cellForRowAtIndexPath लागू ... जिस तरह से यह काम करता है:

एक सूचकांक पथ एक पंक्ति और एक अनुभाग

एक समूहीकृत तालिका दृश्य

एक वर्ग एक समूह से संबंधित है के लिए है , और एक पंक्ति उस खंड में 1 प्रविष्टि से संबंधित है, जिस तरह से UITableView जानता है कि अनुभाग में कितनी पंक्तियां हैं और डेटा स्रोत स्रोत विधियां कितने अनुभाग हैं IFSectionInTableView और विधि संख्या OfRowsInSection, यह सेलForRowAtIndexPath पर सही कॉल करेगा, यह यह पहचानने के लिए आप कौन सा अनुभाग और पंक्ति पूछताछ की जा रही है और आपको इन विशिष्टताओं के अनुसार अपना सेल बनाना होगा माहौल।

ऐसा करने का एक अच्छा तरीका है कि आप उस अनुभाग में जाने वाले मानों के साथ अनुभाग नामों और एनएसएआरआरई के मूल्यों के साथ एक शब्दकोश प्राप्त कर सकते हैं।

आप तो numberOfSectionsInRows के लिए कार्यान्वयन की तरह

return [[dictionary allKeys] count] 

लगेगा और numberOfRowsInSection की implmentation लगेगा जैसे

NSString* key=[[dictionary allKeys] objectAtIndex:sectionNumber] 
    return [[dictionary objectForKey:key] count] 

तुम हमेशा http://developer.apple.com/iphone/library/documentation/UserExperience/Conceptual/TableView_iPhone/Introduction/Introduction.html आशा में UITableView प्रोग्रामिंग गाइड का उल्लेख कर सकते कि

में मदद करता है
+0

यह एक विशेष रूप से सहायक उत्तर नहीं है। मुझे पहले से ही पता है कि UITableView कैसे काम करता है, और मुझे पता है कि इसका उपयोग कैसे करें। मैंने सोचा कि चूंकि एक UITableView सही जगहों पर गोलाकार कोनों को स्वचालित रूप से आकर्षित करने में सक्षम है, इसलिए मुझे अपने डेटा स्रोत या प्रतिनिधि को कुछ भी जोड़ने की आवश्यकता के बिना भी सक्षम होना चाहिए। –

+0

ऑलसेल ने कोनों को गोलाकार किया है ... – Daniel

+0

UITableView गोलाकार कोनों को तैयार नहीं कर रहा है, UITableCell को इसकी ड्रॉ विधि के अंदर दिखने के लिए बनाया गया है ... – Daniel

-2

बस अपनी कस्टम UITableViewCell में एक संपत्ति जोड़ें (निर्भर करता है कार्यान्वयन पर) कक्षा जिसमें एक int, NSNumber, या एक NSIndexPath शामिल है जो निर्दिष्ट करता है कि यह कौन सा है। आप इसके बजाय डेटा संरचना का उपयोग कर रहे हैं, फिर इसे उस डेटा संरचना में तत्व में डाल दें। फिर जब आप डेटा संरचना बनाते हैं, तो आप बस संपत्ति सेट करते हैं, elt.id = i जैसे कुछ, और फिर आप इसे सेलफॉररएट इंडेक्सपैथ में एक्सेस करते हैं, जैसे कुछ (elt.id == 0 || elt.id == n-1) जहां एन आपके अनुभाग में पंक्तियों की संख्या है।

शायद मैंने आपके प्रश्न को पूरी तरह याद किया होगा, लेकिन अगर मैंने किया, तो बस टिप्पणी करें और मैं फिर से पोस्ट करूंगा।

+0

हाँ, आप थोड़े सवाल से चूक गए। मुझे पता है कि सृजन के समय सेल को स्थिर रूप से कहां बताया जाए। हालांकि, यह यह नहीं बताता है कि यह इसके अनुभाग के निचले हिस्से में है, यह बताए बिना कि यह किस तालिका में है। फिर भी, समस्या यह तथ्य है कि यह स्थिर है। अगर मैं शीर्ष पंक्ति को हटा देता हूं, तो मुझे खुद को रीसेट करने के लिए दूसरी पंक्ति को सूचित करने की आवश्यकता है। नियमित UITableViewCells का उपयोग करते समय मुझे ऐसा करने की ज़रूरत नहीं है। –

+0

ठीक उसी स्थिति में, आप केवल पुनः लोडडेटा को कॉल कर सकते हैं, और cellForRowAtIndex पथ को आपके शेष कोशिकाओं के लिए प्रत्येक बार एक बार बुलाया जाना चाहिए, जिस बिंदु पर आप आयत को दूसरे और दूसरे को अंतिम कोशिकाओं में गोलाकारों में बदल सकते हैं। – TahoeWolverine

0

दुर्भाग्यवश, मुझे इस समस्या का कोई समाधान नहीं मिला है, और मैंने एक सामान्य समाधान में UITableViewController और UITableViewCell को उपclassing का उपयोग किया है जिसे मैं आवश्यकतानुसार बढ़ा सकता हूं।

0

आप इसे सेल में नहीं करते हैं। घुमावदार कोनों को [tableView viewForHeaderInSection] में खींचा जाता है और ViewForFooterInSection देखें।

मैं जिस तरह से करता हूं वह सादा टेबलव्यू शैली का उपयोग करना है, फिर गोलाकार और कोशिकाओं के लिए इन दो विचारों का उपयोग सामान्य, कोई राउंड नहीं है।

+0

क्या आप उस पर विस्तार कर सकते हैं? मैं समझ नहीं पा रहा हूं कि यह कैसे काम करेगा। –

+0

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

+0

यह काम कर सकता है लेकिन इसे करने का पसंदीदा तरीका नहीं है क्योंकि बाद में कुछ और के लिए शीर्षलेख और पाद लेखों की आवश्यकता हो सकती है। आप UITableView indexPathForCell: सेल पूछकर वर्तमान सेल इंडेक्सपाथ प्राप्त कर सकते हैं। यदि यह 0 है और कोशिकाओं की संख्या 1 है, तो चार चार कोनों पर गोलाकार कोनों को खींचें, अन्यथा 0 0 गोलाकार कोनों को शीर्ष पर खींचें, अन्यथा यदि 0> लेकिन कोशिकाओं की संख्या -1 नीचे गोलाकार कोनों को खींचें, तो कोई गोलाकार कोनों (मध्य कोशिकाओं)। –

1

यदि आपको अधिक मजबूत और सामान्य सामान की आवश्यकता है, तो http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html पर एक नज़र डालें - मैट गैलाघर दिखाता है कि आपको क्या चाहिए, बहुत प्रभावी ढंग से। वह मूल रूप से UIViewController से UITableViewController को पुन: प्रयास करता है, जबकि अपने स्वयं के कस्टम ग्राफिक्स का उपयोग करने की क्षमता जोड़ता है। मैं सिर्फ अपनी परियोजनाओं में इसे लागू करने पर काम कर रहा हूं, अब तक ऐसा लगता है कि यह काम करेगा।

0

जो आकर्षित करता है उसे प्राप्त करने के बिना, आप यह जान सकते हैं कि सेलफोररएट इंडेक्सपैथ के अंदर अपने सेक्शन में कौन सा सेल अंतिम सेल है।

आप जिस सेल को प्रदान करने के लिए आवश्यक है उसे इंडेक्स में भेज दिया गया है, है ना? आप टेबल व्यू भी पास कर चुके हैं।

कॉल [tableView numberofRowsInSection: indexPath.section] और यदि यह == ([indexPath.row] -1) है तो आप जानते हैं कि आपको उस अनुभाग में अंतिम सेल की आपूर्ति करने के लिए कहा जा रहा है।

समय है कि cellForRowAtIndexPath बुलाया जा रहा है पर, सेल होने की गारंटी है indexPath पर में पारित कर दिया।

+0

हां, लेकिन पंक्ति को स्थानांतरित करने या पंक्तियों को हटाने के दौरान cellForRowAtIndexPath को नहीं कहा जाता है। U12ableViewCell को छोड़कर –

4

आप इस समस्या के लिए

- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell 

उपयोग कर सकते हैं। मेरे उदाहरण में मैं दृश्य के शीर्ष पर सेल (कस्टम सामग्री के साथ) स्क्रॉल करने के लिए इसका उपयोग कर रहा हूं।

+0

में इसकी तालिका का संदर्भ नहीं है। –

61
NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: self]; 
int rows = [(UITableView *)self.superview numberOfRowsInSection:indexPath.section]; 

if (indexPath.row == 0 && rows == 1) { 
// the one and only cell in the section 
} 
else if (indexPath.row == 0) { 
//top 
} 
else if (indexPath.row != rows - 1) { 
//middle 
} 
else { 
//bottom 
} 
+0

यह आधा जवाब है, लेकिन यह कोशिकाओं को चारों ओर स्थानांतरित करने के रूप में स्वचालित रूप से अपने गोलाकार कोनों को कैसे बदलता है? –

+0

आप कोड के इस टुकड़े को लेआउट में अपने सेल सबक्लास में रख सकते हैं। –

+2

यह समाधान भविष्य में अब और काम नहीं करेगा। आप भविष्यवाणी नहीं कर सकते कि आपका UITableViewCell इसके तालिकादृश्य का सीधा सबव्यूव है ... – Martin

32

यह बहुत आसान है। मान लीजिए सेल वस्तु है, जिसकी स्थिति पता लगाना है।

UITableView* table = (UITableView *)[cell superview]; 
    NSIndexPath* pathOfTheCell = [table indexPathForCell:cell]; 
    NSInteger sectionOfTheCell = [pathOfTheCell section]; 
    NSInteger rowOfTheCell = [pathOfTheCell row]; 
+0

यह विशेष रूप से सहायक नहीं है क्योंकि यह सेल को संबोधित नहीं करता है जब इसकी अपनी पंक्ति बदल जाती है या जब यह किसी अनुभाग में पहली या आखिरी या केवल पंक्ति बन जाती है। जब चीजें होती हैं तो मुझे कॉलबैक पाने का एक तरीका चाहिए। –

+0

आपका कोड पूरी तरह से काम किया। – user523234

0

डैरेन के जवाब पर विस्तार करने के लिए (मैं सबसे अधिक उपयोगी पाया जो, धन्यवाद डैरेन!), आप क्या कर सकते superviews 'सभी के माध्यम से पुनरावृति जब तक आप माता-पिता UITableView मिल रहा है। यह भविष्य का सबूत होना चाहिए क्योंकि आप विचारों के एक निश्चित पदानुक्रम पर भरोसा नहीं करते हैं।

मैं एक रिकर्सिव विधि का उपयोग करता हूं जो UITableView को वापस लौटाएगा यदि उसे कोई मिलता है या शून्य नहीं होता है तो कोई भी नहीं होता है।

- (UITableView *)parentTableViewOf:(UIView *)view { 
     Class class = [view.superview class]; 
     NSLog(@"Class : %@", NSStringFromClass(class)); 

     if([view.superview isKindOfClass:[UITableView class]]) { 
      return (UITableView *)view.superview; 
     } else { 
      return [self parentTableViewOf:view.superview]; 
     } 

     return nil; 
} 

अब तक मैं इस एक का उपयोग किया है और यह हिचकी के बिना काम करने लगता है। आशा करता हूँ की ये काम करेगा! :)

+0

धन्यवाद! मैंने यह सुनिश्चित करने के लिए संशोधित किया कि यह UIWindow तक पहुंचने पर अनंत लूप नहीं था। - (UITableView *) parentTableViewOf: (UIView *) देखें { यदि ([view.superview isKindOfClass: [UITableView क्लास]]) { वापसी (UITableView *) view.superview; } अन्यथा अगर (! [View.superview isKindOfClass: [UIWindow क्लास]]) { वापसी [self parentTableViewOf: view.superview]; } वापसी शून्य; } – Rowan

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