কোন ইউআইটি বাটন কোন ইউআইটিবেল ভিউতে চাপছিল তা নির্ধারণ করা হচ্ছে


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

সবচেয়ে গুরুত্বপূর্ণ যেটি গুরুত্বপূর্ণ তা হ'ল আমি সেলটি তৈরিতে ট্যাগটি সেট করতে পারছি না কারণ তার পরিবর্তে ঘরের সজ্জা শনাক্ত করা যেতে পারে। খুব নোংরা লাগে। আরও ভাল উপায় থাকতে হবে।


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

উত্তর:


400

অ্যাপলের আনুষঙ্গিক নমুনায় নিম্নলিখিত পদ্ধতিটি ব্যবহৃত হয়:

[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
তবে আপনি নিজেই ইউআইটিবেলভিউসেলকে ইউআইবাটন যুক্ত করেন যাতে ঘর তৈরি করার সময় আপনার যা করা উচিত তার সাথে আপনার অবশ্যই সামঞ্জস্য থাকতে হবে। যদিও এই পদ্ধতির সত্যই মার্জিত দেখাচ্ছে না তবে আমাকে স্বীকার করতে হবে
ভ্লাদিমির

1
প্রথম সমাধানের জন্য, আপনাকে [[বোতাম তত্ত্বাবধানে] তত্ত্বাবধানে] গ্রহণ করতে হবে যেহেতু প্রথম তত্ত্বাবধানের কলটি আপনাকে কনটেন্টভিউ দেবে এবং শেষ অবধি দ্বিতীয়টি আপনাকে ইউআইটিবেলভিউসেল দেবে। দ্বিতীয় সলিউশনটি ভালভাবে কাজ করে না যদি আপনি কক্ষগুলি যোগ / অপসারণ করছেন তবে এটি সারি সূচকটিকে অকার্যকর করবে। অতএব, আমি প্রথম সমাধান হিসাবে রূপরেখা হিসাবে নিয়েছি এবং এটি নিখুঁতভাবে কাজ করেছে।
21:51

3
এটি বোতামের মালিকানাধীন কক্ষটি বিশ্বস্তভাবে বেছে নেবে: ইউআইভিউ ভিউ = বোতাম; যখন (! [চিত্রটি দেখুনকিন্ডঅফক্লাস দেখুন: [ইউআইটিএবলভিউসেল ক্লাস]]) {দর্শন = [তত্ত্বাবধান দেখুন]}
জ্যাকব

1
ব্যবহার করার সময় একটি ফাঁদ রয়েছে: [বোতাম অ্যাডটারাজেট: স্ব-ক্রিয়া: @ নির্বাচনকারী (চেকবটনের ট্যাপড :) forControlEvents: UIControlEventTouchUpInside]; কারণ AddTarget: ক্রিয়া: forControlEvents: আপনি টেবিল স্ক্রোল করার সময় একাধিক সদৃশ লক্ষ্য এবং ক্রিয়া যুক্ত করবেন, এটি পূর্ববর্তী লক্ষ্যগুলি এবং ক্রিয়াগুলি সরাবে না, সুতরাং পদ্ধতিটি চেকবটনটিপড: আপনি বোতামটি ক্লিক করলে অনেকবার ডাকা হবে। লক্ষ্য এবং
ক্রিয়াগুলি

48

আমি সেলটির সূচিপথের নিখুঁতভাবে কাজ করার জন্য একটি রেফারেন্স পাওয়ার জন্য তদারকির তত্ত্বাবধানটি ব্যবহার করার পদ্ধতিটি পেয়েছি। টিপ লিঙ্ক পাঠ্যের জন্য আইফোনদেভবুক ডটকম (ম্যাকস্মিথ) ধন্যবাদ

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

}

কোকোয়ান্ট, আপনার কোড টুকরা আমাকে এই সমস্যাটিতে আমার নিজস্ব পরিবর্তনের জন্য সঠিক দিক নির্দেশ করেছে। ধন্যবাদ! অন্য কারও যদি এটির প্রয়োজন হয় তবে আমার বিশেষ কেসটি হ'ল বোতামটি একটি কাস্টম সেলে ছিল যা পাদলেখের অংশ হিসাবে প্রদর্শিত হচ্ছে। আমি নীচের কোড যুক্ত করব
সফ্টওয়্যারটি বিবর্তিত হয়েছে

যদি আপনি (স্ট্যাকওভারফ্লো রিডার) চেষ্টা করে থাকেন এবং এটি আপনার পক্ষে কার্যকর না হয় তবে আপনার বাস্তবায়নে আপনার ইউআইবাটনটি আসলে আপনার ইউআইটিএবলভিউসিলের নাতনি কিনা তা পরীক্ষা করে দেখুন। আমার বাস্তবায়নে, আমার ইউআইবাটন আমার ইউআইটিএবলভিউসিলের প্রত্যক্ষ সন্তান ছিল, তাই কোকোয়ানটের কোডে আমার একটি "সুপারভিউ" বের করা দরকার ছিল এবং তারপরে এটি কার্যকর হয়েছিল।
জন স্নাইডার

29
এটি খুব, খুব ভুল এবং ওএস এর নতুন সংস্করণে বিভক্ত। আপনার নিজের মালিকানা না থাকা সুপারভিউ গাছগুলি হাঁটবেন না।
কেন্রিক

2
এটি আইওএস under এর অধীনে আমার পক্ষে কাজ করছিল, তবে আইওএস broken এ এটি বিভক্ত It
জন স্নাইডার

3
আইওএস 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)
Jakob W

এটির সাথে কাজ করা সহজ। আরও, এটি সুইফ্ট 3 এ অনুবাদ করা সহজ You আপনি সেরা :)
ফ্রান্সিসকো রোমেরো

এটি নীচে নীচে সুইফটে অনুবাদিত। সবচেয়ে সহজ সমাধান আমি খুঁজে পেতে পারি। ধন্যবাদ ক্রিস!
রাটার হুইজম্যানস

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
আপনি কোথা থেকে 'ইভেন্ট' অবজেক্টটি পেয়েছেন তা এই উদাহরণে পরিষ্কার নয়।
নিক লুদলাম

আমি যে সমাধানটি দিয়েছিলাম সেটাই এটি। ট্যাগগুলি যখন সূচকগুলি পরিবর্তিত হয় তখন সারিগুলি যুক্ত / সরিয়ে দেওয়ার সময় অনাকাঙ্ক্ষিত। এছাড়াও,
54

@ নিকলুদলাম: সম্ভবত পদ্ধতির নামটি কিন্তু buttonPressedAction:নয় buttonPressedAction:forEvent:
কেপিএম

5

কিভাবে মত তথ্য পাঠানো সম্পর্কে NSIndexPathমধ্যে UIButtonব্যবহার রানটাইম ইনজেকশন।

1) আপনার আমদানিতে রানটাইম দরকার

2) স্ট্যাটিক ধ্রুবক যোগ করুন

3) NSIndexPathরানটাইমের সময় আপনার বোতামটি ব্যবহার করে যুক্ত করুন:

(শূন্য) সেটমেটাডেটা: (আইডি) লক্ষ্যবস্তু সহ: (আইডি) newObj

4) বোতাম টিপুন মেটাডেটা ব্যবহার করে:

(ID) মেটাডেটা: (ID) লক্ষ্য

উপভোগ করুন

    #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আমাকে আঙুল দেয় ... "এনএসআইডেক্সপথ এনএসএসস্ট্রিংয়ের একটি সাব টাইপ নয়"


5

সুইফট 4.2 এবং আইওএস 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এর convert(_:to:)এবং UITableViewএর 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
বিভাগগুলি সহ টেবিলগুলির জন্য এই পদ্ধতির সম্পূর্ণরূপে ভাঙা।
ohhorob

না, আপনি বিভাগটিতে ট্যাগটিতে রাখার জন্য কিছু সাধারণ ফাংশন ব্যবহার করতে পারেন।
এসি বার্ক

2
tagএকটি পূর্ণসংখ্যা ট্যাগ ট্যাগগুলিতে সূচী পথগুলি এনকোডিং / ডিকোডিং করা কিছুটা আনাড়ি বলে মনে হচ্ছে।
ohhorob

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

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 এ

আইআইবিতে ইউআইবুটনকে এক্সআইবিতে যুক্ত করুন - অ্যাকশন যুক্ত করুন!

আউটলেট @ প্রপার্টি যুক্ত করুন (ধরে রাখুন, নন্যাটমিক)

আইবিতে ক্রিয়াকলাপ + ড্র্যাগ করবেন না (নীচের কোডে করা হয়েছে)

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

ভিউফোর্ডহাইডারইনসেকশনটি দেখুন (সেলফোর্ডের জন্যও কাজ করা উচিত .... ইত্যাদি যদি আপনার টেবিলে কেবল ১ টি বিভাগ থাকে)

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

ব্যবহারকারী একটি বিভাগ শিরোনামে ডিলিট বাটন টিপুন এবং এই কলগুলি

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

এই উদাহরণে আমি একটি মুছুন বোতামটি যুক্ত করেছি যাতে এটি নিশ্চিত করার জন্য ইউআইএলআর্টভিউ প্রদর্শন করা উচিত

আমি বিভাগ এবং কীটি ভিসির আইভারে বিভাগ সম্পর্কে তথ্য সংরক্ষণ করে অভিধানে সঞ্চয় করি

- (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; //:)
}

এটি সামান্য বগী কারণ আপনি যদি মুছে ফেলুনরোজঅ্যান্ড ইন্ডেক্সপ্যাথস কল করেন তবে কোনও ঘরের ইনডেক্সপথ পরিবর্তন হতে পারে।
জন গিব

মুছে ফেলুনআউটআইন্ডেক্সপ্যাথগুলি সেলফোরআউএন্টইন্ডেক্সপথকে আবার কল করার কারণ করবে। তারপরে বোতামগুলিতে নতুন সঠিক সূচকপথ থাকবে।
মিমিমানিশস

1

এটি আমার পক্ষে কাজ করে, ধন্যবাদ @ কোকোনাট

আমি সেলটির সূচিপথের নিখুঁতভাবে কাজ করার জন্য একটি রেফারেন্স পাওয়ার জন্য তদারকির তত্ত্বাবধানটি ব্যবহার করার পদ্ধতিটি পেয়েছি। টিপ লিঙ্ক পাঠ্যের জন্য আইফোনদেভবুক ডটকম (ম্যাকস্মিথ) ধন্যবাদ

-(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 জন্য dequeued পরার তাহলে এটি এখনও 1 একটি ট্যাগ থাকবে, না 3.
মূক্ত

অনুমান করুন আপনি দ্বিতীয় মন্তব্য সম্পর্কে ঠিক বলেছেন। আমার খারাপ আমি মনে করি আপনার সেরা সমাধানটি ইউআইবাটন সাবক্লাস করা, অন্য একটি সম্পত্তি বা আপনার নিজের দুটি সংযোজন করা, এবং তারপরে উপযুক্ত ক্ষেত্রে সেট করুন / পান (ট্যাগটির সাথে থাকুন: 1 আপনার
নীর লেভি

0

আমি কিছু অনুপস্থিত করছি? বোতামটি সনাক্ত করতে আপনি কেবল প্রেরককে ব্যবহার করতে পারবেন না। প্রেরক আপনাকে এর মতো তথ্য দেবেন:

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

তারপরে আপনি যদি বোতামটির বৈশিষ্ট্যগুলি পরিবর্তন করতে চান তবে আপনি প্রেরককে যে ব্যাকগ্রাউন্ড চিত্রটি বলছেন তা বলুন:

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

আপনার যদি ট্যাগের দরকার হয় তবে এসিবার্কের পদ্ধতিটি ঠিক আছে।


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

একটি এনএসএমটেবল অ্যারে তৈরি করুন এবং সেই অ্যারে ইউএনটিতে সমস্ত বোতাম রাখুন [অ্যারে অ্যাডবজেক্ট: আপনার বাটন];

বোতাম টিপুন পদ্ধতিতে

-

 (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সেখান থেকে সাবক্লাস করতে হবে এবং বোতাম টিপুন handle


আমি বেশ বুঝতে পারি না কিভাবে। ট্যাগ তৈরির সময় ট্যাগ সম্পত্তি সেট আপ করা হয় - এই ঘরটি একই শনাক্তকারী সহ প্রতিটি সারির জন্য পুনরায় ব্যবহারযোগ্য। এই ট্যাগটি জেনেরিক পুনরায় ব্যবহারযোগ্য কক্ষের নিয়ন্ত্রণের সাথে সুনির্দিষ্ট। জেনেরিক উপায়ে তৈরি করা ঘরগুলিতে বোতামগুলির পার্থক্য করতে আমি এই ট্যাগটি কীভাবে ব্যবহার করতে পারি? আপনি কিছু কোড পোস্ট করতে পারেন?
মূক্ত

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

প্রয়োজনীয় মানটি সংরক্ষণ করতে বোতামটি সাবক্লাস করুন, সম্ভবত একটি প্রোটোকল তৈরি করুন (কন্ট্রোলউইথডেটা বা কিছু)। আপনি টেবিল ভিউ সেলটিতে বোতামটি যুক্ত করার পরে মানটি সেট করুন। আপনার টাচ আপ ইভেন্টে, প্রেরক প্রোটোকলটি মান্য করে এবং ডেটা বের করে কিনা তা দেখুন। আমি সাধারণত টেবিল ভিউ সেলে রেন্ডার করা প্রকৃত অবজেক্টের একটি রেফারেন্স সঞ্চয় করি store


0

সুইফট 2 আপডেট

কোন বোতামটি ট্যাপ করা হয়েছিল তা এখানে কীভাবে পাওয়া যায় + সেই বোতামটি থেকে অন্য ভিউকন্ট্রোলারের কাছে ডেটা প্রেরণ করুন 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")

    }

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

সেই বাটনটি আলতো চাপলে এবং ঘরের পাস করার সময় অন্য ভিসির কাছে ডেটা পাস করার কোড এখানে 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

ক্রিস শোয়ার্টের সমাধান তবে সুইফটে আমার পক্ষে কাজ করেছিল:

@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আইওএস বাস্তবায়ন বিশদ উপর নির্ভর করে। সুতরাং এটি সরাসরি ব্যবহার করা যাবে না।

তবে এটি একটি সাধারণ লুপ ব্যবহার করে অর্জন করা যেতে পারে, কারণ আমরা নিশ্চিত যে প্রশ্নে থাকা ঘরটি কোনও ইউআইটিবেল ভিউতে থাকতে হবে:

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:ইউআইটিএবলভিউ প্রতিনিধিদের পদ্ধতিতে অনুরূপ বিমূর্ততা এবং যুক্তি স্তরে পরিচালনা করা যেতে পারে ।

এর জন্য দুটি পদ্ধতির ব্যবহার করা যেতে পারে:

ক) প্রতিনিধি: কাস্টম সেল একটি 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)
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.