একটি নির্বাচিত ইউআইটিএবলভিউ সেলটি কীভাবে অনির্বাচিত করবেন?


212

আমি এমন একটি প্রকল্পে কাজ করছি যার উপর আমাকে একটি নির্দিষ্ট ঘর নির্বাচন করতে হবে।

আমি ব্যবহার করে একটি ঘর -willDisplayCellনির্বাচন করতে পারি, তবে ব্যবহারকারী অন্য কোনও ঘরে ক্লিক করলে আমি এটিকে নির্বাচন থেকে নির্বাচন করতে পারি না।

- (void)tableView:(UITableView*)tableView 
        willDisplayCell:(UITableViewCell*)cell
        forRowAtIndexPath:(NSIndexPath*)indexPath
{ 
    AppDelegate_iPad *appDelegte = 
      (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];

    if ([appDelegte.indexPathDelegate row] == [indexPath row])
    {
        [cell setSelected:YES];    
    } 
}

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

    AppDelegate_iPad *appDelegte = 
      (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];

    NSIndexPath *indexpath1 = appDelegte.indexPathDelegate;
    appDelegte.indexPathDelegate = indexPath;
    [materialTable deselectRowAtIndexPath:indexpath1 animated:NO];
}

তুমি কি সাহায্য করতে পারো?


11
এই প্রশ্নের একটি স্বীকৃত উত্তর থাকা দরকার
টাইটুয়ান ডি বাইলিউল

উত্তর:


407

এই কোড ব্যবহার করুন

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
 {
    //Change the selected background view of the cell.
     [tableView deselectRowAtIndexPath:indexPath animated:YES];
 }

সুইফট 3.0:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    //Change the selected background view of the cell.
    tableView.deselectRow(at: indexPath, animated: true)
}

1
পূর্ববর্তীটিটি নির্বাচন থেকে মুক্ত করতে ব্যবহার করার জন্য একটি ডডিজিলেটরেটঅ্যাট ইন্ডেক্সপথ রয়েছে।
হুগি

3
আমি ভাবতে চাই যে আমি এই পোস্টটিকে উপস্থাপন করতে পারি না কারণ এটি একটি পূর্ণসংখ্যার উপচে পড়বে :)
মিলো

হাই @ রম, আপনাকে এই প্রশ্নের একটি উত্তর নির্বাচন করতে হবে
ফ্যাটি

4
আমি বুঝতে পারি না ... এই কোডটি কখনও কোনও কিছুকে নির্বাচিত হতে দেয় না।
সি তেওয়াল্ট

@ ম্যাট্রিক্সগলি ঠিক আছে। এটি ভিতরে এটি করা আরও উপযুক্ত willSelectRowAt:। : এখানে আরো একটি সম্পূর্ণ উত্তর দেখার stackoverflow.com/questions/12693402/...
HuaTham

117

সারণী প্রদর্শনের প্রতিনিধিদের didSelectRowAtIndexpath(বা যে কোনও জায়গা থেকে) নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন

[myTable deselectRowAtIndexPath:[myTable indexPathForSelectedRow] animated:YES];

2
এটি লক্ষ করার মতো যে indexPathForSelectedRowএটি একটি পদ্ধতি এবং সম্পত্তি নয়।
ফ্রিএএসইনবিয়ার

খুব সুন্দর! সম্পর্কে জানতাম না [myTable indexPathForSelectedRow]। আমি আগে কোষগুলির মধ্য দিয়ে লুপিং করছিলাম। ধন্যবাদ!
গুপ্ত্রন

@ ফ্রিএএসআইনবিয়ার এই পার্থক্যটি কি কোনওভাবে গুরুত্বপূর্ণ? সম্পত্তি অ্যাক্সেসরগুলি হ'ল পদ্ধতি।
ডিভাইস 1

@ শাইগুয়ে আপনি যদি আপনার সহকর্মীদের আপনাকে মন্দ বিবেচনা না করেন তবে এটি ঠিক আছে ।
ফ্রিএএসআইনবিয়ার

1
@ সুপেরেকনোবফ দুটি পার্থক্যের মধ্যে পারফরম্যান্সে কোনও পার্থক্য নেই।
ফ্রিএএসআইনবিয়ার

38

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

for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows) {
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
}

1
ভাল চাকরি ... আমি মনে করি ২ য় লাইনে 'সূচক' ইন্ডেক্সপথ হওয়া উচিত
এল টমেটো

এটি iOS 11 সুইফট 4
বোরিস নিকোলিক

30

এটির জন্য সুইফটে একটি এক্সটেনশান করা কার্যকর হতে পারে।

সুইফট 4 এবং সুইফট 5:

সুইফট এক্সটেনশন (উদাহরণস্বরূপ একটি ইউআইটিএবলভিউ এক্সটেনশন.সুইফ্ট ফাইলটিতে):

import UIKit

extension UITableView {

    func deselectSelectedRow(animated: Bool)
    {
        if let indexPathForSelectedRow = self.indexPathForSelectedRow {
            self.deselectRow(at: indexPathForSelectedRow, animated: animated)
        }
    }

}

যেমন:

override func viewWillAppear(_ animated: Bool)
{
    super.viewWillAppear(animated)

    self.tableView.deselectSelectedRow(animated: true)
}

1
আমার মতে, এই উত্তরটি আরও ভাল কারণ viewWillAppear()পদ্ধতিটিতে নির্জনতা স্থাপন ব্যবহারকারীকে বুঝতে পারে যে সে কোথা থেকে ফিরে এসেছে।
MonsieurDart

আমার প্রয়োজন মতো
নিখুঁতটি

28

প্রতিনিধি পদ্ধতিটি সঠিক কিনা তা দয়া করে পরীক্ষা করে দেখুন। উদাহরণ স্বরূপ;

-(void) tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

জন্য

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

পুরোপুরি ভুল পদ্ধতিটি ডাকছিল, আরঘ !! ধন্যবাদ!
দামির কোটেরিক

1
ওহ মানুষ .... রক্তাক্ত অটোকম্প্লিপশন !!! এটি বের করতে আমার বেশ কয়েক ঘন্টা লেগেছিল !!! ওএমজি ... আমি তোমাকে চুমুতে চাই!
জর্জ Asda


16

এটি সুইফট 4 এর জন্য একটি সমাধান

 in tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

শুধু যোগ কর

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

এটি যাদুমন্ত্রের মত কাজ করে

উদাহরণ:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
//some code
}

যতক্ষণ না আপনি আপনার টেবিলভিউতে সম্পাদনা করার ক্ষেত্রে নির্বাচন যোগ করেন, কোনও ঘর নির্বাচন করা অসম্ভব কারণ আপনি যখন এটি নির্বাচন করা শেষ করেছেন তখন এটি এটি নির্বাচন থেকে মুক্ত করে দেবে :)
মেহেদী চেন্নুফি

এটি অবশ্যই সঠিক পন্থা, যখন আপনি সম্পাদনা করছেন না, যখন আপনি "কিছু করার জন্য একটি সারিটি টেপ করছেন"
ফ্যাটি

11

সেলটি নির্বাচিত হিসাবে সেট করার পাশাপাশি, আপনাকে ঘরটি নির্বাচিত হয়েছে তা টেবিলভিউকেও জানাতে হবে। -tableView:selectRowAtIndexPath:animated:scrollPosition:আপনার willDisplayCell:পদ্ধতিতে একটি কল যুক্ত করুন : এবং আপনি এটিকে সাধারণ হিসাবে অনির্বাচিত করতে সক্ষম হবেন।

- (void)tableView:(UITableView*)tableView 
  willDisplayCell:(UITableViewCell*)cell
forRowAtIndexPath:(NSIndexPath*)indexPath
{ 
    AppDelegate_iPad *appDelegte = (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];

    if ([appDelegte.indexPathDelegate row] == [indexPath row])
    {
        // SELECT CELL
        [cell setSelected:YES]; 
        // TELL TABLEVIEW THAT ROW IS SELECTED
        [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];   
    } 
}

বিজোড় স্ক্রোলিং আচরণ এড়াতে ইউআইটিএবলভিস্ক্রোল পজিশন কোনটি ব্যবহার নিশ্চিত করুন।


1
একেবারে সঠিক. আমি মনে করি এটি [cell setSelected:YES]বাদ দেওয়া যেতে পারে: selectRowAtIndexPathকোষের selectedরাজ্যের যত্ন নেবে
স্পেসাস

এই উত্তরটি একাধিক নির্বাচনের সাথে ইউআইটিবেল ভিউয়ের পক্ষে কাজ করে। থাম্বস আপ।
ড্যানি ব্রাভো

6

এই কাজ করা উচিত:

[tableView deselectRowAtIndexPath:indexpath1 animated:NO];

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

ইন্টারফেস বিল্ডারে উপকরণ কি টেবিলভিউয়ের সাথে সংযুক্ত রয়েছে?


আমি কোন পরীক্ষার চেষ্টা করেছি কিন্তু তাও আমার সমস্যার সমাধান করতে পারে না। কখনই ডিলেসलेक्ट ডেলিগেট বরখাস্ত করা হয়েছে তা আমি পুনরায় লোড করা ডেটা হিসাবে এই সমস্যাটিকে অন্যভাবে সমাধান করেছি।
রাম

6

সাইকিরান সমাধানের ভিত্তিতে, আমি এটি লিখেছি, যা আমাকে সাহায্য করেছিল। .M ফাইলটিতে:

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

    if(selectedRowIndex && indexPath.row == selectedRowIndex.row) {

        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        selectedRowIndex = nil;

    }

    else {  self.selectedRowIndex = [indexPath retain];   }

    [tableView beginUpdates];
    [tableView endUpdates];

}

এবং শিরোলেখ ফাইলটিতে:

@property (retain, nonatomic) NSIndexPath* selectedRowIndex;

আমি খুব অভিজ্ঞ না তাই মেমরি ফাঁস ইত্যাদির জন্য ডাবল চেক করি


6

আপনি যদি প্রথম ক্লিক সহ যে কোনও টেবিল সেলটি নির্বাচন করতে চান এবং দ্বিতীয়টির সাথে অনির্বাচিত হন, আপনার এই কোডটি ব্যবহার করা উচিত:

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

    if (self.selectedIndexPath && 
        [indexPath compare:self.selectedIndexPath] == NSOrderedSame) {

        [tableView deselectRowAtIndexPath:indexPath animated:YES];
         self.selectedIndexPath = nil;
    } 
    else {
        self.selectedIndexPath = indexPath;
    }
}

5

সুইফট 4:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    let cell = tableView.cellForRow(at: indexPath)
    if cell?.isSelected == true { // check if cell has been previously selected
        tableView.deselectRow(at: indexPath, animated: true)
        return nil
    } else {
        return indexPath
    }
}

2
এটি আমার জন্য সুইফ্ট 3 এ কাজ করেছে কেবল এটির self.tableView(tableView, didDeselectRowAt: indexPath)পরে যুক্ত করতে tableView.deselectRow...হবে কারণ এটি স্বয়ংক্রিয়ভাবে বলা হয়নি
elysch


3

এটা চেষ্টা কর

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];

আপনার উত্তরটি ব্যাখ্যা করার চেষ্টা করুন, অন্যথায় এটি একটি মন্তব্য হওয়া উচিত।
হুগো ডোজোইস

3
NSIndexPath * index = [self.menuTableView indexPathForSelectedRow];
[self.menuTableView deselectRowAtIndexPath:index animated:NO];

আপনার কোড অনুসারে এই কোডটি রাখুন এবং আপনি আপনার ঘরটি নির্বাচিত করে পাবেন।


3

আপনি এটি চেষ্টা করতে পারেন?

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

    AppDelegate_iPad *appDelegte = 
    (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
    NSIndexPath *indexpath1 = appDelegte.indexPathDelegate;
    appDelegte.indexPathDelegate = indexPath;

    UITableViewCell *prevSelectedCell = [tableView cellForRowAtIndexPath: indexpath1];
    if([prevSelectedCell isSelected]){
       [prevSelectedCell setSelected:NO];
    }
}

এটা আমার জন্য কাজ করেছে।


2

সুইফট 3.0:

রে ওয়েন্ডারলিচ সুইফট স্টাইল গাইডের প্রোটোকল কনফরমেশন বিভাগ অনুসরণ করে , সম্পর্কিত পদ্ধতিগুলিকে একত্রে রাখতে, এই এক্সটেনশনটিকে আপনার মতামত নিয়ামক শ্রেণীর নীচে রাখুন:

// your view controller
class MyViewcontroller: UIViewController {
  // class stuff here
}

// MARK: - UITableViewDelegate
extension MyViewcontroller: UITableViewDelegate {
      // use the UITableViewDelegate method tableView(_:didSelectRowAt:)
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        // your code when user select row at indexPath

        // at the end use deselectRow
        tableView.deselectRow(at: indexPath, animated: true)
    }
}

1

দ্রুতগতি

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    // your code

    // your code

    // and use deselect row to end line of this function

    self.tableView.deselectRowAtIndexPath(indexPath, animated: true)

}

1
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

1

সুইফট 3

আমি এটির মধ্যেও চলে এসেছি - আপনি যখন টেবিল দৃশ্যে নেভিগেট করেন বা আনইন্ডিং করেন তখন এটি সাধারণত আপনার জন্য পূর্বনির্ধারিত সারিটি অনির্বাচিত করে না। আমি এই কোডটি টেবিল ভিউ কন্ট্রোলারে রেখেছি এবং এটি ভালভাবে কাজ করে:

override func viewDidAppear(_ animated: Bool) {
    if let lastSelectedRow = tableView.indexPathForSelectedRow {
        tableView.deselectRow(at: lastSelectedRow, animated: true)
    }
}

1

সুইফট 3/4

ভিউকন্ট্রোলারে:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

কাস্টম সেলে:

override func awakeFromNib() {
    super.awakeFromNib()
    selectionStyle = .none
}


0

প্রিলোডড ডেটার কারণে প্রথমবার ক্লিক করা হলে অনির্বাচিত (ডিডিসিলেকট্রাউট) ফায়ার করতে; আপনার টেবিলভিউটি অবহিত করা উচিত যে সারিটি শুরু করার জন্য ইতিমধ্যে নির্বাচিত হয়েছে, যাতে প্রাথমিক ক্লিকের পরে সারিটি অপসারণ করা হয়:

// সুইফট 3:

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

    if tableView[indexPath.row] == "data value"

        tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)

    }
}

0

আমি যা খুঁজে পেয়েছি সেটি হল সেলটি নির্বাচিত হিসাবে সেট করার শীর্ষে , আপনাকে প্রদত্ত সূচী পথে সারিটি নির্বাচন করতে টেবিলের ভিউটি জানাতে হবে ।

// Swift 3+  

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if appDelegate.indexPathDelegate.row == indexPath.row {
        self.tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none)
        cell.setSelected(true, animated: true)
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.