U ইউআইটিএবলভিউসেল-এ নির্বাচিত সারিতে চেকমার্ক


93

আমি আইওএস ডেভলপমেন্ট নবাগত। UITableViewCellএটি নির্বাচন করা হলে আমি একটি চেকমার্ক যুক্ত করতে চাই । অন্য সারিটি নির্বাচন করা হলে চেকমার্কটি সরানো উচিত। আমি এই কিভাবে করব?

উত্তর:


206

[tableview reloadData]; // এটি একটি হাতুড়ি ব্যবহার করবেন না ।

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   *)indexPath
{
    [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
}

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
}

6
আমি যদি কেবলমাত্র চেকমার্কটি চাই এবং একটি নির্বাচনের পরে সারিটি অনির্বাচিত করতে চাই?
gyozo kudor

এটি প্রতিটি বিভাগে একই সূচকটি নির্বাচন করছে @ উজওয়াল মঞ্জুনাথ
বিএলএলকে

4
- (অকার্যকর) পুনরায়লোডডাটা ডক্স অনুসারে তুলনামূলক কম সস্তা হওয়া উচিত। তবুও, এটি আরও শব্দার্থকভাবে আনন্দদায়ক।
ম্যাটডি

কেন আপনি '[টেবিলভিউ রিলোডলোড ডেটা]' ব্যবহার করবেন না? আমি আমার টেবিলভিউতে মাল্টিসিলেট ব্যবহার করতে চাই। আমি আমার টেবিলভিউ সেলটিতে চেকমার্কটি সেট করতে সার্ভার থেকে প্রাপ্ত জিনিসগুলি ব্যবহার করছি। একবার, আমি এটি করি, আমি বিশ্বব্যাপী অ্যারেতে চেক বস্তুগুলি সংরক্ষণ করি। যাইহোক, যখন আমি আমার 'didSelectRowAtIndexPath' পদ্ধতির অভ্যন্তরে তুলনা করতে সেই অ্যারেটি ব্যবহার করি তখন সূচিপত্রটি আমার বৈশ্বিক অ্যারেতে এই বস্তুর সাথে মেলে কিনা see আমি এটি সন্ধান করতে সক্ষম নই। আমি মনে করি এটির [টেবিলভিউ রিলোডলোড ডেটা]। আপনি কি মনে করেন?
রন

4
উপরের উত্তরগুলি কার্যকর হয় না যদি আপনি বিপুল সংখ্যক ডেটার জন্য সেলটি পুনরায় ব্যবহার করেন। স্ক্রোল এ আপনি বারবার চেকমার্ক দেখতে পাবেন। আমার সমাধান stackoverflow.com/questions/7982944/…
দিশন্ত

81

আপনার ইউআইটিএবলভিউ ডেটা উত্স পদ্ধতিতে:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil )
    {
        cell =[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }
    if ([indexPath compare:self.lastIndexPath] == NSOrderedSame) 
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } 
    else 
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    return cell;
}

// UITableView Delegate Method
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.lastIndexPath = indexPath;

    [tableView reloadData];
}

এবং সর্বশেষপরিচয়টি হ'ল একটি property(strong) NSIndexPath* lastIndexPath;


22

আমি দেখতে পেলাম যে ডেটা পুনরায় লোড করা কুৎসিত উপায়ে অনির্বাচিত অ্যানিমেশনটিকে বাধা দেয়।

এই সুইফ্ট বাস্তবায়ন চেকমার্কগুলি পরিষ্কারভাবে যোগ / অপসারণ করে এবং সারিটি অপসারণ করে:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if self.lastSelection != nil {
        self.myTableView.cellForRowAtIndexPath(self.lastSelection)?.accessoryType = .None
    }

    self.myTableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .Checkmark

    self.lastSelection = indexPath

    self.myTableView.deselectRowAtIndexPath(indexPath, animated: true)
}

যেখানে lastSelectionহিসাবে ঘোষণা করা হয়var lastSelection: NSIndexPath!

cellForRowAtIndexPathপ্রয়োজনে অতিরিক্ত কোনও ক্রিয়াকলাপ নেই । ওবজে-সিতে প্রতিলিপি করা কঠিন হওয়া উচিত নয়।


12

একটি চেকমার্ক সেট করতে:

UITableViewCell *cell = ...;
cell.accessoryType = UITableViewCellAccessoryCheckmark;

কোনও ঘর নির্বাচন / নির্বাচন করতে:

[cell setSelected:TRUE animated:TRUE]; // select
[cell setSelected:FALSE animated:TRUE]; // deselect

পূর্ববর্তী কক্ষটি অনির্বাচিত করতে সর্বশেষ নির্বাচিত ঘরে ট্র্যাক করতে একটি এনএসআইন্ডেক্সপথ * সর্বশেষ নির্বাচিত আইভার ব্যবহার করুন:

- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
   if (self.lastSelected==indexPath) return; // nothing to do

   // deselect old
   UITableViewCell *old = [self.tableView cellForRowAtIndexPath:self.lastSelected];
   old.accessoryType = UITableViewCellAccessoryNone;
   [old setSelected:FALSE animated:TRUE];

   // select new
   UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
   cell.accessoryType = UITableViewCellAccessoryCheckmark;
   [cell setSelected:TRUE animated:TRUE];

   // keep track of the last selected cell
   self.lastSelected = indexPath;
}

8

সুইফট 4 আপডেট করুন

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
    }

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .none
    }

7
extension ViewController : UITableViewDelegate,UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.dataArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = dataArray[indexPath.row]
        if selectedData.contains(dataArray[indexPath.row]) {
            cell.accessoryType = .checkmark
        }else{
            cell.accessoryType = .none
        }
        return cell
    }


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        if selectedData.contains(dataArray[indexPath.row]) {
            selectedData.removeLast()
            tableView.cellForRow(at: indexPath)?.accessoryType = .none
        }else {
            selectedData.removeAll()
            selectedData.append(dataArray[indexPath.row])
            tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
        }
        print(selectedData)
    }

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .none
    }

}

ডেটাআরএর টেবিল ভিউ তৈরির উপর ভিত্তি করে গঠিত .. একইভাবে, আমি একটি ফাঁকা অ্যারে নিয়েছি এবং যখনই ব্যবহারকারীর কোনও সেলে ট্যাপ করে ডেটাআর্রে থেকে ইনডেক্সভ্যালুয়ের উপর ভিত্তি করে আমি সেই বস্তুটি নির্বাচিত ডেটাআরাইতে সঞ্চয় করে রেখেছি

প্রশ্নটির মতো এর মতো ... একটি প্রশ্নের একাধিক বিকল্প রয়েছে (উত্তর), তবে শেষ পর্যন্ত কেবল একটি বা কোনও উত্তরই ফলস্বরূপ হবে না

এখানে চিত্র বর্ণনা লিখুন

একইভাবে, কেবলমাত্র একটি কক্ষের চেকমার্ক দেখাতে হবে এবং অবশিষ্ট কক্ষগুলি অনির্বাচিত হওয়া উচিত ... এটি এমন কোনও ক্ষেত্রে আপনি আপনার উত্তরটি অনির্বাচিত করতে পারেন ... আমি আশা করি এটিই এই প্রশ্নের সেরা উত্তর hope

এখানে চিত্র বর্ণনা লিখুন


এই প্রথম লাইনটি এখনও কোড হিসাবে ফর্ম্যাট করা হয়নি। আন্তঃব্যক্তি ব্যবহার করুন!
বুটজ

7

আমি মনে করি আপনার কাস্টম ইউআইটিএবলভিউসেল প্রয়োগের মধ্যে আনুষাঙ্গিক সেট করা আরও পরিষ্কার। দ্রুতগতিতে, আমি ব্যবহার করেছি:

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
    accessoryType = selected ? .checkmark : .none
}

4
এই উত্তরটি অপরাধমূলকভাবে অন্তর্নিহিত।
ওয়ালেদখান

ধন্যবাদ @ ওয়ালিদখান
ডন মিগুয়েল

4

টেবিলভিউতে কেবলমাত্র নির্বাচিত সারির জন্য সুইফট ৪.২ এবং সুইফট ৫ টি কার্যকারী কোডের চেক চিহ্নের ব্যবহার

   func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    self.tableView.cellForRow(at: indexPath)?.accessoryType = .none
}
   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    //print(self.coloursArray[indexPath.row])

     self.tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}

3

ধরে নিই যে আপনি যে শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে আসছেন UITableViewController, এটি সুইফট 3 এ কৌশলটি করে:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // Add a visual cue to indicate that the cell was selected.
    self.tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}

override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    // Invoked so we can prepare for a change in selection.
    // Remove previous selection, if any.
    if let selectedIndex = self.tableView.indexPathForSelectedRow {
        // Note: Programmatically deslecting does NOT invoke tableView(:didSelectRowAt:), so no risk of infinite loop.
        self.tableView.deselectRow(at: selectedIndex, animated: false)
        // Remove the visual selection indication.
        self.tableView.cellForRow(at: selectedIndex)?.accessoryType = .none
    }
    return indexPath
}

3

উপরের উত্তরগুলি কার্যকর হয় না যদি আপনি বিপুল সংখ্যক ডেটার জন্য সেলটি পুনরায় ব্যবহার করেন। স্ক্রোল এ আপনি বারবার চেকমার্ক দেখতে পাবেন। নীচের পদক্ষেপগুলি ব্যবহার এড়াতে:

  1. ভেরিয়েবলের উপর ঘোষনা করুন: var indexNumber: NSInteger = -1

  2. সেলফোর্ডআউটআইডেক্সপথের নীচে কোড যুক্ত করুন:

     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{         
           if indexNumber == indexPath.row{
               cell.accessoryType = .checkmark
           }else{
               cell.accessoryType = .none
           }
    }
    
  3. এবং didselectAtIndexpath এ কোডের নীচে যুক্ত করুন:

ওভাররাইড ফানক টেবিলভিউ (_ টেবিল ভিউ: ইউআইটিবেল ভিউ, ডডসিলিটরোউ ইন্ডেক্সপথ: ইনডেক্সপথ) r

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            tableView.cellForRow(at: indexPath as IndexPath)?.accessoryType = .checkmark    
indexNumber = indexPath.row
}
override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
       tableView.cellForRow(at: indexPath as IndexPath)?.accessoryType = .none
}

2

ছোট টাইপ

// deselect old
UITableViewCell *old = [self.tableView cellForRowAtIndexPath:self.lastSelected];
cell.accessoryType = UITableViewCellAccessoryNone;
[cell setSelected:FALSE animated:TRUE];

পড়া উচিত

// deselect old
UITableViewCell *old = [self.tableView cellForRowAtIndexPath:self.lastSelected];
old.accessoryType = UITableViewCellAccessoryNone;
[old setSelected:FALSE animated:TRUE];

এবং এছাড়াও

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == [previouslySelected intValue])
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        selectedIndex = indexPath;
        [cell setSelected:YES animated:YES];
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
        [cell setSelected:NO animated:YES];
    }
} 

যেখানে পূর্বেই নির্বাচিত আপনার স্থানীয় আইভার ইত্যাদি you ভাবে আপনি যদি নির্বাচিত সূচকটি পুনরায় লোড করেন তবে আপনি সম্ভাব্য নির্বাচনের মাধ্যমে ঝাঁকুনির পরে এটিও অনির্বাচিত হন।


2

অন্য দিক থেকে এই সমস্যার মুখোমুখি হওয়া ভাল। অভ্যন্তরীণ UIKit প্রক্রিয়াগুলিতে সমস্ত কাজ রাখুন এবং প্রয়োগটি UITableViewCell এ সরান:

@implementation MYTableViewCell

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

    self.accessoryType = selected ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
}

- (void)prepareForReuse {
    [super prepareForReuse];
    self.accessoryType = UITableViewCellAccessoryNone;
}

@end

1

didSelectRowAtIndexPathচেকমার্ক দেখানোর জন্য যে কোনও সারি নির্বাচন করুন এবং চেকমার্ককে আড়াল করার জন্য চেকমার্ক সারিটি নির্বাচন করার সময় কেবল কলিত পদ্ধতি Call

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:true];
    NSLog(@"touch");

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.accessoryType == UITableViewCellAccessoryNone)
    {
       cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else
    {
       cell.accessoryType = UITableViewCellAccessoryNone;
    }
}

1

আপনার প্রয়োজনে সুইফট 4

var lastSelection: NSIndexPath!
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {


    //CHECK MARK THE CELL
    if self.lastSelection != nil {
        self.tableView.cellForRow(at: self.lastSelection as IndexPath)?.accessoryType = .none
    }

    self.tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark

    self.lastSelection = indexPath as NSIndexPath

    self.tableView.deselectRow(at: indexPath, animated: true)

}

1

এটি করতে পারে এমন দুটি উপায় রয়েছে। একটির একাধিক নির্বাচন ছাড়াই এবং অন্যটি একাধিক নির্বাচন সহ।

// Table View Controller -- without Multiple Selection

// Step 1

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    if(tableView.cellForRow(at: indexPath)?.imageView?.image == UIImage(systemName:"checkmark.circle")) {
         tableView.cellForRow(at: indexPath)?.imageView?.image = UIImage(systemName:"circle")
    } else {
         tableView.cellForRow(at: indexPath)?.imageView?.image = UIImage(systemName:"checkmark.circle")
    }
}

//Step 2

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.textLabel?.text = employeeValues[indexPath.row]
    cell.imageView?.image = UIImage(systemName:"circle")

    return cell
}

//  Table View Controller -- with Multiple Selection

@IBOutlet var myTableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    self.myTableView.allowsMultipleSelection = true
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.textLabel?.text = employeeValues[indexPath.row]
    cell.imageView?.image = UIImage(systemName:"circle")

    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

//   let cell = tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.checkmark

    tableView.cellForRow(at: indexPath)?.imageView?.image = UIImage(systemName:"checkmark.circle")

}

override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {

    tableView.cellForRow(at: indexPath)?.imageView?.image = UIImage(systemName:"circle")  
}

0

উপরের বর্ণিত কোডটি কেবলমাত্র একক নির্বাচন নিয়ে কাজ করে। এই নিম্নলিখিত কোডটি অবশ্যই একাধিক নির্বাচনের জন্য কাজ করবে ।

- (void)viewDidLoad {
    arrSelectionStatus =[NSMutableArray array]; //arrSelectionStatus holds the cell selection status 
    for (int i=0; i<arrElements.count; i++) { //arrElements holds those elements which will be populated in tableview
        [arrSelectionStatus addObject:[NSNumber numberWithBool:NO]];
    }
}

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

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

    if (cell==nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
    }

    cell.textLabel.text=[arrElements objectAtIndex:indexPath.row];

    if ([[arrSelectionStatus objectAtIndex:indexPath.row] boolValue] == YES)
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    else
        cell.accessoryType = UITableViewCellAccessoryNone;

    return cell;
}

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

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;

    [arrSelectionStatus replaceObjectAtIndex:indexPath.row withObject:[NSNumber numberWithBool:YES]];
}

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryNone;

    [arrSelectionStatus replaceObjectAtIndex:indexPath.row withObject:[NSNumber numberWithBool:NO]];
}

0

যখন একটি নির্বাচিত ঘর (চেক চিহ্ন সহ আবার নির্বাচন করা হয়), কেবল নির্বাচনটি সরিয়ে ফেলুন।

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
    BOOL isSelected = ([tableView cellForRowAtIndexPath:indexPath].accessoryType ==  UITableViewCellAccessoryCheckmark);
    if(isSelected){
        [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
        [tableView deselectRowAtIndexPath:indexPath animated:YES]; //this won't trigger the didDeselectRowAtIndexPath, but it's always a good idea to remove the selection
    }else{
        [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
    }
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath*)indexPath
{
    [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
}

বোনাস:

self.tableView.indexPathForSelectedRowনির্বাচিত ঘরের জন্য সূচকপথ সনাক্ত করার জন্য ব্যবহার করুন


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