यह पता लगाना कि कौन सा UIButton UITableView में दबाया गया था


212

मेरे पास UITableView5 हैं UITableViewCells। प्रत्येक सेल में एक होता है UIButtonजो निम्नानुसार सेट होता है:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     NSString *identifier = @"identifier";
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
     if (cell == nil) {
         cell = [[UITableView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
         [cell autorelelase];

         UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 5, 40, 20)];
         [button addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside];
         [button setTag:1];
         [cell.contentView addSubview:button];

         [button release];
     }

     UIButton *button = (UIButton *)[cell viewWithTag:1];
     [button setTitle:@"Edit" forState:UIControlStateNormal];

     return cell;
}

मेरा सवाल यह है: buttonPressedAction:विधि में, मुझे कैसे पता चलेगा कि कौन सा बटन दबाया गया है। मैंने टैग का उपयोग करने पर विचार किया है, लेकिन मुझे यकीन नहीं है कि यह सबसे अच्छा मार्ग है। मैं किसी भी तरह indexPathनियंत्रण पर टैग करने में सक्षम होना चाहता हूं ।

- (void)buttonPressedAction:(id)sender
{
    UIButton *button = (UIButton *)sender;
    // how do I know which button sent this message?
    // processing button press for this row requires an indexPath. 
}

ऐसा करने का मानक तरीका क्या है?

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

मैंने निम्न कार्य करके इसे हल किया है। मैं अभी भी एक राय रखना चाहूंगा कि क्या यह करने का मानक तरीका है या कोई बेहतर तरीका है?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     NSString *identifier = @"identifier";
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
     if (cell == nil) {
         cell = [[UITableView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
         [cell autorelelase];

         UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 5, 40, 20)];
         [button addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside];
         [cell.contentView addSubview:button];

         [button release];
     }

     UIButton *button = (UIButton *)[cell.contentView.subviews objectAtIndex:0];
     [button setTag:indexPath.row];
     [button setTitle:@"Edit" forState:UIControlStateNormal];

     return cell;
}

- (void)buttonPressedAction:(id)sender
{
    UIButton *button = (UIButton *)sender;
    int row = button.tag;
}

यह नोट करना महत्वपूर्ण है कि मैं सेल के निर्माण में टैग सेट नहीं कर सकता क्योंकि सेल इसके बजाय समाप्त हो सकता है। यह बहुत गंदा लगता है। इसके लिए अवश्य ही एक बेहतर तरीका होना चाहिए। '


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

जवाबों:


400

Apple के गौण नमूने में निम्न विधि का उपयोग किया जाता है:

[button addTarget:self action:@selector(checkButtonTapped:) forControlEvents:UIControlEventTouchUpInside];

फिर टच हैंडलर में टच कोऑर्डिनेट किया जाता है और इंडेक्स पाथ की गणना उस समन्वय से की जाती है:

- (void)checkButtonTapped:(id)sender
{
    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
    if (indexPath != nil)
    {
     ...
    }
}

हाँ, यह वही है जो मैंने तय किया है (मेरा संपादन देखें)। मैं आपसे सहमत हूं कि यह इष्टतम नहीं है।
लगाम

2
लेकिन आप UIButton को UITableViewCell में शामिल करें ताकि आपको सेल बनाते समय बस उसी के अनुरूप होना चाहिए। हालांकि यह दृष्टिकोण वास्तव में सुरुचिपूर्ण नहीं दिखता है, मुझे स्वीकार करना होगा
व्लादिमीर

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

3
यह मज़बूती से बटन के मालिक वाले सेल को बाहर निकालेगा: UIView * view = बटन; जबकि ([[देखें किंडऑफक्लास: [UITableViewCell class]]]) {दृश्य = [देखें पर्यवेक्षण]]
याकूब लाइल्स

1
उपयोग करते समय एक जाल होता है: [बटन addTarget: self क्रिया: @selector (checkButtonTapped :) forControlEvents: UIControlEventTouchUpInside]; क्योंकि addTarget: कार्रवाई: forControlEvents: जब आप तालिका स्क्रॉल करते हैं तो कई डुप्लिकेट किए गए लक्ष्य और क्रियाएं जोड़ देंगे, यह पिछले लक्ष्यों और कार्यों को नहीं हटाएगा, इसलिए बटन क्लिक करने पर विधि चेकबटनटैप्ड: कई बार कॉल की जाएगी। बेहतर होगा कि तुम उन्हें जोड़ने से पहले लक्ष्य और कार्रवाई को निकालने चाहते हैं
bandw

48

मैंने पाया कि कोशिका के इंडेक्सपथ के संदर्भ को पूरी तरह से काम करने के लिए पर्यवेक्षक के पर्यवेक्षण का उपयोग करने की विधि मिली। टिप लिंक पाठ के लिए iphonedevbook.com (macnsmith) का धन्यवाद

-(void)buttonPressed:(id)sender {
 UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
 NSIndexPath *clickedButtonPath = [self.tableView indexPathForCell:clickedCell];
...

}

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

यदि आप (Stackoverflow Reader) यह कोशिश करते हैं और यह आपके लिए काम नहीं करता है, तो जांचें कि क्या आपके कार्यान्वयन में आपका UIButton वास्तव में आपके UITableViewCell का पोता है। मेरे कार्यान्वयन में, मेरा UIButton मेरे UITableViewCell का प्रत्यक्ष बच्चा था, इसलिए मुझे कोकोनट के कोड में "सुपरविवे" में से एक को बाहर निकालने की आवश्यकता थी, और फिर इसने काम किया।
जॉन श्नाइडर

29
यह बहुत, बहुत गलत है और ओएस के नए संस्करणों में टूट गया है। आप अपने पास नहीं पर्यवेक्षणीय पेड़ न चलें।
केंड्रिक मार्च

2
यह मेरे लिए iOS 6 के तहत काम कर रहा था, लेकिन iOS 7 में टूट गया है। ऐसा प्रतीत होता है कि @KenrikMarch के पास एक वैध बिंदु है!
जॉन श्नाइडर

3
iOS 7 में यह सुपरवाइज 1 कदम है। जैसे [[[प्रेषक पर्यवेक्षक] पर्यवेक्षक] सुपर व्यू];
CW0007007

43

यहाँ है कि मैं यह कैसे करते हैं। सरल और संक्षिप्त:

- (IBAction)buttonTappedAction:(id)sender
{
    CGPoint buttonPosition = [sender convertPoint:CGPointZero
                                           toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
    ...
}

2
और भी सरल: ;-) के CGPointZeroबजाय का उपयोग करें;CGPointMake(0, 0)
जैकब डब्ल्यू

इसके साथ काम करना आसान है। इसके अलावा, स्विफ्ट का अनुवाद करना आसान है। आप सबसे अच्छे हैं :)
फ्रांसिस्को रोमेरो

नीचे स्विफ्ट करने के लिए इसका अनुवाद किया। सबसे आसान समाधान मुझे मिल सकता है। धन्यवाद क्रिस!
रटगर हुइज़्मंस

6

कहीं और इस समस्या का एक अच्छा समाधान मिला, बटन पर टैग के साथ कोई गड़बड़ नहीं है:

- (void)buttonPressedAction:(id)sender {

    NSSet *touches = [event allTouches];
    UITouch *touch = [touches anyObject];
    CGPoint currentTouchPosition = [touch locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition];

    // do stuff with the indexPath...
}

5
यह इस उदाहरण में स्पष्ट नहीं है कि आपको 'ईवेंट' ऑब्जेक्ट कहाँ से प्राप्त होता है।
निक लुदलाम

यह वह उपाय है जिसके साथ मैं गया था। टैग्स का उपयोग करना अप्रत्याशित है जब पंक्तियों को जोड़ने / हटाने के बाद से उनके सूचकांक बदलते हैं। इसके अलावा,
छापा

@NickLudlam: शायद विधि का नाम नहीं है buttonPressedAction:लेकिन buttonPressedAction:forEvent:
केपीएम

5

कैसे इस तरह की जानकारी भेजने के बारे में NSIndexPathमें UIButtonउपयोग करते हुए क्रम इंजेक्शन।

1) आपको आयात पर रनटाइम की आवश्यकता है

2) स्थैतिक स्थिर जोड़ें

3) NSIndexPathरनटाइम पर अपने बटन को जोड़ें :

(शून्य) setMetaData: (आईडी) लक्ष्य withObject: (आईडी) newObj

4) बटन प्रेस पर मेटाडेटा का उपयोग करें:

(आईडी) मेटाडाटा: (आईडी) लक्ष्य

का आनंद लें

    #import <objc/runtime.h>
    static char const * const kMetaDic = "kMetaDic";


    #pragma mark - Getters / Setters

- (id)metaData:(id)target {
    return objc_getAssociatedObject(target, kMetaDic);
}

- (void)setMetaData:(id)target withObject:(id)newObj {
    objc_setAssociatedObject(target, kMetaDic, newObj, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}



    #On the cell constructor
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    ....
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    ....
    [btnSocial addTarget:self
                                   action:@selector(openComments:)
                         forControlEvents:UIControlEventTouchUpInside];

    #add the indexpath here or another object
    [self setMetaData:btnSocial withObject:indexPath];

    ....
    }



    #The action after button been press:

    - (IBAction)openComments:(UIButton*)sender{

        NSIndexPath *indexPath = [self metaData:sender];
        NSLog(@"indexPath: %d", indexPath.row);

        //Reuse your indexpath Now
    }

1
यदि तालिका को पुन: व्यवस्थित किया जाता है या एक पंक्ति हटा दी जाती है तो यह काम नहीं करेगा।
नील

5

करने के लिए (@ व्लादिमीर) का उत्तर स्विफ्ट है:

var buttonPosition = sender.convertPoint(CGPointZero, toView: self.tableView)
var indexPath = self.tableView.indexPathForRowAtPoint(buttonPosition)!

हालाँकि indexPath != nilमुझे जाँचने के लिए उंगली देता है ... "NSIndexPath NSString का उपप्रकार नहीं है"


5

Swift 4.2 और iOS 12 के साथ, आप अपनी समस्या को हल करने के लिए 5 निम्नलिखित पूर्ण उदाहरणों में से एक चुन सकते हैं ।


# 1। का उपयोग करते हुए UIViewकी convert(_:to:)और UITableViewकीindexPathForRow(at:)

import UIKit

private class CustomCell: UITableViewCell {

    let button = UIButton(type: .system)

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        button.setTitle("Tap", for: .normal)
        contentView.addSubview(button)

        button.translatesAutoresizingMaskIntoConstraints = false
        button.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
        button.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
        button.topAnchor.constraint(equalToSystemSpacingBelow: contentView.topAnchor, multiplier: 1).isActive = true
        button.leadingAnchor.constraint(greaterThanOrEqualToSystemSpacingAfter: contentView.leadingAnchor, multiplier: 1).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}
import UIKit

class TableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(CustomCell.self, forCellReuseIdentifier: "CustomCell")
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
        cell.button.addTarget(self, action: #selector(customCellButtonTapped), for: .touchUpInside)
        return cell
    }

    @objc func customCellButtonTapped(_ sender: UIButton) {
        let point = sender.convert(CGPoint.zero, to: tableView)
        guard let indexPath = tableView.indexPathForRow(at: point) else { return }
        print(indexPath)
    }

}

# 2। UIView'S convert(_:to:)और UITableView' s indexPathForRow(at:)(वैकल्पिक) का उपयोग करना

यह पिछले उदाहरण है जहाँ हम पारित करने के लिए एक विकल्प है nilकरने के लिए targetमें पैरामीटर addTarget(_:action:for:)। इस तरह, यदि पहला उत्तरदाता कार्रवाई को कार्यान्वित नहीं करता है, तो उसे उत्तरदाता को अगली श्रृंखला में भेजा जाएगा जब तक कि एक उचित कार्यान्वयन नहीं मिलता है।

import UIKit

private class CustomCell: UITableViewCell {

    let button = UIButton(type: .system)

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        button.setTitle("Tap", for: .normal)
        button.addTarget(nil, action: #selector(TableViewController.customCellButtonTapped), for: .touchUpInside)
        contentView.addSubview(button)

        button.translatesAutoresizingMaskIntoConstraints = false
        button.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
        button.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
        button.topAnchor.constraint(equalToSystemSpacingBelow: contentView.topAnchor, multiplier: 1).isActive = true
        button.leadingAnchor.constraint(greaterThanOrEqualToSystemSpacingAfter: contentView.leadingAnchor, multiplier: 1).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}
import UIKit

class TableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(CustomCell.self, forCellReuseIdentifier: "CustomCell")
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
        return cell
    }

    @objc func customCellButtonTapped(_ sender: UIButton) {
        let point = sender.convert(CGPoint.zero, to: tableView)
        guard let indexPath = tableView.indexPathForRow(at: point) else { return }
        print(indexPath)
    }

}

# 3। का उपयोग करते हुए UITableViewकी indexPath(for:)और प्रतिनिधि पैटर्न

इस उदाहरण में, हम सेल के प्रतिनिधि के रूप में दृश्य नियंत्रक सेट करते हैं। जब सेल का बटन टैप किया जाता है, तो यह कॉल को प्रतिनिधि की उचित विधि से चलाता है।

import UIKit

protocol CustomCellDelegate: AnyObject {
    func customCellButtonTapped(_ customCell: CustomCell)
}

class CustomCell: UITableViewCell {

    let button = UIButton(type: .system)
    weak var delegate: CustomCellDelegate?

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        button.setTitle("Tap", for: .normal)
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
        contentView.addSubview(button)

        button.translatesAutoresizingMaskIntoConstraints = false
        button.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
        button.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
        button.topAnchor.constraint(equalToSystemSpacingBelow: contentView.topAnchor, multiplier: 1).isActive = true
        button.leadingAnchor.constraint(greaterThanOrEqualToSystemSpacingAfter: contentView.leadingAnchor, multiplier: 1).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    @objc func buttonTapped(sender: UIButton) {
        delegate?.customCellButtonTapped(self)
    }

}
import UIKit

class TableViewController: UITableViewController, CustomCellDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(CustomCell.self, forCellReuseIdentifier: "CustomCell")
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
        cell.delegate = self
        return cell
    }

    // MARK: - CustomCellDelegate

    func customCellButtonTapped(_ customCell: CustomCell) {
        guard let indexPath = tableView.indexPath(for: customCell) else { return }
        print(indexPath)
    }

}

# 4। का उपयोग करते हुए UITableView's indexPath(for:)और प्रतिनिधिमंडल के लिए एक बंद

यह पिछले उदाहरण का एक विकल्प है जहां हम बटन टैप को संभालने के लिए प्रोटोकॉल-डेलीगेट की घोषणा के बजाय एक क्लोजर का उपयोग करते हैं।

import UIKit

class CustomCell: UITableViewCell {

    let button = UIButton(type: .system)
    var buttontappedClosure: ((CustomCell) -> Void)?

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        button.setTitle("Tap", for: .normal)
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
        contentView.addSubview(button)

        button.translatesAutoresizingMaskIntoConstraints = false
        button.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
        button.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
        button.topAnchor.constraint(equalToSystemSpacingBelow: contentView.topAnchor, multiplier: 1).isActive = true
        button.leadingAnchor.constraint(greaterThanOrEqualToSystemSpacingAfter: contentView.leadingAnchor, multiplier: 1).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    @objc func buttonTapped(sender: UIButton) {
        buttontappedClosure?(self)
    }

}
import UIKit

class TableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(CustomCell.self, forCellReuseIdentifier: "CustomCell")
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
        cell.buttontappedClosure = { [weak tableView] cell in
            guard let indexPath = tableView?.indexPath(for: cell) else { return }
            print(indexPath)
        }
        return cell
    }

}

# 5। का उपयोग करते हुए UITableViewCellकी accessoryTypeऔर UITableViewDelegateकीtableView(_:accessoryButtonTappedForRowWith:)

अपने बटन एक है UITableViewCellके मानक गौण नियंत्रण, इस पर कोई नल के लिए एक कॉल ट्रिगर किया जाएगा UITableViewDelegates ' tableView(_:accessoryButtonTappedForRowWith:), आप संबंधित सूचकांक पथ प्राप्त करने के लिए अनुमति देता है।

import UIKit

private class CustomCell: UITableViewCell {

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        accessoryType = .detailButton
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}
import UIKit

class TableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(CustomCell.self, forCellReuseIdentifier: "CustomCell")
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
        return cell
    }

    override func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) {
        print(indexPath)
    }

}

5
func buttonAction(sender:UIButton!)
    {
        var position: CGPoint = sender.convertPoint(CGPointZero, toView: self.tablevw)
        let indexPath = self.tablevw.indexPathForRowAtPoint(position)
        let cell: TableViewCell = tablevw.cellForRowAtIndexPath(indexPath!) as TableViewCell
        println(indexPath?.row)
        println("Button tapped")
    }

3

मैं टैग संपत्ति का उपयोग करूंगा जैसे आपने कहा, टैग को इस तरह सेट करना:

[button setTag:indexPath.row];

फिर बटन के अंदर टैग प्राप्त करना

((UIButton *)sender).tag

या

UIButton *button = (UIButton *)sender; 
button.tag;

5
यह दृष्टिकोण वर्गों के साथ तालिकाओं के लिए पूरी तरह से टूट गया है।
ओहोरोब

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

2
tagएक पूर्णांक है। अनुक्रमणिका पथों को देखने के टैग में एन्कोडिंग / डीकोडिंग करने के लिए थोड़ा अनाड़ी लगता है।
ओहोरोब

यह सही है, लेकिन यह एक समाधान है, हालांकि एक ऐसा नहीं है जिसका उपयोग मैं करता अगर मेरे अनुभाग थे। मैं यह कहने की कोशिश कर रहा था कि यह इस पद्धति का उपयोग करके किया जा सकता है, कि इसे तोड़ा नहीं गया। एक बेहतर, अधिक जटिल संस्करण UITableView के अंदर बटन की स्थिति से इंडेक्सपथ का निर्धारण करेगा। हालाँकि, जब से प्रबल ने कहा है कि उसके पास केवल पाँच कोशिकाएँ हैं (बिना वर्गों के), यह संभवतः उस पद्धति को जटिल बनाता है और आपकी प्रारंभिक टिप्पणी और यह पूरी टिप्पणी धागा व्यर्थ है।
एसीबर्क

3

हालांकि मुझे टैग तरीका पसंद है ... यदि आप किसी भी कारण से टैग का उपयोग नहीं करना चाहते हैं, तो आप NSArrayप्रीमियर बटन का सदस्य बना सकते हैं :

NSArray* buttons ;

तब तालिका दृश्य रेंडर करने से पहले उन बटनों को बनाएं और उन्हें सरणी में धकेलें।

तो tableView:cellForRowAtIndexPath:आप कर सकते हैं समारोह के अंदर :

UIButton* button = [buttons objectAtIndex:[indexPath row] ] ;
[cell.contentView addSubview:button];

फिर buttonPressedAction:फ़ंक्शन में, आप कर सकते हैं

- (void)buttonPressedAction:(id)sender {
   UIButton* button = (UIButton*)sender ;
   int row = [buttons indexOfObject:button] ;
   // Do magic
}

2

हस्तलिखित अनुभागों के लिए - मैंने NSIndexPath को एक कस्टम UITableViewCell में संग्रहीत किया

CLKIndexPricesHEADERTableViewCell.xib में

IB में UIButton को XIB में जोड़ें - न क्रिया जोड़ें!

आउटलेट जोड़ें @property (रिटेन, नॉनटोमिक) IBOutlet UIButton * बटनइंडेक्ससैक्शन क्लोज़;

IB में एक कार्रवाई नहीं CTRL + DRAG करें (नीचे दिए गए कोड में)

@interface CLKIndexPricesHEADERTableViewCell : UITableViewCell
...
@property (retain, nonatomic) IBOutlet UIButton *buttonIndexSectionClose;
@property (nonatomic, retain) NSIndexPath * indexPathForCell;
@end

ViewForHeaderInSection में (सेलफ़ोर राउ के लिए भी काम करना चाहिए .... आदि यदि आपके पास तालिका केवल 1 खंड है)

- viewForHeaderInSection is called for each section 1...2...3
- get the cell CLKIndexPricesHEADERTableViewCell 
- getTableRowHEADER just does the normal dequeueReusableCellWithIdentifier
- STORE the indexPath IN the UITableView cell
- indexPath.section = (NSInteger)section
- indexPath.row = 0 always (we are only interested in sections)

- (UIView *) tableView:(UITableView *)tableView1 viewForHeaderInSection:(NSInteger)section {


    //Standard method for getting a UITableViewCell
    CLKIndexPricesHEADERTableViewCell * cellHEADER = [self getTableRowHEADER];

... अपने सेल के लिए डेटा प्राप्त करने के लिए अनुभाग का उपयोग करें

...भर दीजिये

   indexName        = ffaIndex.routeCode;
   indexPrice       = ffaIndex.indexValue;

   //

   [cellHEADER.buttonIndexSectionClose addTarget:self
                                          action:@selector(buttonDELETEINDEXPressedAction:forEvent:)
                                forControlEvents:UIControlEventTouchUpInside];


   cellHEADER.indexPathForCell = [NSIndexPath indexPathForRow:0 inSection:section];


    return cellHEADER;
}

USER DELETE बटन को सेक्शन हेडर पर दबाता है और यह कॉल करता है

- (void)buttonDELETEINDEXPressedAction:(id)sender forEvent:(UIEvent *)event
{
    NSLog(@"%s", __PRETTY_FUNCTION__);


    UIView *  parent1 = [sender superview];   // UiTableViewCellContentView
    //UIView *myContentView = (UIView *)parent1;

    UIView *  parent2 = [parent1 superview];  // custom cell containing the content view
    //UIView *  parent3 = [parent2 superview];  // UITableView containing the cell
    //UIView *  parent4 = [parent3 superview];  // UIView containing the table


    if([parent2 isMemberOfClass:[CLKIndexPricesHEADERTableViewCell class]]){
        CLKIndexPricesHEADERTableViewCell *myTableCell = (CLKIndexPricesHEADERTableViewCell *)parent2;

        //UITableView *myTable = (UITableView *)parent3;
        //UIView *mainView = (UIView *)parent4;

        NSLog(@"%s indexPath.section,row[%d,%d]", __PRETTY_FUNCTION__, myTableCell.indexPathForCell.section,myTableCell.indexPathForCell.row);

        NSString *key = [self.sortedKeysArray objectAtIndex:myTableCell.indexPathForCell.section];
        if(key){
            NSLog(@"%s DELETE object at key:%@", __PRETTY_FUNCTION__,key);
            self.keyForSectionIndexToDelete = key;
            self.sectionIndexToDelete = myTableCell.indexPathForCell.section;

            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Remove Index"
                                                                message:@"Are you sure"
                                                               delegate:self
                                                      cancelButtonTitle:@"No"
                                                      otherButtonTitles:@"Yes", nil];
            alertView.tag = kALERTVIEW_REMOVE_ONE_INDEX;
            [alertView show];
            [alertView release];
            //------
        }else{
            NSLog(@"ERROR: [%s] key is nil for section:%d", __PRETTY_FUNCTION__,myTableCell.indexPathForCell.section);
        }

    }else{
        NSLog(@"ERROR: [%s] CLKIndexPricesHEADERTableViewCell not found", __PRETTY_FUNCTION__);
    }
}

इस उदाहरण में मैंने एक डिलीट बटन जोड़ा है ताकि इसकी पुष्टि के लिए UIAlertView दिखाएं

मैं वीसी में एक ivar में अनुभाग के बारे में जानकारी संग्रहीत शब्दकोश में अनुभाग और कुंजी को संग्रहीत करता हूं

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
   if(alertView.tag == kALERTVIEW_REMOVE_ONE_INDEX){
        if(buttonIndex==0){
            //NO
            NSLog(@"[%s] BUTTON:%d", __PRETTY_FUNCTION__,buttonIndex);
            //do nothing
        }
        else if(buttonIndex==1){
            //YES
            NSLog(@"[%s] BUTTON:%d", __PRETTY_FUNCTION__,buttonIndex);
            if(self.keyForSectionIndexToDelete != nil){

                //Remove the section by key
                [self.indexPricesDictionary removeObjectForKey:self.keyForSectionIndexToDelete];

                //sort the keys so sections appear alphabetically/numbericsearch (minus the one we just removed)
                [self updateTheSortedKeysArray];                

                //Delete the section from the table using animation
                [self.tableView beginUpdates];

                [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:self.sectionIndexToDelete]
                              withRowAnimation:UITableViewRowAnimationAutomatic];
                [self.tableView endUpdates];

                //required to trigger refresh of myTableCell.indexPathForCell else old values in UITableViewCells
                [self.tableView reloadData];
            }else{
                NSLog(@"ERROR: [%s] OBJECT is nil", __PRETTY_FUNCTION__);
            }
        }
        else {
            NSLog(@"ERROR: [%s] UNHANDLED BUTTON:%d", __PRETTY_FUNCTION__,buttonIndex);
        }
    }else {
        NSLog(@"ERROR: [%s] unhandled ALERTVIEW TAG:%d", __PRETTY_FUNCTION__,alertView.tag);
    }
}

2
A better way would be to subclass your button and add a indexPath property to it.

//Implement a subclass for UIButton.

@interface NewButton:UIButton
@property(nonatomic, strong) NSIndexPath *indexPath;


Make your button of type NewButton in the XIB or in the code whereever you are initializing them.

Then in the cellForRowAtIndexPath put the following line of code.

button.indexPath = indexPath;

return cell; //As usual



Now in your IBAction

-(IBAction)buttonClicked:(id)sender{
   NewButton *button = (NewButton *)sender;

//Now access the indexPath by buttons property..

   NSIndexPath *indexPath = button.indexPath; //:)
}

यह थोड़ा छोटा है क्योंकि यदि आप deleteRowsAtIndexPaths कहते हैं तो सेल का इंडेक्सपैथ बदल सकता है।
जॉन गिब

deleteRowsAtIndexPaths के कारण सेलफ़ोरराउट। IndexexPath को फिर से कॉल किया जाएगा। फिर बटन में नए सही इंडेक्सपैथ होंगे।
22

1

यह मेरे लिए काम करता है aswell, धन्यवाद @ कोकोनट

मैंने पाया कि कोशिका के इंडेक्सपथ के संदर्भ को पूरी तरह से काम करने के लिए पर्यवेक्षक के पर्यवेक्षण का उपयोग करने की विधि मिली। टिप लिंक पाठ के लिए iphonedevbook.com (macnsmith) का धन्यवाद

-(void)buttonPressed:(id)sender {
 UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
 NSIndexPath *clickedButtonPath = [self.tableView indexPathForCell:clickedCell];
...

}

0

आप टैग पैटर्न का उपयोग कर सकते हैं:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     NSString *identifier = @"identifier";
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
     if (cell == nil) {
         cell = [[UITableView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
         [cell autorelelase];

         UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 5, 40, 20)];
         [button addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside];
         [button setTag:[indexPath row]]; //use the row as the current tag
         [cell.contentView addSubview:button];

         [button release];
     }

     UIButton *button = (UIButton *)[cell viewWithTag:[indexPath row]]; //use [indexPath row]
     [button setTitle:@"Edit" forState:UIControlStateNormal];

     return cell;
}

- (void)buttonPressedAction:(id)sender
{
    UIButton *button = (UIButton *)sender;
    //button.tag has the row number (you can convert it to indexPath)
}

अगर मैं एक ही सेल पर कई नियंत्रण रखता तो मैं नियंत्रणों को कैसे टैग करूंगा?
लगाम

मुझे यकीन नहीं है कि यह काम करेगा - यदि सेल पंक्ति # 1 के लिए बनाई जाती है, तो उसे टैग मिल जाएगा। 1. यदि यह पंक्ति # 3 के लिए समाप्त हो जाता है, तो यह अभी भी 1 का टैग होगा, न कि 3.
प्रबलित

लगता है कि आप दूसरी टिप्पणी के बारे में सही हैं। मेरी गलती। मुझे लगता है कि आपका सबसे अच्छा समाधान UIButton को उप-वर्ग करना है, एक अन्य संपत्ति या अपने खुद के दो जोड़े, और फिर उन्हें उपयुक्त मामलों में सेट / प्राप्त करें (टैग के साथ छड़ी: 1 आपके कोड में था)
Nir Levy

0

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

<UIButton: 0x4b95c10; frame = (246 26; 30 30); opaque = NO; tag = 104; layer = <CALayer: 0x4b95be0>>

फिर यदि आप बटन के गुणों को बदलना चाहते हैं, तो पृष्ठभूमि छवि कहें जो आप सिर्फ प्रेषक को बताते हैं:

[sender setBackgroundImage:[UIImage imageNamed:@"new-image.png"] forState:UIControlStateNormal];

अगर आपको टैग की जरूरत है तो ACBurk का तरीका ठीक है।


1
वे अपने "ऑब्जेक्ट" की तलाश कर रहे हैं जो बटन से संबंधित है
ओहोरोब

0
// how do I know which button sent this message?
// processing button press for this row requires an indexPath.

वास्तव में बहुत सीधा:

- (void)buttonPressedAction:(id)sender
{
    UIButton *button = (UIButton *)sender;
    CGPoint rowButtonCenterInTableView = [[rowButton superview] convertPoint:rowButton.center toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:rowButtonCenterInTableView];
    MyTableViewItem *rowItem = [self.itemsArray objectAtIndex:indexPath.row];
    // Now you're good to go.. do what the intention of the button is, but with
    // the context of the "row item" that the button belongs to
    [self performFooWithItem:rowItem];
}

मेरे लिए अच्छी तरह से काम करना: पी

यदि आप अपना लक्ष्य-एक्शन सेटअप समायोजित करना चाहते हैं, तो आप इवेंट पैरामीटर को विधि में शामिल कर सकते हैं, और फिर टच के निर्देशांक को हल करने के लिए उस इवेंट के टच का उपयोग कर सकते हैं। निर्देशांक को अभी भी स्पर्श दृश्य सीमा में हल करने की आवश्यकता है, लेकिन यह कुछ लोगों के लिए आसान लग सकता है।


0

एक nsmutable सरणी बनाएँ और उस सरणी में सभी बटन डालें [array addObject: yourButton];

बटन प्रेस विधि में

-

 (void)buttonPressedAction:(id)sender
{
    UIButton *button = (UIButton *)sender;

for(int i=0;i<[yourArray count];i++){

if([buton isEqual:[yourArray objectAtIndex:i]]){

//here write wat u need to do

}
}

0

कोकोनट्स के उत्तर पर थोड़ी भिन्नता (जिसने मुझे इसे हल करने में मदद की) जब बटन एक तालिका के पाद लेख में था (जो आपको 'क्लिक की गई सेल' खोजने से रोकता है:

-(IBAction) buttonAction:(id)sender;
{
    id parent1 = [sender superview];   // UiTableViewCellContentView
    id parent2 = [parent1 superview];  // custom cell containing the content view
    id parent3 = [parent2 superview];  // UITableView containing the cell
    id parent4 = [parent3 superview];  // UIView containing the table

    UIView *myContentView = (UIView *)parent1;
    UITableViewCell *myTableCell = (UITableViewCell *)parent2;
    UITableView *myTable = (UITableView *)parent3;
    UIView *mainView = (UIView *)parent4;

    CGRect footerViewRect = myTableCell.frame;
    CGRect rect3 = [myTable convertRect:footerViewRect toView:mainView];    

    [cc doSomethingOnScreenAtY:rect3.origin.y];
}

0

मैं हमेशा टैग का उपयोग करता हूं।

आपको UITableviewCellवहां से बटन दबाना और संभालना होगा।


मुझे समझ नहीं आता कि कैसे। टैग संपत्ति सेल निर्माण के दौरान स्थापित की जाती है - यह सेल प्रत्येक पंक्ति के लिए समान पहचानकर्ता के साथ पुन: प्रयोज्य है। यह टैग जेनेरिक पुन: प्रयोज्य सेल में नियंत्रण के लिए विशिष्ट है। मैं इस टैग का उपयोग उन कोशिकाओं में बटन को अलग करने के लिए कैसे कर सकता हूं जो सामान्य तरीके से बनाई गई थीं? क्या आप कुछ कोड पोस्ट कर सकते हैं?
लगाम

0

यह आसान है; एक कस्टम सेल बनाएं और बटन का एक आउटलेट लें

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
         NSString *identifier = @"identifier";
        customCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    cell.yourButton.tag = indexPath.Row;

- (void)buttonPressedAction:(id)sender

ऊपर विधि में आईडी बदलें (UIButton *)

आप मान प्राप्त कर सकते हैं कि प्रेषक को किस बटन पर टैप किया जा रहा है।


0

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


0

स्विफ्ट 2 अद्यतन

यहाँ बताया गया है कि किस बटन पर टैप किया गया था + उस बटन से किसी अन्य ViewController को डेटा भेजें indexPath.rowक्योंकि मैं मान रहा हूं कि यह सबसे अधिक है!

@IBAction func yourButton(sender: AnyObject) {


     var position: CGPoint = sender.convertPoint(CGPointZero, toView: self.tableView)
        let indexPath = self.tableView.indexPathForRowAtPoint(position)
        let cell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath!)! as
        UITableViewCell
        print(indexPath?.row)
        print("Tap tap tap tap")

    }

उन लोगों के लिए जो एक ViewController क्लास का उपयोग कर रहे हैं और एक tableView जोड़ा है, मैं एक TableViewController के बजाय एक ViewController का उपयोग कर रहा हूं इसलिए मैंने इसे एक्सेस करने के लिए मैन्युअल रूप से tableView जोड़ा।

यहां उस बटन को टैप करने और सेल के पास होने पर किसी अन्य वीसी को डेटा पास करने के लिए कोड दिया गया है indexPath.row

@IBAction func moreInfo(sender: AnyObject) {

    let yourOtherVC = self.storyboard!.instantiateViewControllerWithIdentifier("yourOtherVC") as! YourOtherVCVIewController



    var position: CGPoint = sender.convertPoint(CGPointZero, toView: self.tableView)
    let indexPath = self.tableView.indexPathForRowAtPoint(position)
    let cell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath!)! as
    UITableViewCell
    print(indexPath?.row)
    print("Button tapped")


    yourOtherVC.yourVarName = [self.otherVCVariable[indexPath!.row]]

    self.presentViewController(yourNewVC, animated: true, completion: nil)

}

0

ध्यान दें कि मैं कस्टम सेल का उपयोग कर रहा हूं यह कोड मेरे लिए पूरी तरह से काम कर रहा है

 @IBAction func call(sender: UIButton)
    {
        var contentView = sender.superview;
        var cell = contentView?.superview as EmployeeListCustomCell
        if (!(cell.isKindOfClass(EmployeeListCustomCell)))
        {
            cell = (contentView?.superview)?.superview as EmployeeListCustomCell
        }

        let phone = cell.lblDescriptionText.text!
        //let phone = detailObject!.mobile!
        let url:NSURL = NSURL(string:"tel://"+phone)!;
        UIApplication.sharedApplication().openURL(url);
    }

0

क्रिस Schwerdt समाधान लेकिन फिर स्विफ्ट में मेरे लिए काम किया:

@IBAction func rateButtonTapped(sender: UIButton) {
    let buttonPosition : CGPoint = sender.convertPoint(CGPointZero, toView: self.ratingTableView)
    let indexPath : NSIndexPath = self.ratingTableView.indexPathForRowAtPoint(buttonPosition)!

    print(sender.tag)
    print(indexPath.row)
}

0

इस समस्या के दो भाग हैं:

1) इंडेक्स पथ को प्राप्त करना UITableViewCellजिसमें दबाया गया होUIButton

कुछ सुझाव हैं:

  • अद्यतन कर रहा है UIButton's tagमें cellForRowAtIndexPath:सूचकांक पथ का उपयोग करते हुए विधि rowमूल्य। यह एक अच्छा समाधान नहीं है क्योंकि इसे tagलगातार अपडेट करने की आवश्यकता होती है और यह एक से अधिक सेक्शन वाले टेबल व्यू के साथ काम नहीं करता है।

  • एक जोड़ा जा रहा है NSIndexPathकस्टम सेल करने के लिए संपत्ति और के बजाय अद्यतन करने UIButtonके tagमें cellForRowAtIndexPath:विधि। यह कई खंड की समस्या को हल करता है लेकिन फिर भी अच्छा नहीं है क्योंकि इसे हमेशा अपडेट करने की आवश्यकता होती है।

  • UITableViewकस्टम सेल में इसे बनाते समय और indexPathForCell:इंडेक्स पथ प्राप्त करने के लिए विधि का उपयोग करते हुए माता-पिता के लिए कमजोर रिफेंस को ध्यान में रखते हुए । थोड़ा बेहतर लगता है, cellForRowAtIndexPath:विधि में कुछ भी अपडेट करने की आवश्यकता नहीं है , लेकिन फिर भी कस्टम सेल बनने पर कमजोर संदर्भ सेट करने की आवश्यकता होती है।

  • superViewमाता-पिता का संदर्भ प्राप्त करने के लिए सेल की संपत्ति का उपयोग करना UITableView। कस्टम सेल में किसी भी गुण को जोड़ने की आवश्यकता नहीं है, और निर्माण / बाद में कुछ भी सेट / अपडेट करने की आवश्यकता नहीं है। लेकिन सेल superViewआईओएस कार्यान्वयन विवरण पर निर्भर करता है। इसलिए इसका सीधा उपयोग नहीं किया जा सकता है।

लेकिन यह एक सरल लूप का उपयोग करके प्राप्त किया जा सकता है, क्योंकि हमें यकीन है कि प्रश्न में सेल को UITableView में होना चाहिए:

UIView* view = self;
while (view && ![view isKindOfClass:UITableView.class])
    view = view.superview;
UITableView* parentTableView = (UITableView*)view;

इसलिए, इन सुझावों को सूचकांक पथ प्राप्त करने के लिए एक सरल और सुरक्षित कस्टम सेल विधि में जोड़ा जा सकता है:

- (NSIndexPath *)indexPath
{
    UIView* view = self;

    while (view && ![view isKindOfClass:UITableView.class])
        view = view.superview;

    return [(UITableView*)view indexPathForCell:self];
}

अब से, इस विधि का उपयोग यह पता लगाने के लिए किया जा सकता है कि कौन UIButtonदबाया गया है।

2) बटन प्रेस घटना के बारे में अन्य दलों को सूचित करना

आंतरिक रूप से यह जानने के बाद कि कौन UIButtonसे कस्टम सेल को सटीक इंडेक्स पथ के साथ दबाया जाता है, इस जानकारी को अन्य पार्टियों (सबसे अधिक संभवत: व्यू कंट्रोलर UITableView) को भेजना होगा । तो, यह बटन क्लिक इवेंट didSelectRowAtIndexPath:UITableView प्रतिनिधि की विधि के समान अमूर्त और तर्क स्तर में संभाला जा सकता है ।

इसके लिए दो तरीकों का इस्तेमाल किया जा सकता है:

ए) प्रतिनिधिमंडल: कस्टम सेल में एक delegateसंपत्ति हो सकती है और एक प्रोटोकॉल को परिभाषित कर सकता है। जब बटन दबाया जाता है तो यह प्रदर्शन करता है कि यह delegateसंपत्ति पर प्रतिनिधि तरीके हैं। लेकिन इस delegateप्रॉपर्टी को प्रत्येक कस्टम सेल के लिए सेट किए जाने की आवश्यकता होती है जब वे बनाए जाते हैं। एक विकल्प के रूप में, कस्टम सेल अपनी प्रतिनिधि विधियों को पेरेंट टेबल व्यू के लिए delegateभी कर सकता है।

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


0

मैं एक समाधान का उपयोग करता हूं जो उपवर्ग है UIButton और मुझे लगा कि मुझे इसे यहां साझा करना चाहिए, स्विफ्ट में कोड:

class ButtonWithIndexPath : UIButton {
    var indexPath:IndexPath?
}

फिर इसे इंडेक्सपैथ में अपडेट करना याद रखें cellForRow(at:)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let returnCell = tableView.dequeueReusableCell(withIdentifier: "cellWithButton", for: indexPath) as! cellWithButton
    ...
    returnCell.button.indexPath = IndexPath
    returnCell.button.addTarget(self, action:#selector(cellButtonPressed(_:)), for: .touchUpInside)

    return returnCell
}

तो जब बटन की घटना का जवाब आप इसे पसंद कर सकते हैं

func cellButtonPressed(_ sender:UIButton) {
    if sender is ButtonWithIndexPath {
        let button = sender as! ButtonWithIndexPath
        print(button.indexPath)
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.