2012-08-13 11 views
8

मैंने UIButtonUITableViewCells में जोड़ा है। मेरे पास जब उपयोगकर्ता बटन पर क्लिक करता है तो हमें NSMutableArray से मानों का उपयोग करने के लिए इंडेक्सपाथ मिल जाता है। मैं, वर्तमान IndexPath प्राप्त करने के लिए नीचे दिए गए का इस्तेमाल किया हैआईआईटी में पैरामीटर द्वारा UIButton @selector पर UITableView IndexPath को कैसे पास करें?

[getMeButton addTarget:self action:@selector(resendTheErrorMessage:) forControlEvents:UIControlEventTouchUpInside]; 

-(void) resendTheErrorMessage:(id)sender 
{ 
    NSLog(@"SEnder: %@", sender); 
    //NSLog(@"Index Path : %@", indexpath); 
} 

किसी को भी मेरी मदद कृपया वर्तमान indexpath UIButton's @selector पारित करने के लिए। अग्रिम में धन्यवाद।

संपादित करें:

यह आउटपुट मैं NSLog()

<UIButton: 0x864d420; frame = (225 31; 95 16); opaque = NO; tag = 105; layer = <CALayer: 0x864d570>> 
+0

आप अपने सेल की पंक्ति की संख्या के अनुसार अपने बटन पर टैग सेट कर सकते हैं तो आप आसानी से सेल इंडेक्स प्राप्त कर सकते हैं। उस कोड को दिखाएं जहां आपने सेल पर अपना बटन जोड़ा था (cellForRowAtIndexPath :) विधि? – TheTiger

+0

@ वाकुलसेनी धन्यवाद। मुझे (आईडी) प्रेषक से सेल इंडेक्स नहीं मिला। मैंने अपना प्रश्न संपादित किया है कृपया इसे देखें। धन्यवाद। –

+0

आपको यह मिल रहा है क्योंकि आप 'UIButton' की आईडी प्रिंट कर रहे हैं। सेलइंडेक्स – TheTiger

उत्तर

30

जोड़े UIButton की तरह आपका इस

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[btn setFrame:CGRectMake(10.0, 2.0, 140.0, 40.0)]; 
[btn setTitle:@"ButtonTitle" forState:UIControlStateNormal]; 
[btn addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
[btn setTag:indexPath.row]; 
[cell.contentView addSubview:btn]; 

और फिर अपनी टैग नंबर मिल -

-(void)buttonClicked:(id)sender 
{ 
    NSLog(@"tag number is = %d",[sender tag]); 
    //In this case the tag number of button will be same as your cellIndex. 
    // You can make your cell from this. 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0]; 
    UITableViewCell *cell = [tblView cellForRowAtIndexPath:indexPath]; 
} 

नोट:समाधान जब अपने tableView केवल 1 अनुभाग है काम करेंगे ऊपर। यदि आपकी तालिका दृश्य में एक से अधिक सेक्शन हैं तो आपको अपने सेक्शन इंडेक्स को जानना चाहिए या नीचे विधियों के लिए जाना चाहिए।

वैकल्पिक: 1

UIView *contentView = (UIView *)[sender superview]; 
UITableViewCell *cell = (UITableViewCell *)[contentView superview]; 
NSIndexPath *indexPath = [tblView indexPathForCell:cell]; 

वैकल्पिक: 2

CGPoint touchPoint = [sender convertPoint:CGPointZero toView:tblView]; 
NSIndexPath *indexPath = [tblView indexPathForRowAtPoint:touchPoint]; 
UITableViewCell *cell = [tblView cellForRowAtIndexPath:indexPath]; 
+0

क्या यह काम करता है जब टेबल व्यू में एक से अधिक सेक्शन होते हैं? –

+1

पहला व्यक्ति काम नहीं करेगा क्योंकि इसमें आपको सेक्शन इंडेक्स जानना होगा .... लेकिन वैकल्पिक समाधान काम करेगा ...... – TheTiger

+0

@TheTiger धन्यवाद आदमी यह पूरी तरह से काम करता है ... – Ryuk

2

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

+0

मुझे नहीं लगता कि यह काम करेगा। AFAIK आप एक कार्रवाई पर अपने खुद के पैरामीटर पास नहीं कर सकते हैं: @ चयनकर्ता? –

+0

कौन सा हिस्सा काम नहीं करेगा? कोई अतिरिक्त पैरामीटर की आवश्यकता नहीं होगी; विचार बटन ऑब्जेक्ट में इंडेक्स की जानकारी को एन्कोड करना है, जब वह तालिका में जोड़ा जाता है, या तो टैग प्रॉपर्टी या सबक्लास की कस्टम प्रॉपर्टी के माध्यम से। इस विधि के स्वीकृत उत्तर में टैग विधि का उपयोग किया जाता है। – sgress454

6

यह देखते हुए कि बटन सेल देखने का एक subview है, और तालिका दृश्य सूचकांक जानता है कि सेल व्यू का पथ, ऐसा कुछ काम करेगा:

- (UITableViewCell *)containingCellForView:(UIView *)view 
{ 
    if (!view.superview) 
     return nil; 

    if ([view.superview isKindOfClass:[UITableViewCell class]]) 
     return (UITableViewCell *)view.superview; 

    return [self containingCellForView:view.superview]; 
} 

- (IBAction)buttonClicked:(id)sender 
{ 
    UITableViewCell *containingCell = [self containingCellForView:sender]; 
    if (containingCell) { 
     NSIndexPath *indexPath = [self.tableView indexPathForCell:containingCell]; 
     NSLog(@"Section: %i Row: %i", indexPath.section, indexPath.row); 
    } 
} 
+0

यह काम करेगा, लेकिन आपके पास है यह सुनिश्चित करने के लिए कि बटन तालिका कक्ष का एक * प्रत्यक्ष * सबव्यूव है (जो आमतौर पर होगा)। – sgress454

+0

और सेल को देखने के लिए सबव्यू जोड़ना .view अच्छा नहीं है ...! हम इसे cell.contentView पर जोड़ते हैं .... अच्छा विचार अच्छा है :-) – TheTiger

+0

यह अच्छा है अगर आप इसे सेल के एक्सेसरी दृश्य के रूप में सेट कर रहे हैं - मूल प्रश्न यह निर्दिष्ट नहीं करता था कि इसे कहां जोड़ा जा रहा था। जाहिर है यदि यह दृश्य पदानुक्रम में एन स्तर नीचे है तो आपको सेल दृश्य प्राप्त करने के लिए एन स्तरों को वापस ले जाना होगा। –

0
मेरे लिए

cellForRowAtIndexPath में बटन के लिए अगर ऐड टैग काम करता है ...

cell.button.tag = indexPath.row; 

और सेल कक्षा में टैग मिलता है ... उदाहरण के लिए:

NSLog(@"tag number is = %d",[sender tag]); 

तिनका कि आप कर सकते हैं cell.row पता है। अच्छी तरह से यह मेरे लिए काम करता है, मेरे अंग्रेजी के लिए खेद है।

1

एक से अधिक अनुभाग के साथ एक tableview एक सरल समाधान टैग लगाने में किया जाएगा के लिए:

cell.button.tag = indexPath.section * 1000 + indexPath.row 

ईवेंट हैंडलर उपयोग में:

let section = sender.tag/1000 
let row = sender.tag % 1000 

ध्यान दें कि आप एक साथ गुणा करने की आवश्यकता 1000 से अधिक संख्या यदि आपके किसी भी अनुभाग में 1000 या अधिक पंक्तियां हो सकती हैं।

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