दिलचस्प पोस्ट
विंडोज बैच के लिए हेरेडॉक? आइटीआईटी फ़्रेमवर्क 4.1 में पीओसीओ कोड प्रथम क्या है? जावा में कई मापदंडों के साथ कन्स्ट्रस्ट्रक्टरों को प्रबंधित करना असतत एक्स पैमाने का क्रम बदलें वीबीए का उपयोग करके वेबसाइट से डेटा स्क्रैप करना मुझे सी # में "ब्लॉकों का उपयोग करने" का उपयोग कब करना चाहिए? जीजीप्लोट 2 में सरल जनसंख्या पिरामिड क्या एंड्रॉइड डेवलपमेंट के लिए जावा 8 का उपयोग करना संभव है? गतिशील कुंजी के साथ ऑब्जेक्ट बनाना आप पायथन में दो चर के लॉजिकल एक्सओर कैसे प्राप्त करते हैं? ऑब्जेक्ट गुणों के माध्यम से फिराना jQuery: फ़ायरफ़ॉक्स में <input type = "file" /> पर एक क्लिक का अनुकरण नहीं करता है? एंड्रॉइड ऐप के लिए आप एक पारदर्शी डेमो स्क्रीन कैसे बना सकते हैं? स्वत: समायोजन के बीच अंतर समझाते हुए ScrollViewInsets, विस्तारितलेआउटअनुमतिओएस्क्यूबार्स, किनारोंएफ़ास्टरेड IOS7 में एंड्रॉइड में चालू चलने वाले अनुप्रयोगों की जांच कैसे करें?

UITableView पंक्ति नंबर को कैसे जानिए

मेरे पास UISwitch साथ एक UITableViewCell के रूप में प्रत्येक सेल की एक्सेसरीव्यूरी है जब मैं किसी सेल में स्विच के मूल्य को बदलता हूं, तो मैं कैसे जान सकता हूँ कि स्विच किस पंक्ति में है? स्विच मूल्य परिवर्तित ईवेंट में मुझे पंक्ति संख्या की आवश्यकता है I

वेब के समाधान से एकत्रित समाधान "UITableView पंक्ति नंबर को कैसे जानिए"

टैग, उपवर्ग, या पदानुक्रम नेविगेशन देखें बहुत अधिक काम हैं! । यह आपकी क्रिया पद्धति में करें:

 CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.tableView]; NSIndexPath *hitIndex = [self.tableView indexPathForRowAtPoint:hitPoint]; 

किसी भी प्रकार के दृश्य, बहु अनुभाग तालिकाओं के साथ काम करता है, जो भी आप इसे फेंक सकते हैं – जब तक आपके प्रेषक की उत्पत्ति सेल के फ्रेम (धन्यवाद लूटना!) के भीतर हो, जो आम तौर पर मामला हो।

और यहाँ यह एक UITableView स्विफ्ट विस्तार में है:

 extension UITableView { func indexPath(for view: UIView) -> IndexPath? { let location = view.convert(CGPoint.zero, to: self) return self.indexPathForRow(at: location) } } 

यदि आप tag गुण को पंक्ति संख्या में सेट करते हैं (जैसा कि अन्य उत्तरों के अनुसार सुझाया गया है), तो आपको इसे हर बार tableView:cellForRowAtIndexPath: में अपडेट करना होगा tableView:cellForRowAtIndexPath: (क्योंकि एक सेल को विभिन्न पंक्तियों के लिए पुन: उपयोग किया जा सकता है)।

इसके बजाय, जब आपको पंक्ति संख्या की आवश्यकता होती है, तो आप UISwitch (या किसी अन्य दृश्य) से UISwitch श्रृंखला को UISwitch , और फिर UITableView , और कक्ष के अनुक्रमणिका पथ के लिए तालिका दृश्य पूछ सकते हैं:

 static NSIndexPath *indexPathForView(UIView *view) { while (view && ![view isKindOfClass:[UITableViewCell class]]) view = view.superview; if (!view) return nil; UITableViewCell *cell = (UITableViewCell *)view; while (view && ![view isKindOfClass:[UITableView class]]) view = view.superview; if (!view) return nil; UITableView *tableView = (UITableView *)view; return [tableView indexPathForCell:cell]; } 

इस tableView:cellForRowAtIndexPath: में कुछ भी आवश्यकता नहीं है tableView:cellForRowAtIndexPath: :।

cellForRowAtIndexPath: में, अपने नियंत्रण की tag प्रॉपर्टी को indexPath.row सेट करें

मैं उप-दृश्य का उपयोग करना पसंद करता हूं, यदि आप अपने लेआउट को जानते हैं तो यह सामान्य रूप से सरल और 1 पंक्ति कम है …

  NSIndexPath *indexPath = [tableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]]; 

यह, यह अधिक नेस्टेड अगर, अधिक पर्यवेक्षणों में जोड़ें।

थोड़ा अधिक जानकारी:

आप जो कर रहे हैं वह माता-पिता के विचार और उसके मूल विचारों के लिए पूछ रहा है जो सेल है फिर आप उस सेल के इंडेक्सपेथ के लिए अपने टेबलव्यू पूछ रहे हैं जो आपको मिला है।

स्वीकृत समाधान एक चतुर हैक है

लेकिन हमें हिटपॉइंट का उपयोग करने की आवश्यकता क्यों है अगर हम पहले से ही उपलब्ध tag प्रॉपर्टी का उपयोग यूआईवीयूवी पर कर सकते हैं? आप कह सकते हैं कि टैग केवल एक पंक्ति या अनुभाग को केवल एक ही आईटी से जमा कर सकता है

अच्छी तरह से … अपनी जड़ें लोगों को मत भूलना (CS101)। एक एकल आईटी दो बार-छोटे आकार के पूर्णांक को स्टोर कर सकता है। और यहां इसके लिए एक विस्तार है:

 extension Int { public init(indexPath: IndexPath) { var marshalledInt: UInt32 = 0xffffffff let rowPiece = UInt16(indexPath.row) let sectionPiece = UInt16(indexPath.section) marshalledInt = marshalledInt & (UInt32(rowPiece) << 16) marshalledInt = marshalledInt + UInt32(sectionPiece) self.init(bitPattern: UInt(marshalledInt)) } var indexPathRepresentation: IndexPath { let section = self & 0x0000ffff let pattern: UInt32 = 0xffff0000 let row = (UInt32(self) & pattern) >> 16 return IndexPath(row: Int(row), section: Int(section)) } } 

आपके tableView(_:, cellForRowAt:) आप तब कर सकते हैं:

 cell.yourSwitch.tag = Int(indexPath: indexPath) 

और फिर एक्शन हेन्डलर में आप यह कर सकते हैं:

 func didToogle(sender: UISwitch){ print(sender.tag.indexPathRepresentation) } 

हालांकि, कृपया ध्यान दें इसकी सीमा है: पंक्ति और अनुभाग में 65535 अधिक नहीं होना चाहिए। (UInt16.max)

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

 {section area length}{all remaining}[4 BITS: section area length - 1] 

यह हमारे 4 एलएसबी से अनुभाग क्षेत्र की लंबाई इंगित करते हैं – 1, यह देखते हुए कि हम एक अनुभाग के लिए कम से कम 1 बिट आवंटित करते हैं। इस प्रकार हमारे खंड के मामले में 0 है, पंक्ति में 27 बिट तक ([1] [27] [4]) कब्जा कर सकते हैं, जो निश्चित रूप से पर्याप्त होना चाहिए

ऐसा करने का एक आम तरीका नियंत्रण का tag (आपके मामले में स्विच) को सेट करने के लिए है जिसे किसी पंक्ति की पहचान या वस्तु का प्रतिनिधित्व करने के लिए उपयोग किया जा सकता है

उदाहरण के लिए, tableView:cellForRowAtIndexPath: स्विच की tag प्रॉपर्टी को tableView:cellForRowAtIndexPath: सेट करें और अपनी क्रिया विधि में आप प्रेषक से टैग प्राप्त कर सकते हैं।

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

एक सहयोगी ने निम्नलिखित सुझाव दिया, जो मैंने एक यूआईटीबल्यूव्यू श्रेणी में बनाया:

 +(UITableViewCell*)findParentCellForSubview:(UIView*)view { while (([view isKindOfClass:[UITableViewCell class]] == NO) && ([view superview] != nil)) view = [view superview]; if ([view superview] != nil) return (UITableViewCell*)view; return nil; } 

अभी भी हैली – लेकिन यह काम करता है।

सुपरव्यू का उपयोग करने का एक और संस्करण UIView के लिए श्रेणी की तरह काम करता है

 - (UITableViewCell *)superCell { if (!self.superview) { return nil; } if ([self.superview isKindOfClass:[UITableViewCell class]]) { return (UITableViewCell *)self.superview; } return [self.superview superCell]; } 

मैं कई वर्गों के बारे में नहीं जानता लेकिन मैं आपको एक खंड के लिए दे सकता हूं …

 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger index=indexPath.row; NSString *string=[[NSString alloc]initWithFormat:@"%ld",(long)index]; } 

इससे आप पंक्ति संख्या प्राप्त कर सकते हैं और आप उसे स्ट्रिंग में सहेज सकते हैं ….

इस पोस्ट पर स्वीकृत उत्तर बिल्कुल ठीक है। मैं पाठकों को सुझाव देना चाहूंगा कि निम्नलिखित, @robmayoff से इस पोस्ट पर प्राप्त किया गया है, यह भी बिल्कुल ठीक है:

 - (NSIndexPath *)indexPathForView:(UIView *)view inTableView:(UITableView *)tableView { while (view && ![view isKindOfClass:[UITableViewCell class]]) view = view.superview; UITableViewCell *cell = (UITableViewCell *)view; return [tableView indexPathForCell:cell]; } 

कुछ ने यह दावा किया है कि इस दृष्टिकोण में बहुत अधिक कम्प्यूटेशनल काम हैं क्योंकि लूप के कारण। विकल्प, व्यू के मूल को तालिका व्यू निर्देशांक स्थान में कनवर्ट करें और indexPathForRowAtPoint: कॉल करें indexPathForRowAtPoint: और भी अधिक काम छुपाता है।

कुछ ने यह दावा किया है कि यह दृष्टिकोण संभावित एसडीके परिवर्तनों के सापेक्ष असुरक्षित है। वास्तव में, ऐप्पल ने एक बार contentView सेल के पदानुक्रम को पहले ही बदल दिया है, जिससे सेल में सामग्री contentView है। इस दृष्टिकोण से इस तरह के परिवर्तन से पहले और बाद में काम आता है। जब तक पूर्वजों को पर्यवेक्षण की श्रृंखला के माध्यम से देखा जा सकता है (जोकि UIKit में कुछ भी मौलिक है), यह अच्छा कोड है।