รับปุ่มคลิกภายใน UITableViewCell


140

ฉันมีตัวควบคุมมุมมองที่มีมุมมองตารางและปลายปากกาแยกต่างหากสำหรับแม่แบบเซลล์ตาราง แม่แบบเซลล์มีปุ่มบางปุ่ม ฉันต้องการเข้าถึงการคลิกปุ่มพร้อมกับดัชนีของเซลล์ที่คลิกภายในตัวควบคุมมุมมองที่ฉันได้กำหนดมุมมองตาราง

ดังนั้นผมจึงมีViewController.hและViewController.mที่ผมมีUITableViewและTableTemplate.h, TableTemplate.mและTableTemplate.xibที่ฉันมีจะงอยที่กำหนดไว้ ViewController.mฉันต้องการเหตุการณ์คลิกปุ่มที่มีค่าดัชนีเซลล์ใน

ความช่วยเหลือเกี่ยวกับฉันจะทำอย่างไร

คำตอบ:


258

1) ในcellForRowAtIndexPath:วิธีการของคุณกำหนดแท็กปุ่มเป็นดัชนี:

cell.yourbutton.tag = indexPath.row;

2) เพิ่มเป้าหมายและการกระทำสำหรับปุ่มของคุณดังนี้:

[cell.yourbutton addTarget:self action:@selector(yourButtonClicked:) forControlEvents:UIControlEventTouchUpInside];

3) การกระทำของรหัสตามดัชนีด้านล่างในViewControler:

-(void)yourButtonClicked:(UIButton*)sender
{
     if (sender.tag == 0) 
     {
         // Your code here
     }
}

อัปเดตสำหรับหลายส่วน:

คุณสามารถตรวจสอบลิงค์นี้เพื่อตรวจสอบการคลิกปุ่มในมุมมองตารางสำหรับหลายแถวและส่วน


1
สิ่งนี้สามารถทำได้ผ่านตัวสร้างส่วนติดต่อ (IB) ในขั้นตอนที่สอง เพียงตรวจสอบให้แน่ใจว่าได้ตั้งค่าแท็กปุ่มของคุณแล้ว คุณไม่ต้องการที่จะเรียกการกระทำของคุณ ทำผ่าน IB หรือทำอย่างชัดเจนในรหัสของคุณ
Sententia

@Mani มันไม่ทำลาย MVC - การกระทำอยู่ใน TableView ไม่ใช่เซลล์
davecom

@davecom หากคุณตั้งค่าเป้าหมายเป็นเซลล์ (ผ่าน IB) มันจะถูกทริกเกอร์จาก tableView ได้อย่างไร? หรือเป็นวิธีการเชื่อมต่อเป้าหมายปุ่มเพื่อ tableview ซึ่งอยู่ใน xib ของเซลล์หรือไม่
มณี

24
วิธีการแก้ปัญหานี้ทำงานเป็นปัญหาเมื่อคุณเริ่มแทรกและลบแถว แท็กจะไม่อัปเดตเมื่อมีการเปลี่ยนแถว แทนที่จะเก็บการอ้างอิงไปยังแถว อาจเป็นการดีกว่าที่จะอ้างอิงถึง ID วัตถุที่ไม่ซ้ำกัน
Vincent Cheong

1
เมื่อใดก็ตามที่คุณพบว่าคุณกำหนดค่าให้กับแอตทริบิวต์แท็กของมุมมองคุณจะได้กลิ่นรหัสที่แย่มากที่สามารถกัดคุณได้ในภายหลัง ค้นหาวิธีที่ดีกว่าเพื่อให้บรรลุเป้าหมายไม่ใช่โพสต์แรกที่คุณค้นหา
TigerCoding

148

ผู้ได้รับมอบหมายเป็นวิธีที่จะไป

เท่าที่เห็นกับคำตอบอื่น ๆ ที่ใช้มุมมองอาจล้าสมัย cell superview]superview]superview]superview]ใครจะรู้ว่าวันพรุ่งนี้อาจจะมีเสื้อคลุมอีกและอาจจำเป็นต้องใช้ และถ้าคุณใช้แท็กคุณจะต้องจบลงด้วยจำนวน n เงื่อนไขอื่น ๆ เพื่อระบุเซลล์ เพื่อหลีกเลี่ยงการตั้งค่าผู้รับมอบสิทธิ์ทั้งหมด (โดยการทำเช่นนั้นคุณจะต้องสร้างคลาสเซลล์ที่ใช้งานได้อีกครั้งคุณสามารถใช้คลาสเซลล์เดียวกันกับคลาสพื้นฐานและสิ่งที่คุณต้องทำก็คือการใช้เมธอดผู้รับมอบสิทธิ์)

ก่อนอื่นเราต้องมีอินเตอร์เฟส (โปรโตคอล) ซึ่งจะถูกใช้โดยเซลล์เพื่อสื่อสาร (คลิก) ปุ่มคลิก ( คุณสามารถสร้างไฟล์. h แยกต่างหากสำหรับโปรโตคอลและรวมไว้ในทั้งตัวควบคุมมุมมองตารางและคลาสเซลล์ที่กำหนดเองหรือเพียงแค่เพิ่มในคลาสเซลล์ที่กำหนดเองซึ่งจะรวมอยู่ในตัวควบคุมมุมมองตารางต่อไป )

@protocol CellDelegate <NSObject>
- (void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data;
@end

รวมโปรโตคอลนี้ในเซลล์ที่กำหนดเองและตัวควบคุมมุมมองตาราง และตรวจสอบให้แน่ใจว่าคอนโทรลเลอร์มุมมองตารางยืนยันโปรโตคอลนี้

ในเซลล์ที่กำหนดเองสร้างสองคุณสมบัติ:

@property (weak, nonatomic) id<CellDelegate>delegate;
@property (assign, nonatomic) NSInteger cellIndex;

ในการUIButtonมอบหมาย IBAction ให้คลิก: ( สามารถทำได้เหมือนกันสำหรับการดำเนินการใด ๆ ในคลาสเซลล์ที่กำหนดเองซึ่งจะต้องมีการมอบหมายให้กลับไปดูคอนโทรลเลอร์ )

- (IBAction)buttonClicked:(UIButton *)sender {
    if (self.delegate && [self.delegate respondsToSelector:@selector(didClickOnCellAtIndex:withData:)]) {
        [self.delegate didClickOnCellAtIndex:_cellIndex withData:@"any other cell data/property"];
    }
}

ในตัวควบคุมมุมมองตารางcellForRowAtIndexPathหลังจาก dequeing เซลล์ตั้งค่าคุณสมบัติข้างต้น

cell.delegate = self;
cell.cellIndex = indexPath.row; // Set indexpath if its a grouped table.

และใช้ผู้รับมอบสิทธิ์ในตัวควบคุมมุมมองตาราง:

- (void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data
{
    // Do additional actions as required.
    NSLog(@"Cell at Index: %d clicked.\n Data received : %@", cellIndex, data);
}

นี่จะเป็นวิธีที่เหมาะสมที่สุดในการรับการกระทำของปุ่มเซลล์แบบกำหนดเองในตัวควบคุมมุมมองตาราง


2
เหตุใดคุณจึงมอบหมายให้ตัวแทนมีคุณสมบัติที่แข็งแกร่งของเซลล์ สิ่งนี้จะทำให้คุณมีวงจรการเก็บรักษาเว้นแต่คุณจะรู้ว่าตัวควบคุมเก็บเซลล์ไว้อย่างอ่อน ๆ เท่านั้น
JulianSymes

สิ่งที่เกี่ยวกับเครื่องหมาย _cellIndex อัปเดตหลังจากลบเซลล์แล้ว
skornos

2
ฉันได้ยินจากเพื่อนคนหนึ่งของฉันบอกว่าการใช้ตัวแทนในแต่ละเซลล์ทำให้เกิดการใช้หน่วยความจำดังนั้นให้ใช้แท็ก มันเป็นเรื่องจริงเหรอ?
Bista

2
ตรวจสอบคำถามนี้เพื่อนstackoverflow.com/questions/31649220/…
Nischal Hada

@the_UB การตั้งค่าแท็กและการจัดเก็บข้อมูลอ้างอิงมีไม่มากนัก อาจเป็นไปได้ว่าแท็กนั้นจะใช้หน่วยความจำมากขึ้น
Ian Warburton

66

แทนที่จะเล่นกับแท็กฉันใช้วิธีการที่แตกต่างกัน ทำผู้รับมอบสิทธิ์สำหรับคลาสย่อยของฉันของ UITableViewCell (OptionButtonsCell) และเพิ่ม indexPath var จากปุ่มของฉันในกระดานเรื่องราวฉันเชื่อมต่อ @IBAction กับ OptionButtonsCell และฉันส่งวิธีมอบสิทธิ์ด้วย indexPath ที่ถูกต้องให้กับทุกคนที่สนใจ ในเซลล์สำหรับเส้นทางดัชนีฉันตั้งค่า indexPath ปัจจุบันและใช้งานได้ :)

ให้รหัสพูดด้วยตัวเอง:

Swift 3 Xcode 8

OptionButtonsTableViewCell.swift

import UIKit
protocol OptionButtonsDelegate{
    func closeFriendsTapped(at index:IndexPath)
}
class OptionButtonsTableViewCell: UITableViewCell {
    var delegate:OptionButtonsDelegate!
    @IBOutlet weak var closeFriendsBtn: UIButton!
    var indexPath:IndexPath!
    @IBAction func closeFriendsAction(_ sender: UIButton) {
        self.delegate?.closeFriendsTapped(at: indexPath)
    }
}

MyTableViewController.swift

class MyTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, OptionButtonsDelegate {...

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

func closeFriendsTapped(at index: IndexPath) {
     print("button tapped at index:\(index)")
}

คุณสามารถช่วยฉันฉันได้รับข้อผิดพลาดที่บรรทัดนี้: class MyTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, OptionButtonsDelegate // ข้อผิดพลาด: การปฏิบัติตามข้อกำหนดซ้ำซ้อนของ 'MyTableViewController' ถึงโปรโตคอล 'UITableViewDataSource'
Ulug'bek Ro'zimboyev

ดูเหมือนว่าคุณกำลังพยายามที่จะปฏิบัติตาม UITableViewDataSource หลายครั้ง บางทีคุณอาจมีส่วนขยายที่คุณสอดคล้องกับแหล่งข้อมูลอยู่แล้วไม่สามารถช่วยเพิ่มเติมได้หากไม่มีรหัส
Maciej Chrzastek

1
และวิธีการส่งผ่านข้อมูลเพื่อดำเนินการต่อและไปที่ตัวควบคุมมุมมองอื่นได้อย่างไร
Milad Faridnia

2
ทางออกที่ดีที่สุดและสะอาดที่สุด!
appsunited

31

สิ่งนี้จะช่วย: -

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

ผู้ส่งนี่คืออินสแตนซ์ UIButton ที่กำลังส่งเหตุการณ์ myTableViewเป็นอินสแตนซ์ UITableView ที่คุณติดต่อด้วย

เพิ่งได้รับการอ้างอิงเซลล์ที่ถูกต้องและงานทั้งหมดจะทำ

คุณอาจจำเป็นต้องลบปุ่มออกจาก contentView ของเซลล์ & เพิ่มลงในอินสแตนซ์ UITableViewCell โดยตรงเนื่องจากเป็นมุมมองย่อย

หรือ

คุณสามารถกำหนดรูปแบบการตั้งชื่อแท็กสำหรับ UIButtons ต่างๆใน cell.contentView ใช้แท็กนี้ในภายหลังคุณสามารถทราบข้อมูลแถว & ส่วนตามต้องการ


4
ควรเป็น [[ผู้ส่งผู้ควบคุม] ผู้ดูแล]
pierre23

2
นี่เป็นสิ่งที่ดีสำหรับเซลล์ที่ง่ายมาก อย่างไรก็ตามถ้ามือถือของคุณมีต้นไม้มุมมองลึกคำตอบของมณีก็ดีที่สุด
Sententia

3
ตอนนี้ใน iOS 7 ควรเป็น UITableViewCell * cell = (UITableViewCell *) [[[ผู้ควบคุมผู้ส่ง] superview] superview] superview]; ขอบคุณ.
Rajan Maharjan

ตรวจสอบคำถามนี้เพื่อนstackoverflow.com/questions/31649220/…
Nischal Hada

22

รหัสต่อไปนี้อาจช่วยคุณได้

ผมได้เอาUITableViewกับชั้นเซลล์ต้นแบบที่กำหนดเองชื่อภายในUITableViewCellUIViewController

ดังนั้นผมจึงมีViewController.h, ViewController.mและTableViewCell.h,TableViewCell.m

นี่คือรหัสสำหรับที่:

ViewController.h

@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>

@property (strong, nonatomic) IBOutlet UITableView *tblView;

@end

ViewController.m

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return (YourNumberOfRows);
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *cellIdentifier = @"cell";

    __weak TableViewCell *cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    if (indexPath.row==0) {
        [cell setDidTapButtonBlock:^(id sender)
         {
             // Your code here

         }];
    }    
    return cell;
}

คลาสเซลล์ที่กำหนดเอง:

TableViewCell.h

@interface TableViewCell : UITableViewCell

@property (copy, nonatomic) void (^didTapButtonBlock)(id sender);

@property (strong, nonatomic) IBOutlet UILabel *lblTitle;
@property (strong, nonatomic) IBOutlet UIButton *btnAction;

- (void)setDidTapButtonBlock:(void (^)(id sender))didTapButtonBlock;

@end

และ

UITableViewCell.m

@implementation TableViewCell

- (void)awakeFromNib {
    // Initialization code
    [self.btnAction addTarget:self action:@selector(didTapButton:) forControlEvents:UIControlEventTouchUpInside];

}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}
- (void)didTapButton:(id)sender {
    if (self.didTapButtonBlock)
    {
        self.didTapButtonBlock(sender);
    }
}

หมายเหตุ : ที่นี่ฉันได้ทั้งหมดUIControlsใช้ Storyboard

หวังว่าจะช่วยคุณได้ ... !!!


วิธีที่ดีที่สุด
Daniel Raouf

15

เหตุผลที่ฉันชอบเทคนิคด้านล่างเพราะมันยังช่วยให้ฉันระบุส่วนของตาราง

เพิ่มปุ่มในเซลล์ cellForRowAtIndexPath:

 UIButton *selectTaskBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        [selectTaskBtn setFrame:CGRectMake(15, 5, 30, 30.0)];
        [selectTaskBtn setTag:indexPath.section]; //Not required but may find useful if you need only section or row (indexpath.row) as suggested by MR.Tarun 
    [selectTaskBtn addTarget:self action:@selector(addTask:)   forControlEvents:UIControlEventTouchDown];
[cell addsubview: selectTaskBtn];

กิจกรรม addTask:

-(void)addTask:(UIButton*)btn
{
    CGPoint buttonPosition = [btn convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
    if (indexPath != nil)
    {
     int currentIndex = indexPath.row;
     int tableSection = indexPath.section;
    }
}

หวังความช่วยเหลือนี้


ตรวจสอบคำถามนี้เพื่อนstackoverflow.com/questions/31649220/…
Nischal Hada

12

ใช้การปิด Swift:

class TheCell: UITableViewCell {

    var tapCallback: (() -> Void)?

    @IBAction func didTap(_ sender: Any) {
        tapCallback?()
    }
}

extension TheController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: TheCell.identifier, for: indexPath) as! TheCell {
            cell.tapCallback = {
                //do stuff
            }
            return cell
    }
}

7

รหัสของ Tarun ไม่ทำงานบน iOS7 เนื่องจากโครงสร้าง UITableViewCell เปลี่ยนไปและตอนนี้เขาจะได้รับ "UITableViewCellScrollView" แทน

โพสต์นี้การรับ UITableViewCell ด้วย superview ใน iOS 7มีทางออกที่ดีในการสร้างลูปเพื่อค้นหามุมมองพาเรนต์ที่ถูกต้องโดยไม่คำนึงถึงการเปลี่ยนแปลงในอนาคตของโครงสร้าง มันเดือดลงมาเพื่อสร้างวง:

    UIView *superView = [sender superview];
    UIView *foundSuperView = nil;

    while (nil != superView && nil == foundSuperView) {
        if ([superView isKindOfClass:[UITableViewCell class]]) {
            foundSuperView = superView;
        } else {
            superView = superView.superview;
        }
    }

ลิงค์นี้มีรหัสสำหรับโซลูชันที่สามารถนำกลับมาใช้ใหม่ได้ แต่ควรใช้งานได้


6

Swift 2.2

คุณต้องเพิ่มเป้าหมายสำหรับปุ่มนั้น

myButton.addTarget(self, action: #selector(ClassName.FunctionName(_:), forControlEvents: .TouchUpInside)

FunctionName: connected // ตัวอย่างเช่น

และแน่นอนคุณต้องตั้งค่าแท็กของปุ่มนั้นตั้งแต่คุณใช้งาน

myButton.tag = indexPath.row

คุณสามารถทำได้โดย subclassing UITableViewCell ใช้มันในเครื่องมือสร้างส่วนต่อประสานกดปุ่มบนเซลล์นั้นเชื่อมต่อผ่านเต้าเสียบและไปที่นั่น

วิธีรับแท็กในฟังก์ชั่นที่เชื่อมต่อ:

func connected(sender: UIButton) {
    let buttonTag = sender.tag
    // Do any additional setup
}

6

Swift 3 พร้อมการปิด

ทางออกที่ดีคือการใช้การปิดใน UITableViewCell ที่กำหนดเองเพื่อโทรกลับไปยัง viewController สำหรับการดำเนินการ

ในเซลล์:

final class YourCustomCell: UITableViewCell {

    var callbackClosure: (() -> Void)?

    // Configure the cell here
    func configure(object: Object, callbackClosure: (() -> Void)?) {
       self.callbackClosure = callbackClosure
    }


// MARK: - IBAction
extension YourCustomCell {
    @IBAction fileprivate func actionPressed(_ sender: Any) {
        guard let closure = callbackClosure else { return }
        closure()
    }
}

ในตัวควบคุมมุมมอง: มอบสิทธิ์ Tableview

extension YourViewController: UITableViewDelegate {

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        guard let cell: YourCustomCell = cell as? YourCustomCell else { return }
        cell.configure(object: object, callbackClosure: { [weak self] in
            self?.buttonAction()
        })
     }
 }

fileprivate extension YourViewController {

    func buttonAction() {
        // do your actions here 
    }
}

5

ฉันคิดว่ามันง่ายที่สุดในการซับคลาสปุ่มภายในเซลล์ของคุณ (Swift 3):

class MyCellInfoButton: UIButton {
    var indexPath: IndexPath?
}

ในระดับเซลล์ของคุณ:

class MyCell: UICollectionViewCell {
    @IBOutlet weak var infoButton: MyCellInfoButton!
   ...
}

ในแหล่งข้อมูลของมุมมองตารางหรือมุมมองการรวบรวมเมื่อทำการ dequeue เซลล์ให้ปุ่มพา ธ ดัชนีของมัน:

cell.infoButton.indexPath = indexPath

ดังนั้นคุณสามารถใส่รหัสเหล่านี้ในตัวควบคุมมุมมองตารางของคุณ:

@IBAction func handleTapOnCellInfoButton(_ sender: MyCellInfoButton) {
        print(sender.indexPath!) // Do whatever you want with the index path!
}

และอย่าลืมตั้งค่าคลาสของปุ่มในตัวสร้างส่วนต่อประสานและเชื่อมโยงไปยังhandleTapOnCellInfoButtonฟังก์ชัน!


แก้ไข:

ใช้การฉีดพึ่งพา ในการตั้งค่าการโทรปิด:

class MyCell: UICollectionViewCell {
    var someFunction: (() -> Void)?
    ...
    @IBAction func didTapInfoButton() {
        someFunction?()
    }
}

และแทรกการปิดในวิธี willDisplay ของผู้รับมอบสิทธิ์ในการดูคอลเลกชัน:

 func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    (cell as? MyCell)?.someFunction = {
        print(indexPath) // Do something with the indexPath.
    }
}

วิธีการปิดเป็นวิธี Swifty ที่สุดที่ฉันเคยเห็นการทำเช่นนี้ เยี่ยมมาก!
Clifton Labrum

5

มันทำงานให้ฉัน

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     UIButton *Btn_Play = (UIButton *)[cell viewWithTag:101];
     [Btn_Play addTarget:self action:@selector(ButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
}
-(void)ButtonClicked:(UIButton*)sender {
     CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.Tbl_Name];
     NSIndexPath *indexPath = [self.Tbl_Name indexPathForRowAtPoint:buttonPosition];
}

1
// Add action in cell for row at index path -tableView

cell.buttonName.addTarget(self, action: #selector(ViewController.btnAction(_:)), for: .touchUpInside)

// Button Action

  @objc func btnAction(_ sender: AnyObject) {



        var position: CGPoint = sender.convert(.zero, to: self.tableView)


        let indexPath = self.tableView.indexPathForRow(at: position)
        let cell: UITableViewCell = tableView.cellForRow(at: indexPath!)! as
        UITableViewCell




}


1

หากคุณต้องการส่งค่าพารามิเตอร์จากเซลล์ไปยัง UIViewController โดยใช้การปิด

//Your Cell Class
class TheCell: UITableViewCell {

    var callBackBlockWithParam: ((String) -> ()) = {_ in }

//Your Action on button
    @IBAction func didTap(_ sender: Any) {
        callBackBlockWithParam("Your Required Parameter like you can send button as sender or anything just change parameter type. Here I am passing string")
    }
}

//Your Controller
extension TheController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: TheCell.identifier, for: indexPath) as! TheCell {
            cell.callBackBlockWithParam = { (passedParamter) in 

             //you will get string value from cell class
                print(passedParamter)     
      }
            return cell
    }
}

0

@Mani คำตอบดี แต่แท็กของมุมมองภายใน contentView ของเซลล์มักจะใช้เพื่อวัตถุประสงค์อื่น คุณสามารถใช้แท็กของเซลล์แทน (หรือแท็ก contentView ของเซลล์):

1) ในcellForRowAtIndexPath:วิธีการของคุณกำหนดแท็กของเซลล์เป็นดัชนี:

cell.tag = indexPath.row; // or cell.contentView.tag...

2) เพิ่มเป้าหมายและการกระทำสำหรับปุ่มของคุณดังนี้:

[cell.yourbutton addTarget:self action:@selector(yourButtonClicked:) forControlEvents:UIControlEventTouchUpInside];

3) สร้างเมธอดที่ส่งคืนแถวของผู้ส่ง (ขอบคุณ @Stenio Ferreira):

- (NSInteger)rowOfSender:(id)sender
{
    UIView *superView = sender.superview;
    while (superView) {
        if ([superView isKindOfClass:[UITableViewCell class]])
            break;
        else
            superView = superView.superview;
    }

    return superView.tag;
}

4) การกระทำของรหัสตามดัชนี:

-(void)yourButtonClicked:(UIButton*)sender
{
     NSInteger index = [self rowOfSender:sender];
     // Your code here
}

0

CustomTableCell.h เป็น UITableViewCell:

@property (weak, nonatomic) IBOutlet UIButton *action1Button;
@property (weak, nonatomic) IBOutlet UIButton *action2Button;

MyVC.m หลังจากนำเข้า:

@interface MYTapGestureRecognizer : UITapGestureRecognizer
@property (nonatomic) NSInteger dataint;
@end

ภายใน "cellForRowAtIndexPath" ใน MyVC.m:

//CustomTableCell 
CustomTableCell *cell = (CustomTableCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

//Set title buttons
[cell.action1Button setTitle:[NSString stringWithString:NSLocalizedString(@"action1", nil)] forState:UIControlStateNormal];
[cell.action2Button setTitle:[NSString stringWithString:NSLocalizedString(@"action2", nil)] forState:UIControlStateNormal];

//Set visibility buttons
[cell.action1Button setHidden:FALSE];
[cell.action2Button setHidden:FALSE];

//Do 1 action
[cell.action1Button addTarget:self action:@selector(do1Action :) forControlEvents:UIControlEventTouchUpInside];

//Do 2 action
MYTapGestureRecognizer *action2Tap = [[MYTapGestureRecognizer alloc] initWithTarget:self action:@selector(do2Action :)];
cancelTap.numberOfTapsRequired = 1;
cancelTap.dataint = indexPath.row;
[cell.action2Button setUserInteractionEnabled:YES];
[cell.action2Button addGestureRecognizer:action2Tap];

MyVC.m:

-(void)do1Action :(id)sender{
//do some action that is not necessary fr data
}

-(void)do2Action :(UITapGestureRecognizer *)tapRecognizer{
MYTapGestureRecognizer *tap = (MYTapGestureRecognizer *)tapRecognizer;
numberTag = tap.dataint;
FriendRequest *fr = [_list objectAtIndex:numberTag];

//connect with a WS o do some action with fr data

//actualize list in tableView
 [self.myTableView reloadData];
}

-1
cell.show.tag=indexPath.row;
     [cell.show addTarget:self action:@selector(showdata:) forControlEvents:UIControlEventTouchUpInside];

-(IBAction)showdata:(id)sender
{
    UIButton *button = (UIButton *)sender;

    UIStoryboard *storyBoard;
    storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    SecondViewController *detailView = [storyBoard instantiateViewControllerWithIdentifier:@"SecondViewController"];

    detailView.string=[NSString stringWithFormat:@"%@",[_array objectAtIndex:button.tag]];

    [self presentViewController:detailView animated:YES completion:nil];

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.