ইউআইডিএলভিউয়ের জন্য ডিডিলিটআরএটিএন্ডেক্সপথ বা প্রস্তুতিফেরত পদ্ধতি পদ্ধতি ব্যবহার করবেন?


101

আমি স্টোরিবোর্ডগুলি ব্যবহার করছি এবং আমার একটি ইউআইটিএলভিউ রয়েছে। আমার একটি সিগু সেটআপ রয়েছে যা আমার টেবিল থেকে বিশদ ভিসিতে ঠেলা দেয়। তবে এটি পরিচালনা করতে আমার কোন পদ্ধতিটি ব্যবহার করা উচিত? আমি বিশদ ভিউতে কয়েকটা বস্তু পাস করতে হবে। তবে আমি কি ব্যবহার করব didSelectRowAtIndexনাকি -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender?

উত্তর:


199

আপনি যদি ব্যবহার করেন prepareForSegue:sender:তবে আপনার যদি পরে টেবিলের দৃশ্যের বাইরে কিছু নিয়ন্ত্রণ থেকে সেগটিকে ট্রিগার করার সিদ্ধান্ত নেওয়া হয় তবে আপনার তেমন কোনও পরিবর্তন করার দরকার নেই।

prepareForSegue:sender:বার্তা বর্তমান দৃশ্য নিয়ামক পাঠানো হয়, যাতে আমি ভালো কিছু করার সুপারিশ করছি:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Assume self.view is the table view
    NSIndexPath *path = [self.tableView indexPathForSelectedRow];
    DetailObject *detail = [self detailForIndexPath:path];
    [segue.destinationViewController setDetail:detail];
}

সুইফটে:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let path = self.tableView.indexPathForSelectedRow()!
    segue.destinationViewController.detail = self.detailForIndexPath(path)
}

1
ঠিক আছে, আপনি কীভাবে সূচকপথের উপর ভিত্তি করে কোনও বস্তু পাস করার মাধ্যমে এটি বাস্তবায়ন করবেন তার একটি উদাহরণ দিতে পারেন।
জন

4
self.viewশুধু senderএখানে থাকা উচিত নয় ? আমি এমনকি [self.view indexPathForSelectedRow][sender indexPathForSelectedRow];
কাজেও

আপনি কীভাবে সুইফটে এটি করবেন?
ব্যবহারকারী

@robmayoff সুইফটের জন্য এটি আপডেট করার জন্য ধন্যবাদ। সাম্প্রতিক ভাষার পরিবর্তনগুলি প্রতিবিম্বিত করতে আমি কিছুটা হালকা সম্পাদনা করেছি। আশা করি এটি আরও কিছুকে সহায়তা করে
জ্যাক শাপিরো

এটি অদ্ভুত যেটিতে ডাকা tableView.indexPathForSelectedRow()হয় যখন সঠিক মান থাকে prepareFroSegue...: tableView(_:didSelectrowAtIndexPath:)পরে বলা হয় না।
নিকোলাস মিয়ারি

5

আমি এটি করেছি এবং এটি কাজ করে

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    NSLog(@"Row Selected = %i",indexPath.row);

    [self performSegueWithIdentifier:@"testID" sender:self.view];    
}

11
এটা বোঝা যায় না। আপনার হয় সিগু বা টেবিল ভিউ প্রতিনিধি ব্যবহার করা উচিত। কেবলমাত্র সেল থেকে একটি সিগ তৈরি করুন এবং এটি কোড না লিখে স্বয়ংক্রিয়ভাবে আপনি একই কাজটি সম্পাদন করবেন।
ইয়ারিভ নিসিম

3
আপনি কীভাবে সেলেক্টরউ ছাড়াই কোনও সেলকে একটি সেলকে অর্পণ করবেন?
মোরক্রোম

3

প্রেরক যখন ইউআইটিএবলভিউসেল হয়, আপনি ইউআইটিএবলভিউকে ঘরের সূচিপথটি জিজ্ঞাসা করতে চাইতে পারেন।

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let cell = sender as? UITableViewCell {
            let indexPath = self.tableView.indexPathForCell(cell)!
            assert(segue.destinationViewController.isKindOfClass(DetailViewController))
            let detailViewController = segue.destinationViewController as! DetailViewController
            detailViewController.item = self.items[indexPath.row] // like this
        }
    }

1

যদি আপনার টেবিলভিউ সম্পত্তিটি অন্য শ্রেণিতে থাকে এবং আপনার কেবল একটি বিভাগ থাকে , তবে আপনি ঘরটির tagসারিটি সংরক্ষণ করতে সম্পত্তিটি ব্যবহার করতে পারেন যেমন:

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

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

     cell.tag = indexPath.row;

     return cell;
}

এবং তারপরে senderসারি মান সহ একই ঘর হিসাবে আপনি এটি অ্যাক্সেস করতে পারবেন :

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    MyDestinationViewController *destinationViewController = segue.destinationViewController;
    destinationViewController.myProperty = [tableViewElementsArray objectAtIndex:[sender tag]]; // sender will be your cell 
}

1

self.tableView.indexPathForSelectedRowনির্বাচিত ঘর প্রদান করে তবে প্রেরণকারী সেলটি নয়, যেমন প্রেরক সেলটি নির্বাচিত হয়নি (আনুষঙ্গিক ক্রিয়া), বা একাধিক নির্বাচন ক্ষেত্রে। সেরা উপায়টি সেগু প্রেরকের জন্য সূচকপথটি পাওয়া:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    __auto_type itemViewController = (id<ItemViewController>)segue.destinationViewController;
    itemViewController.senderIndexPath = [self.tableView indexPathForCell:sender];
}

সুইফটে:

protocol ItemViewController {
    var senderIndexPath : IndexPath? { get set }
    var selectedIndexPaths : [IndexPath]? { get set }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if  let cell = sender as? UITableViewCell,
        var itemViewController = segue.destination as? ItemViewController {
        itemViewController.senderIndexPath = tableView.indexPath(for: cell)
        itemViewController.selectedIndexPaths = tableView.indexPathsForSelectedRows
    }
}

0

আপনি যদি ব্যবহার করেন তবে prepareForSegue:আপনি কে প্রেরক তা যাচাই করতে পারেন এবং বিভিন্ন কোড কার্যকর করতে পারেন

সুইফ্ট হিসাবে উদাহরণস্বরূপ

override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?)
{
   var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell)

   if senderIsTableviewCell
   {
       //do something
   }
}

2
কেবলমাত্র: যদি টেবিলভিউসেল = প্রেরককে যাক? UITableViewCell {// কিছু} । যদি প্রেরককে কোনও ইউআইটিএবলভিউসেলকে কাস্ট করা না যায় তবে "কিছু করুন" কার্যকর হবে না।
mbeaty
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.