বোতাম টিপতে UITableView কক্ষের সারি পাওয়া


84

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

উত্তর:


278

পরিবর্তে আপনার এই পদ্ধতিটি ব্যবহার করা উচিত:

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];

সুইফ্ট সংস্করণ:

let buttonPosition = sender.convert(CGPoint(), to:tableView)
let indexPath = tableView.indexPathForRow(at:buttonPosition)

এটি আপনাকে indexPathচাপ দেওয়া বোতামটির অবস্থানের ভিত্তিতে দেবে । তারপরে আপনার cellForRowAtIndexPathসেলটির প্রয়োজন হলে বা indexPath.rowসারি নম্বর প্রয়োজন হলে আপনি কেবল কল করবেন ।

যদি আপনি অদ্ভুত হন তবে টেবিলের ভিউতে point পয়েন্টটির সন্ধান না পাওয়া if (indexPath) ...সেক্ষেত্রে আপনি এটি ব্যবহার করার আগে পরীক্ষা করতে পারেন indexPath

অ্যাপল দেখার কাঠামো পরিবর্তন করার সিদ্ধান্ত নিলে অন্যান্য সমস্ত উত্তর ভেঙে যাওয়ার সম্ভাবনা রয়েছে।


8
এটি, এক মিলিয়ন বার। কেউ অন্যের কাজ, কিন্তু এই নিখুঁত ছিল এবং এ পর্যন্ত সবচেয়ে সহজ সমাধান দ্বারা
Ine

4
এই উত্তরটি কার্যকর কারণ এটি সঠিক সমাধান। অন্যরা কর্মক্ষেত্র ounds ধন্যবাদ!
ব্রুনো ফিলিপ

4
যদি আপনি না আছে self.tableview , এই পৃষ্ঠাতে আমার উত্তর দেখুন।
অশোক

4
এটি আমার জন্য কাজ করেছিল যখন আমি বুঝতে পারি আমার প্রেরকটি ভুল ক্লাস। এটি ইউআইবাটন চেপে স্থির করা, এবং এখন এটি কাজ করছে!
লর্ডবি 8

4
শুধু মনে রাখবেন পদ্ধতিটি convertPoint:*to*Viewনয় convertPoint:*from*View। আমি এক্সকোড স্বতঃপূরণ ব্যবহার করেছি এবং ভিউ পদ্ধতিতে শেষ হয়েছি কেবলমাত্র কাজ না করার জন্য ...
t গিলানী

40

সম্পাদনা: এই উত্তরটি পুরানো। পরিবর্তে এই পদ্ধতিটি ব্যবহার করুন


এটা চেষ্টা কর:

-(void)button1Tapped:(id)sender
{
    UIButton *senderButton = (UIButton *)sender;
    UITableViewCell *buttonCell = (UITableViewCell *)[senderButton superview];
    UITableView* table = (UITableView *)[buttonCell superview];
    NSIndexPath* pathOfTheCell = [table indexPathForCell:buttonCell];
    NSInteger rowOfTheCell = [pathOfTheCell row];
    NSLog(@"rowofthecell %d", rowOfTheCell);
}

সম্পাদনা করুন: আপনি যদি কনটেন্ট ভিউ ব্যবহার করছেন তবে পরিবর্তে এটি বোতামের জন্য ব্যবহার করুন:

UITableViewCell *buttonCell = (UITableViewCell *)senderButton.superview.superview;

4
আপনার নিজের ঘরেই সাবউভিউ যুক্ত করার কথা নয় কেবল তার contentViewসম্পত্তিতে - সুতরাং এই সমাধানটি আসলে কাজ করে না।

4
আমি @ এইচ 2 সি 3 এর সাথে একমত হয়েছি এবং সুপারিভিউগুলি উল্লেখ করে এটি করা উচিত বলে আমিও মনে করি না। : দয়া করে নীচে একটি ভাল উপায় দেখতে stackoverflow.com/a/16270198/308315
iwasrobbed

@ এমনিমলপপ আপনি দয়া করে সঠিক উত্তরটি পরিবর্তন করতে পারেন? একটি ভাল প্রশ্ন / এ আছে!
টমাস বেসনেহার্ড

এটি আইওএস-এ কাজ করে না index. সূচকপথফরআরআউটপয়েন্টটি ব্যবহার করুন: নীচের উত্তর দিন
অস্টিন

আমি ইউআইসিকলিকেশনভিউয়ের সাথে একই সংস্করণটি চেষ্টা করেছি এবং পুরোপুরি কাজ করি। অনেক ধন্যবাদ!
ক্লজ

18

আমি কোনও কাস্টম সাবভিউ রয়েছে এমন সেলটির ইনডেক্সপথ আনার জন্য এই পদ্ধতিটি সুপারিশ করব - ( আইওএস 7 এর সাথে পূর্ববর্তী সমস্ত সংস্করণের সাথে সামঞ্জস্যপূর্ণ )

-(void)button1Tapped:(id)sender {
//- (void)cellSubviewTapped:(UIGestureRecognizer *)gestureRecognizer {
//    UIView *parentCell = gestureRecognizer.view.superview;
    UIView *parentCell = sender.superview;

    while (![parentCell isKindOfClass:[UITableViewCell class]]) {   // iOS 7 onwards the table cell hierachy has changed.
        parentCell = parentCell.superview;
    }

    UIView *parentView = parentCell.superview;

    while (![parentView isKindOfClass:[UITableView class]]) {   // iOS 7 onwards the table cell hierachy has changed.
        parentView = parentView.superview;
    }


    UITableView *tableView = (UITableView *)parentView;
    NSIndexPath *indexPath = [tableView indexPathForCell:(UITableViewCell *)parentCell];

    NSLog(@"indexPath = %@", indexPath);
}

এটিরও দরকার নেই self.tablview

এছাড়াও, মন্তব্য করা কোডটি লক্ষ্য করুন যা আপনি যদি আপনার কাস্টম সাবভিউতে যুক্ত ইউআইজিস্টাররেকগনাইজারের একজন @ সিলেক্টরের মাধ্যমে একই চান তবে দরকারী is


আমার যদি ইউটিভ্যালিভিউ কনট্রোলারটিতে ডেটা পাওয়া দরকার হয় তবে কী হবে?
iosMentalist

উত্তম উত্তর .যদি আপনার একটি অনুসন্ধানবার রয়েছে এবং আপনি জানতে চান যে কোনও টেবিলটি এই মুহুর্তে ব্যবহৃত হয় তবে আপনি এটিও ব্যবহার করতে পারেন।
সুরজ কে টমাস

টেবিল সেল হায়ারার্কি বদলেছে কি? আপনি কি আমাকে বুঝতে সাহায্য করতে পারেন যে কী পরিবর্তন হয়েছে এবং এটি আরও পরিবর্তন হতে পারে?
কমলদীপ সিং ভাটিয়া

3

দুটি উপায় আছে:

  1. @ H2CO3 ঠিক আছে। UIButton এবং UITableViewCell এর মধ্যে আসা ইউআইটিবেবল ভিউসেলকন্টেন্টভিউকে সম্মান জানাতে আপনি @ ব্যবহারকারী523234 এর পরামর্শ মতো যা করতে পারেন তবে একটি ছোট পরিবর্তন দিয়ে can সুতরাং তার কোডটি সংশোধন করতে:

    - (IBAction)button1Tapped:(id)sender
    {
        UIButton *senderButton = (UIButton *)sender;
        UITableViewCellContentView *cellContentView = (UITableViewCellContentView *)senderButton.superview;
        UITableViewCell *tableViewCell = (UITableViewCell *)cellContentView.superview;
        UITableView* tableView = (UITableView *)tableViewCell.superview;
        NSIndexPath* pathOfTheCell = [tableView indexPathForCell:tableViewCell];
        NSInteger rowOfTheCell = pathOfTheCell.row;
        NSLog(@"rowofthecell %d", rowOfTheCell);
    }
    
  2. যদি আপনি একটি কাস্টম ইউআইটিএবলভিউসেল (আপনার নিজস্ব সাবক্লাস) তৈরি করেন তবে আপনি কেবল selfআইবিএक्शनটিতে কল করতে পারেন । আপনি যখন স্টোরটি সেট আপ করবেন তখন আপনি স্টোরিবোর্ড ব্যবহার করে বা প্রোগ্রাম্যাটিকভাবে আপনার বোতামের সাথে আইবিএ ফাংশনটি লিঙ্ক করতে পারেন।

    - (IBAction)button1Tapped:(id)sender
    {
        UITableView* tableView = (UITableView *)self.superview;
        NSIndexPath* pathOfTheCell = [tableView indexPathForCell:self];
        NSInteger rowOfTheCell = pathOfTheCell.row;
        NSLog(@"rowofthecell %d", rowOfTheCell);
    }
    

2

আমি তোমার ঘরের বোতাম জুড়তে অনুমান cellForRowAtIndexPath, তারপর কি আমি করতে চাই একটি কাস্টম বর্গ উপশ্রেণী তৈরি করা UIButton, একটি যোগ ট্যাগ নামক rowNumber, এবং পরিশেষে যোগ যে ডেটা আপনি সেল বাটন যোগ করার সময়।


4
এটি ঠিক আছে, তবে এর জন্য একটি সাবক্লাস তৈরি করার কোনও কারণ নেই UIButtontagএর একটি সাধারণ সম্পত্তি UIView
রব নেপিয়ার

আমি কী ভাবছিলাম তা জানি না এবং ইউআই অনুমান করি যে কোনও কিছু ইউআই নয় , সংশোধনের জন্য ধন্যবাদ!
ডেরেক লি

2

আর একটি সহজ উপায়:

  • টেবিলভিউতে স্পর্শের বিন্দুটি পান

  • তারপরে বিন্দুতে ঘরের সূচকের পথ পান

  • সূচক পথে সারি সূচক রয়েছে contains

কোডটি হ'ল:

- (void)buttonTapped:(id)sender {
    UITapGestureRecognizer *tap = (UITapGestureRecognizer *)sender;
    CGPoint point = [tap locationInView:theTableView];

    NSIndexPath *theIndexPath = [theTableView indexPathForRowAtPoint:point];

    NSInteger theRowIndex = theIndexPath.row;
    // do your stuff here
    // ...
}

1

সুইফট 3

দ্রষ্টব্য: এটি সত্যিকারের উপরের স্বীকৃত উত্তরের মধ্যে থাকা উচিত, এই জাতীয় সম্পাদনাগুলির উপরে মেটা ভ্রূণু বাদ দেওয়া ।

@IBAction func doSomething(_ sender: UIButton) {
   let buttonPosition = sender.convert(CGPoint(), to: tableView)
   let index = tableView.indexPathForRow(at: buttonPosition)
}

দুটি ছোট মন্তব্য:

  1. ডিফল্ট ফাংশনটিতে প্রেরকের প্রকারটি যেকোন হিসাবে রয়েছে, যার রূপান্তর নেই।
  2. সিজিপয়েন্ট জিরো সিজিপিয়েন্ট দ্বারা প্রতিস্থাপিত হতে পারে ()

পুরোপুরি কাজ করে।

0

একটি সমাধান হতে পারে বোতামের তত্ত্বাবধানের ট্যাগটি দেখতে বা ভিউ হায়ারার্কিতে এমনকি উচ্চতর (যদি বোতামটি ঘরের সামগ্রীর দৃশ্যে থাকে) check


0

আমি দ্রুত কোড ভাগ করতে চাই -

extension UITableView
{
    func indexPathForCellContainingView(view1:UIView?)->NSIndexPath?
    {
        var view = view1;
        while view != nil {
            if (view?.isKindOfClass(UITableViewCell) == true)
            {
                return self.indexPathForCell(view as! UITableViewCell)!
            }
            else
            {
                view = view?.superview;
            }
        }
        return nil
    }
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.