2009-06-22 8 views
19

में कौन सा सेल बटन दबाया गया था, यह निर्धारित करने के लिए कि वर्तमान में मेरे पास एक UITableView है जो कस्टम UITableViewCell के साथ पॉप्युलेट किया गया है जो एक अलग निब में है। सेल में, कस्टम बटन क्लास में कार्रवाइयों के लिए वायर्ड किए गए दो बटन हैं। जब मैं बटनों में से एक पर क्लिक करता हूं, तो मैं उचित विधि कह सकता हूं, लेकिन मुझे यह जानने की जरूरत है कि बटन किस पंक्ति में दबाया गया था। प्रत्येक बटन के लिए टैग प्रॉपर्टी 0 के रूप में आ रही है। मुझे यह जानने की आवश्यकता नहीं है कि पूरे सेल कब चुना जाता है, बस जब कोई विशेष बटन दबाया जाता है, तो मुझे यह जानने की ज़रूरत है कि यह कौन सी पंक्ति है इसलिए मैं उचित वस्तु को अपडेट कर सकता हूं।आईफोन - कस्टम यूआईटीबल व्यूसेल

उत्तर

10

आप बटन पर tag संपत्ति का उपयोग करके यह निर्दिष्ट कर सकते हैं कि बटन किस पंक्ति में बनाया गया था, यदि आप किसी और चीज़ के लिए टैग का उपयोग नहीं कर रहे हैं।

+1

क्या मुझे cellForRowAtIndexPath विधि में टैग सेट करने की आवश्यकता है, और फिर बटन दबाए जाने पर इसे एक्सेस करें? –

+1

हां, यह सबसे अच्छी विधि है। – Jason

+0

इसे लंबे समय से ढूंढ रहा था, क्योंकि मैं भी नौसिखिया हूं। अच्छी सलाह के लिए धन्यवाद @ pix0r। – Jonauz

1

UITableViewCell प्राप्त करने के लिए आप superview बटन प्राप्त कर सकते हैं जिसमें आपका बटन होता है, लेकिन यदि आपको केवल पंक्ति संख्या की आवश्यकता है, तो आप tag संपत्ति को पिछले पोस्ट डेसिरिज़ जैसे उपयोग कर सकते हैं।

+0

[प्रेषक पर्यवेक्षक] का उपयोग करना; कस्टम सेल क्लास (जिसमें बटन के लिए क्रिया विधियां शामिल हैं) में मुझे एक UIView देता है, न कि सेल। अगर मैं cellForRowAtIndexPath विधि में टैग सेट करता हूं, तो दबाए जाने पर सेल में प्रत्येक बटन के लिए यह अभी भी 0 के रूप में आता है। –

+0

यह सही है, आपको किसी अन्य पोस्ट द्वारा वर्णित [[प्रेषक पर्यवेक्षण] पर्यवेक्षण] का उपयोग करने की आवश्यकता है ... यह तब सेल है जिसमें UIView है, जिसमें आपका बटन शामिल है। – h4xxr

+0

यहां एक अच्छा समाधान है: http: //www.71squared।कॉम/2008/12/कस्टम-बटन-इन-यूटेबलव्यूसेल-इंडेक्सपाथ/ – DixieFlatline

4

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

cell.section = indexPath.section cell.row = indexPath.row cell.owner = आत्म

अगले बात यह है कि मैंने किया था जब मैं बटन बनाया है, मैं बटन घटनाओं सेल के साथ संबद्ध tableViewController के बजाय। इवेंट हैंडलर अनुभाग और पंक्ति प्रविष्टि पढ़ सकता है और उचित संदेश (या घटना) को TableViewController पर भेज सकता है। यह मौजूदा तरीकों और हाउसकीपिंग का लाभ उठाकर और सेल को जितना संभव हो सके स्वयं को रखकर घर की देखभाल और रख-रखाव को बहुत सरल बनाता है। चूंकि सिस्टम पहले से ही कोशिकाओं का ट्रैक रखता है, यह दो बार क्यों करता है!

19

के लिए बहुत आसान समाधान है (आईडी) प्रेषक के साथ अपने बटन कॉलबैक को परिभाषित करें और तालिका पंक्ति अनुक्रमणिका को खोदने के लिए इसका उपयोग करें। आप का इस्तेमाल किया है कि एक ही पंक्ति सूचकांक/बनाने सेल को भरने, तो यह आपके बटन अब क्या करना चाहिए क्या पहचान करने के लिए तुच्छ होना चाहिए करने के लिए

- (IBAction)buttonWasPressed:(id)sender 
{ 
    NSIndexPath *indexPath = 
     [self.myTableView 
     indexPathForCell:(UITableViewCell *)[[sender superview] superview]]; 
    NSUInteger row = indexPath.row; 

    // Do something with row index 
} 

सबसे अधिक संभावना: यहां कुछ नमूना कोड है। टैग के साथ खेलने की जरूरत नहीं है और उन्हें क्रम में रखने की कोशिश करें!

स्पष्टीकरण: यदि आप वर्तमान में - (IBAction) बटन का उपयोग करते हैं; बस इसे - (IBAction) बटन के रूप में फिर से परिभाषित करें दबाया गया: (आईडी) प्रेषक; अतिरिक्त कॉलबैक तर्क वहां है, इसे प्राप्त करने के लिए कुछ भी करने की आवश्यकता नहीं है। इंटरफेस बिल्डर में अपने बटन को नए कॉलबैक में फिर से कनेक्ट करना भी याद रखें!

+0

बेशक आप कोशिकाओं का पुन: उपयोग करते हैं, अगर केस का उपयोग करने की अनुमति मिलती है! अन्यथा चीजें वास्तव में जटिल हो सकती हैं। वैसे भी, तालिका में जोड़ा गया पहला पंक्ति "दृश्य पहली पंक्ति" होगी। क्षमा करें, मुझे इसके साथ कोई समस्या नहीं है? – JOM

+0

मेरे अकेला "पुन: उपयोग कक्ष" टिप्पणी के लिए स्पष्टीकरण। यह एक और टिप्पणी का जवाब था, जिसे अब किसी ने हटा दिया है। मुझे इसके लिए भी एक वोट मिला! कोई चिंता नहीं, मैं जीवित रहूंगा :) – JOM

+0

मैंने इस क्रिया की सामग्री को पकड़ लिया है कि यह पता लगाने के लिए कि कौन सा बटन UITableView सेल को सेगु के लिए बुलाया गया है। यह तकनीक भी महान है! – jerwood

3

भी आसान:

-(IBAction) buttonPressed { 
    NSIndexPath *myIndexPath = [(UITableView *)self.superview indexPathForCell: self]; 
    // do whatever you need to do with the information 
} 
1

समस्या को ठीक करने के लिए कई तरीकों रहे हैं।

  1. आप "टैग" संपत्ति का उपयोग कर सकते हैं बटन के लिए टैग मान के रूप में value indexPath.row दें।
    btn.tag = indexPath।पंक्ति;

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

-(void)btnClicked:(id)sender 
{ 
    int index = [sender tag]; 
} 
  1. आप परत संपत्ति का उपयोग कर सकते indexPath परत शब्दकोश में मूल्य के रूप में।

    [[बीटीएन परत] सेट वैल्यू: इंडेक्सपाथ फॉरके: @ "इंडेक्सपाथ"];

यह अनुक्रमणिकापैथ बटन क्रिया फ़ंक्शन से पहुंच योग्य है।

-(void)btnClicked:(id)sender 
{ 
    NSIndexPath *indexPath = [[sender layer] valueForKey:@"indexPath"]; 
    int index = indexPath.row; 
} 

इस विधि के साथ आप अलग-अलग कुंजी के साथ शब्दकोश में नई ऑब्जेक्ट्स जोड़कर बटन फ़ंक्शन में एकाधिक मान पास कर सकते हैं।

+0

क्या एक भयानक हैक। मनमानी डेटा स्टोर करने के लिए परतें नहीं हैं। – jrturton

+1

एक बेहतर समाधान के लिए http://stackoverflow.com/questions/9274494/how-to-now-the-uitableview-row-number/9274863#9274863 देखें। – jrturton

+0

@ टिंकू जॉर्ज - आपका पहला जवाब मेरे मामले में काम करता है! धन्यवाद! –

4

एक कार्यान्वयन कि टैग या दृश्य पदानुक्रम पर निर्भर नहीं है के लिए निम्न उपाय अपनाते हैं

- (void)btnPressed:(id)sender event:(id)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint touchPoint = [touch locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:touchPoint]; 
} 
0
[btnFavroite setAccessibilityValue:[NSString stringWithFormat:@"%d",indexPath.row]]; 
    [btnFavroite setAccessibilityLabel:btnFavroite.titleLabel.text]; 
    [btnFavroite addTarget:self action:@selector(btnFavClick:) forControlEvents:UIControlEventTouchUpInside]; 

-(void)btnFavClick:(id)sender{ 
    UIButton *btn=(UIButton *)sender; 
    int index=[btn.accessibilityValue integerValue]] 
} 
0

इस समाधान भी IBAction में काम करता है स्टोरीबोर्ड सेल प्रोटोटाइप

- (IBAction)viewMapPostsMarker:(UIButton*)sender{ 
    // button > cellContentView > cellScrollView > cell 
    UITableViewCell *cell = (UITableViewCell *) sender.superview.superview.superview; 
    NSIndexPath *index = [self.mapPostsView indexPathForCell:cell]; 
    NSLog(@" cell at index %d",index.row); 
} 
3

का उपयोग कर यहाँ एक है जुड़ा हुआ स्विफ्ट उदाहरण ...

यूआईसीओन्ट्रोल क्लास विभिन्न आईओएस चौराहे का सुपरक्लास है टीआई, यूआईबटन सहित, क्योंकि यूआईसींट्रोल लक्ष्य/क्रिया तंत्र प्रदान करता है जो घटना अधिसूचनाएं भेजता है। इसलिए इसे संभालने का एक सामान्य तरीका निम्नानुसार है:

func actionHandler(control: UIControl) 
    var indexPath = tableView.indexPathForCell(control.superview!.superview! as UITableViewCell)! 
    var row = indexPath.row 
} 

कार्रवाई देने के लिए बटन नियंत्रण स्थापित करने का एक उदाहरण यहां दिया गया है। वैकल्पिक रूप से, एक @IBAction बनाएं और इंटरफ़ेस बिल्डर के साथ दृश्य रूप से क्रिया बनाएं।

button.addTarget(self, action: "actionHandler:", forControlEvents: .TouchUpInside) 

आप UIButton, UIStepper, आदि के लिए UIControl पैरामीटर को कम कर सकते हैं ... आवश्यकतानुसार। उदाहरण के लिए:

var button = control as UIButton 

नियंत्रण के superview UITableViewCell के contentView, जिसका subviews UIViews सेल में दिखाया गया हैं (UIControl UIView का एक उपवर्ग है)। सामग्री सेल का पर्यवेक्षण UITableViewCell स्वयं ही है। यही कारण है कि यह एक विश्वसनीय तंत्र है और पर्यवेक्षकों को दंड के साथ पार किया जा सकता है।

+0

भयानक उत्तर के लिए धन्यवाद! यह एक ही पंक्ति में 'UITableView' में एकाधिक बटन के साथ काम करता है! –

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