ইউআইটিএবলভিউসিলের অভ্যন্তরে বোতামে ক্লিক করুন


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
এটি দ্বিতীয় ধাপে ইন্টারফেস বিল্ডার (আইবি) এর মাধ্যমেও করা যেতে পারে। আপনার বাটন ট্যাগ সেট করা আছে তা নিশ্চিত করুন। আপনি সত্যিই আপনার অ্যাকশন কলিং মিশ্রিত করতে চান না। হয় এটি আইবির মাধ্যমে করুন বা আপনার কোডে এটি স্পষ্টভাবে করুন।
সেন্তেটিয়া

@ মানি এটি এমভিসি ভঙ্গ করে না - ক্রিয়াটি টেবিলভিউতে রয়েছে সেলটি নয়।
ডেভকম

@ ডেভকম আপনি যদি সেল হিসাবে বোতামের লক্ষ্য সেট করেন (আইবিয়ের মাধ্যমে), এটি টেবিলভিউ থেকে কীভাবে ট্রিগার হবে? অথবা তাদের কোনও উপায়ে কি টেবিলভিউতে বোতামের লক্ষ্যটি সংযুক্ত করার কোনও উপায় যা ঘরের এক্সবিতে রাখা হয়েছে?
মণি

24
আপনি সারি সন্নিবেশ করা এবং মুছতে শুরু করলে এই সমাধান সমস্যার মধ্যে চলে। সারিগুলি স্থানান্তরিত হওয়ার সময় ট্যাগটি আপডেট হয় না। পরিবর্তে সারি রেফারেন্স রাখা। কোনও অনন্য অবজেক্ট আইডির রেফারেন্স রাখা ভাল।
ভিনসেন্ট চেওং

1
আপনি যখনই ভিউজের ট্যাগ বৈশিষ্ট্যগুলিতে নিজেকে নির্ধারিত মান খুঁজে পান তখন আপনার খুব খারাপ কোড গন্ধ থাকে যা আপনাকে পরে কাটাতে পারে। আপনার লক্ষ্য অর্জনের জন্য আরও ভাল উপায় সন্ধান করুন, আপনি খুঁজে পাওয়া প্রথম এসও পোস্ট নয়।
টাইগারকডিং

148

প্রতিনিধিরা যাওয়ার উপায়।

অন্যান্য উত্তরগুলির সাথে দেখা হিসাবে দেখা ভিউগুলি পুরানো হতে পারে। কে জানে আগামীকাল আর একটি মোড়ক থাকতে পারে এবং ব্যবহারের প্রয়োজন হতে পারে cell superview]superview]superview]superview]। এবং আপনি যদি ট্যাগ ব্যবহার করেন তবে আপনি সেল শনাক্ত করার জন্য অন্য শর্তগুলির সাথে n নম্বর দিয়ে শেষ করবেন। যে সমস্ত সেট আপ প্রতিনিধিদের এড়াতে। (এটি করে আপনি পুনরায় ব্যবহারযোগ্য সেল ক্লাস তৈরি করবেন You আপনি বেস শ্রেণীর মতো একই সেল শ্রেণিটি ব্যবহার করতে পারেন এবং আপনাকে যা করতে হবে তা ডেলিগেট পদ্ধতিগুলি বাস্তবায়ন করতে হবে))

প্রথমে আমাদের একটি ইন্টারফেস (প্রোটোকল) প্রয়োজন যা সেল দ্বারা ব্যবহার করতে হবে (ডেলিগেট) বোতাম ক্লিকগুলি। ( আপনি প্রোটোকলের জন্য একটি পৃথক .h ফাইল তৈরি করতে পারেন এবং উভয় টেবিল ভিউ নিয়ন্ত্রক এবং কাস্টম সেল শ্রেণীর মধ্যে অন্তর্ভুক্ত করতে পারেন বা কেবল এটি কাস্টম সেল শ্রেণিতে যুক্ত করুন যা যাইহোক টেবিল ভিউ নিয়ন্ত্রকের অন্তর্ভুক্ত হবে )

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

এই প্রোটোকলটি কাস্টম সেল এবং টেবিল ভিউ কন্ট্রোলারে অন্তর্ভুক্ত করুন। এবং নিশ্চিত করুন যে টেবিল ভিউ কন্ট্রোলার এই প্রোটোকলে নিশ্চিত হয়েছেন।

কাস্টম ঘরে দুটি বৈশিষ্ট্য তৈরি করুন:

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

ইন UIButtonIBAction প্রতিনিধি ক্লিক: ( একই কাস্টম সেল ক্লাসে কোন পদক্ষেপ যা দৃশ্য নিয়ামক ফিরে অর্পণ করা প্রয়োজন জন্য কাজ করা যেতে পারে )

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

cellForRowAtIndexPathকক্ষটি চিহ্নিত করার পরে সারণী দর্শন নিয়ন্ত্রকটিতে উপরের বৈশিষ্ট্যগুলি সেট করুন।

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
আপনি প্রতিনিধিটিকে কেন ঘরের একটি শক্তিশালী সম্পত্তি হিসাবে পরিণত করেছেন? এটি আপনাকে ধরে রাখার চক্র দেবে, যদি না আপনি জানেন যে নিয়ামকটি কেবল দুর্বলভাবে কক্ষকে ধরে রাখে।
জুলিয়ানসাইমস

সেল মুছে ফেলার পরে আপডেট হওয়া _सेल ইন্ডেক্স সূত্র সম্পর্কে কী?
স্কর্নোস

2
আমি আমার এক বন্ধুর কাছ থেকে শুনেছিলাম প্রতিটি কক্ষে প্রতিনিধি ব্যবহারের ফলে মেমোরি খরচ হয়, তাই ট্যাগ ব্যবহার করুন। এটা কি সত্য?
বিস্তার

2
এই প্রশ্নের শহরবাসী পরীক্ষা stackoverflow.com/questions/31649220/...
Nischal হাদা

@ থি_উব একটি ট্যাগ সেট করা এবং একটি একক রেফারেন্স সংরক্ষণ করার মধ্যে অনেক কিছুই থাকতে পারে না। সম্ভবত একটি ট্যাগ আরও মেমরি গ্রহণ করবে।
ইয়ান ওয়ারবার্টন

66

ট্যাগের সাথে খেলার পরিবর্তে, আমি ভিন্ন পদ্ধতির গ্রহণ করেছি। আমার ইউআইটিএবলভিউসেল (অপশনবটসনসেল) এর সাবক্লাসের জন্য প্রতিনিধি বানিয়ে একটি সূচিপথ ভেরি যোগ করেছে। স্টোরিবোর্ডে আমার বোতামটি থেকে আমি @ আইবিএটিশনটি অপশনবটোনসিলের সাথে সংযুক্ত করেছি এবং সেখানে আমি আগ্রহী যে কোনও ব্যক্তিকে ডান সূচকপথ দিয়ে প্রতিনিধি পদ্ধতি প্রেরণ করি। সূচকের পথে সেলের জন্য আমি বর্তমান সূচকপথ সেট করেছি এবং এটি কাজ করে :)

কোডটি নিজের পক্ষে বলি:

সুইফট 3 এক্সকোড 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 // ত্রুটি: 'মাই টেবিলভিউ কনট্রোলার' এর প্রোটোকল 'ইউআইটিবেলভিউ ডেটাসোর্স' তে
রিডানড্যান্ট কনফরমেশন

দেখে মনে হচ্ছে আপনি একাধিকবার ইউআইটিএবলভিউ ডেটাসোর্সকে মেনে চলার চেষ্টা করছেন। সম্ভবত আপনি কোনও এক্সটেনশান পেয়েছেন যেখানে আপনি ইতিমধ্যে ডেটা উত্সের সাথে
সঙ্গতি রেখেছেন?

1
এবং সেগমেন্ট সম্পাদন করতে এবং অন্য ভিউ নিয়ন্ত্রকের কাছে কীভাবে ডেটা পাস করবেন?
মিলাদ ফরিদনিয়া

2
সবচেয়ে ভাল এবং পরিষ্কার সমাধান!
অ্যাপ্লিকেশন

31

এটি সাহায্য করবে: -

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

এখানে প্রেরক হ'ল ইউআইবাটন হ'ল ইভেন্টটি পাঠাচ্ছে। মাই টেবিলভিউ হল সেই ইউআইটিএবলভিউ দৃষ্টান্ত যা আপনি ব্যবহার করছেন।

কেবলমাত্র সেল রেফারেন্সটি সঠিকভাবে পান এবং সমস্ত কাজ শেষ হয়ে যায়।

আপনার ঘরের কনটেন্টভিউ থেকে বোতামগুলি সরাতে হবে এবং এটিকে সংক্ষিপ্তসার হিসাবে সরাসরি ইউআইটিএবলভিউসেল উদাহরণে যুক্ত করতে হবে।

অথবা

আপনি সেল কন্টেন্টভিউতে বিভিন্ন ইউআইবাটনগুলির জন্য ট্যাগ নামকরণের পরিকল্পনা তৈরি করতে পারেন। এই ট্যাগটি ব্যবহার করে, পরে আপনি প্রয়োজন হিসাবে সারি এবং বিভাগের তথ্য জানতে পারবেন।


4
এটি [[প্রেরক তদারকি] তত্ত্বাবধানে] হওয়া উচিত;
পিয়েরে

2
এটি খুব সাধারণ কোষের জন্য ভাল। তবে, আপনার ঘরে যদি দৃশ্যের গভীর গাছ থাকে তবে মণির উত্তরটি সেরা।
সেনেটেটিয়া

3
এখন আইওএস 7-এ এটি ইউআইটিএবল ভিউসেল * সেল = (ইউআইটিএবলভিউসেল *) হওয়া উচিত [[[প্রেরক তত্ত্বাবধানে] তত্ত্বাবধানে] সুপারভাইভ]]; ধন্যবাদ.
রাজন মহর্জন

এই প্রশ্নের শহরবাসী পরীক্ষা stackoverflow.com/questions/31649220/...
Nischal হাদা

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স্টোরিবোর্ড ব্যবহার করে সমস্ত নিয়েছি ।

যে আপনি সাহায্য করতে পারেন আশা করি...!!!


সর্বকালের সেরা উপায়
ড্যানিয়েল রাউফ

15

কারণটি আমি নীচে কৌশল পছন্দ করি কারণ এটি আমাকে টেবিলের বিভাগটি সনাক্ত করতেও সহায়তা করে।

সেল সেলফর্টঅ্যান্ডেক্সেক্সপথে বোতাম যুক্ত করুন:

 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];

ইভেন্ট অ্যাডটাস্ক:

-(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 হাদা

12

সুইফ্ট ক্লোজারগুলি ব্যবহার করুন:

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

তরুনের কোড আইওএস 7 তে কাজ করে না, যেহেতু ইউআইটিএবলভিউসেল কাঠামোটি পরিবর্তিত হয়েছিল এবং এখন তার পরিবর্তে তিনি "ইউআইটিএবলভিউসেলসক্রোলভিউ" পেয়ে যাবেন।

এই পোস্টটি আইওএস 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

সুইফট 2.2

আপনাকে এই বোতামটির জন্য লক্ষ্য যুক্ত করতে হবে।

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

ফাংশননাম: উদাহরণস্বরূপ // সংযুক্ত //

এবং অবশ্যই আপনাকে সেই বোতামটির ট্যাগ সেট করতে হবে যেহেতু আপনি এটি ব্যবহার করছেন।

myButton.tag = indexPath.row

আপনি ইউআইটিএবলভিউসেল সাবক্লাসিং করে এটি অর্জন করতে পারেন। ইন্টারফেস বিল্ডারে এটি ব্যবহার করুন, সেই ঘরে একটি বোতাম ফেলে দিন, এটি আউটলেট মাধ্যমে সংযুক্ত করুন এবং আপনি সেখানে যান।

সংযুক্ত ফাংশনে ট্যাগটি পেতে:

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

6

একটি বন্ধ সহ সুইফট 3

একটি ক্রিয়াকলাপের জন্য ভিউকন্ট্রোলারে কলব্যাক করতে একটি দুর্দান্ত সমাধান হ'ল একটি কাস্টম ইউআইটিএবলভিউসেলতে একটি ক্লোজার ব্যবহার করছে।

কক্ষে:

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()
    }
}

ভিউ কন্ট্রোলারে: টেবিলভিউ প্রতিনিধি

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

আমি আপনার ঘরের অভ্যন্তরে বোতামটি সাবক্লাস করা সবচেয়ে সহজ বলে মনে করি (সুইফট 3):

class MyCellInfoButton: UIButton {
    var indexPath: IndexPath?
}

আপনার সেল শ্রেণিতে:

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

সারণী দর্শন বা সংগ্রহ দর্শনের ডেটা উত্সে, ঘরটি শনাক্ত করার সময়, বোতামটিটিকে তার সূচীর পথটি দিন:

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?()
    }
}

এবং উইলটিতে ক্লোজারটি ইনজেক্ট করুন সংগ্রহের দর্শনের প্রতিনিধিটির পদ্ধতি প্রদর্শন করুন:

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

ক্লোজার অ্যাপ্রোচটি হ'ল এটি করতে আমি সবচেয়ে স্বাচ্ছন্দ্যময় উপায়। চমৎকার কাজ!
ক্লিফটন ল্যাব্রাম

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

আপনি যদি ক্লোজর ব্যবহার করে সেল থেকে ইউআইভিউউকন্ট্রোলারে প্যারামিটার মানটি পাস করতে চান

//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

@ মানির উত্তরটি ভাল, তবে ঘরের কনটেন্টভিউয়ের ভিতরে ভিউগুলির ট্যাগগুলি প্রায়শই অন্যান্য উদ্দেশ্যে ব্যবহৃত হয়। আপনি পরিবর্তে ঘরের ট্যাগ ব্যবহার করতে পারেন (বা সেলের সামগ্রী ভিউ ট্যাগ):

1) আপনার cellForRowAtIndexPath:পদ্ধতিতে, সেলটির ট্যাগটিকে সূচক হিসাবে নির্ধারণ করুন:

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

2) নীচে হিসাবে আপনার বোতামের জন্য লক্ষ্য এবং ক্রিয়া যুক্ত করুন:

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

3) এমন পদ্ধতি তৈরি করুন যা প্রেরকের সারিটি ফেরত পাঠায় (ধন্যবাদ @ স্টেনিও ফেরেরিরা):

- (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

কাস্টম টেবিলসেল.ই একটি ইউআইটিএবলভিউসেল:

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

আমদানির পরে MyVC.m:

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

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.