ইউআইটিএবলভিউসেল কেন হাইলাইট থাকবে?


145

কোন টেবিল ভিউ সেলটি স্পর্শ হওয়ার পরে হাইলাইট হওয়ার কারণ হতে পারে? আমি ঘরে ক্লিক করি এবং বিশদ ভিউটি পুশ হওয়ার সাথে সাথে এটি হাইলাইটে থাকতে দেখতে পারে। একবার বিশদ দর্শনটি পপ করা হয়ে গেলে, ঘরটি এখনও হাইলাইট করা হয়।

উত্তর:


262

আপনার সেলটি অনির্বাচিত didSelectRowAtIndexPathকরার deselectRowAtIndexPathজন্য আপনাকে কল করতে হবে।

সুতরাং আপনি যা কিছু করছেন didSelectRowAtIndexPathআপনি কেবল এটির কল করুন deselectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 // Do some stuff when the row is selected
 [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

11
আমি deselectRowAtIndexPathআমার ভিউডিড অ্যাপে কল করতে পছন্দ করি , যদি সারিটি নির্বাচন করে একটি নতুন ভিউ উপস্থিত হয়।
নোট করুন

5
আসলে এটি কল করার সঠিক জায়গা নয়, সত্যই ... টেবিলগুলি সহ একটি অ্যাপল অ্যাপ্লিকেশন ব্যবহার করার চেষ্টা করুন (পরিচিতিগুলি একটি ভাল)) এবং আপনি একটি নতুন স্ক্রিনে বেরোনোর ​​পরে আপনি দেখতে পাবেন, ফেরত দেওয়ার পরে সেলটি হাইলাইট করা হবে নির্বাচিত হওয়ার আগে সংক্ষিপ্তভাবে তত্ত্বগতভাবে আমি মনে করি এটি এখনই নিজের হাতে না ফেলে নির্বাচন করার জন্য আপনার কোনও অতিরিক্ত কাজ করার দরকার নেই, সুতরাং
ভিউডিড অ্যাপের কোডটির

6
@ কেন্ডাল, @ চতুর্থ স্পেস: আমার শেষ মন্তব্যটি আমি কাকে উল্লেখ করছি তা নিয়ে বিভ্রান্তিকর হয়েছিল, এর জন্য ক্ষমা চাইছি। UITableViewController -deselectRowAtIndexPath:animated:এর টেবিলভিউ সম্পত্তি থেকে পদ্ধতিটিকে কল করে -viewDidAppear। তবে, যদি আপনার কোনও ইউআইভিউকন্ট্রোলার সাবক্লাসে একটি টেবিল ভিউ থাকে, আপনার নিজের -deselectRowAtIndexPath:animated:থেকে কল করা উচিত -viewDidAppear। :)
ড্যানিয়েল টুল

5
আমার ইউআইটিএবলভিউ কনট্রোলারের সাবক্লাসে এটি আসলে এটির একটি ওভাররাইড ছিল -viewWillAppear:[super viewWillAppear:animated]আবার কাজ করার জন্য একটি কল যুক্ত করা।
বেন চ্যালেঞ্জর

5
3.2 সাল থেকে, স্বয়ংক্রিয় নির্বাচন মুক্ত আচরণ যদি আপনার ঘটে UITableViewControllerএর clearsSelectionOnViewWillAppearসম্পত্তি সেট করা হয় YES(যা ডিফল্ট), এবং করতে বাধা নি [super viewWillAppear]নামক হওয়া থেকে।
26 এ Defragged

62

এটি করার সবচেয়ে পরিষ্কার উপায় হল ভিউ অ্যাপ্লিকেশন:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // Unselect the selected row if any
    NSIndexPath*    selection = [self.tableView indexPathForSelectedRow];
    if (selection) {
        [self.tableView deselectRowAtIndexPath:selection animated:YES];
    }
}

আপনি যখন নিয়ন্ত্রকের কাছে ফিরে আসেন তখন যেমন নির্বাচনটি ম্লান হয়ে যাওয়ার অ্যানিমেশন রয়েছে, তেমনই হওয়া উচিত।

Http://forums.macrumors.com/showthread.php?t=577677 থেকে নেওয়া

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

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

    // deselect the selected row if any
    let selectedRow: IndexPath? = tableView.indexPathForSelectedRow
    if let selectedRowNotNill = selectedRow {
        tableView.deselectRow(at: selectedRowNotNill, animated: true)
    }
}

1
এটিই আমি প্রত্যাশা করি যা বেশিরভাগ লোকেরা যদি কোনও ইউআইটিএবলভিউ নিয়ন্ত্রণকারী ব্যবহার না করে তবে তারা চাইবে want +1
মাইকেবি

3
আমি ভাবছি যে লোকেরা এখন কী করছে যে আইওএস 7 ব্যবহারকারীকে 'টেনে' ফিরিয়ে আনতে দেয়। আংশিকভাবে টেনে আনার পরে তবুও ক্রিয়াটি সম্পূর্ণ না করায় ভিউউইল অ্যাপের আগুন জ্বলবে। যখন ব্যবহারকারী বাস্তবের জন্য ফিরে আসে, সারিটি নির্বাচন করা হবে না।
বেন প্যাকার্ড

1
@ বেনপ্যাকার্ড কেবল তার viewDidAppearপরিবর্তে এটি কল করুন ।
স্কয়ারফ্রোগ

@ জেসিকা indexPathForSelectedRowকলটি শূন্য করতে পারে যাতে এটি পরীক্ষা করা উচিত। ডকুমেন্টেশনটিতে বলা হয়েছে : নির্বাচিত সারির সারি এবং বিভাগ সূচিগুলি সনাক্ত করে এমন একটি সূচক পথ, বা সূচক পথটি অবৈধ থাকলে শূন্য।
গর্ডোনিয়াম

এটি গ্রহণযোগ্য উত্তর হিসাবে মন্তব্য করা উচিত, এটি আরও ইউআই বান্ধব যাতে ব্যবহারকারী ফিরে আসার পরে নিখুঁতভাবে পৌঁছতে পারে, নিখুঁত
👌

20

আপনি কি সাবক্লাস করেছেন -(void)viewWillAppear:(BOOL)animated? আপনি যখন [super viewWillAppear:animated];নিজের কাস্টম পদ্ধতিতে কল করবেন না তখন নির্বাচিত ইউআইটিএবলভিউসেলটি অনির্বাচিত হবে না ।


19

সুইফ্ট ব্যবহারকারীদের জন্য, আপনার কোডটিতে এটি যুক্ত করুন:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
}

এটি ওবজ-সি-এর পরিবর্তে সুইফট বাদে পোল্টনার্ডের উত্তর।


1
এটি কি নিজে থেকে নির্বাচিত হয়ে যায় না, মানে আপনি যে মুহুর্তটি ছাড়লেন?
মধু

@ হানি সম্ভবত আইওএসের পূর্ববর্তী সংস্করণে বা ভিউ অদৃশ্য হয়ে গেলেও এখন আইওএস 10 (সম্ভবত এর আগেও) এবং তারপরে নয়।
জেমি বার্চ 21

9

সুইফট 3 সমাধান

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

7

আপনি যদি কোনও ইউআইটিএবলভিউসেল ব্যবহার করে থাকেন তবে নীচের লাইনে মন্তব্য করুন

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{

 // [super setSelected:selected animated:animated];

}

আশাকরি এটা সাহায্য করবে.


4

সুইফট 4 দিয়ে আপডেট হয়েছে

পূর্ববর্তী উত্তরের উপর ভিত্তি করে কয়েকটি পরীক্ষা-নিরীক্ষার পরেও আমি এই সিদ্ধান্তে পৌঁছেছি যে সর্বোত্তম আচরণ 2 উপায়ে অর্জন করা যেতে পারে: (বাস্তবে প্রায় অভিন্ন)

// First Solution: delegate of the table View
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: false)
}

// Second Solution: With the life cycle of the view.
override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)

    let selectedRow: IndexPath? = tableView.indexPathForSelectedRow
    if let selectedRow = selectedRow {
        tableView.deselectRow(at: selectedRow, animated: false)
    }
}

আমি ব্যক্তিগতভাবে প্রথম সমাধানটি গ্রহণ করছি, কারণ এটি কেবল আরও সংক্ষিপ্ত। আরেকটি সম্ভাবনা, আপনি যখন টেবিলভিউতে ফিরে আসার সময় আপনার যদি অল্প অ্যানিমেশন প্রয়োজন হয়, তা হ'ল viewWillAppear:

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

    let selectedRow: IndexPath? = _view.tableView.indexPathForSelectedRow
    if let selectedRow = selectedRow {
        _view.tableView.deselectRow(at: selectedRow, animated: true)
    }
}

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


3

এই আচরণটি পেতে কেন্ডাল হেলস্টেটার জেলনার তার মন্তব্যে বর্ণনা করেছেন, আপনি সম্ভবত ডিসলেক্টরওএটিআইডেক্সপথটি চান না বরং আপনার নিয়ামকের ক্লিয়ারসলেশনঅনভিউউইলওয়্যার অ্যাপের সম্পত্তিটি চান। সম্ভবত এটি দুর্ঘটনাক্রমে হ্যাঁ সেট করা হয়েছিল?

নতুন ইউআইটিএবল ভিউকন্ট্রোলার সাবক্লাসের জন্য ডিফল্ট অ্যাপল টেমপ্লেটে মন্তব্যটি দেখুন:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;
}

2

আমার ড্রিল-ডাউন অ্যাপ্লিকেশনটির জন্যও আমি এই সমস্যাটি পাচ্ছিলাম। আমি ভিসি কল করব এমন একটি ভিউকন্ট্রোলার পরে, অন্য ভিউকন্ট্রোলারকে চাপ দেওয়ার পরে ফিরে আসে, ভিসির মধ্যে নির্বাচিত ঘরটি হাইলাইট হয়ে যায়। আমার অ্যাপ্লিকেশনটিতে, আমি আমার ড্রিল-ডাউনের দ্বিতীয় স্তরের (তিন স্তরের মধ্যে) পরিচালনা করতে ভিসি তৈরি করেছি।

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

রুট ভিউকন্ট্রোলারের ক্ষেত্রে সমস্যাটি দেখা দেয় নি কারণ আমি যখন এক্সকোডে একটি "নেভিগেশন-ভিত্তিক অ্যাপ" হিসাবে অ্যাপটি তৈরি করেছি, ফলস্বরূপ মূল ভিউকন্ট্রোলার ইতিমধ্যে UITableViewController সাবক্লাসে তৈরি হয়েছিল।


1

যদি এগুলির কোনওটি আপনার পক্ষে কাজ না করে তবে এই কাজের চারপাশে বিবেচনা করুন:

কল করার জন্য একটি অনিচ্ছাকৃত সিগ ব্যবহার করুন:

@IBAction func unwind_ToTableVC (segue: UIStoryboardSegue) {
    if let index = tableView.indexPathForSelectedRow {
        tableView.deselectRowAtIndexPath(index, animated: true)
    }
}

কেন এমন করবেন? প্রাথমিকভাবে যদি আপনার সঠিক সময়ে চালনার জন্য অনির্বাচিত কোড পেতে সমস্যা হয়। এটিতে উইলঅপ অ্যাপায় কাজ না করা নিয়ে আমার সমস্যা ছিল তাই আনইন্ডাইন্ড আরও ভাল কাজ করে।

পদক্ষেপ:

  1. আপনার প্রথম ভিসিতে (টেবিলের সাথে একটি) অন আনইন্ড সেগু লিখুন (বা উপরে থেকে আটকান)

  2. ২ য় ভিসিতে যান। আপনি সেই ভিসিকে বরখাস্ত করতে এবং বাতিল করা / করা / ইত্যাদি বোতামটি থেকে নিয়ন্ত্রণ-টেনে আনুন এবং উপরের প্রস্থান আইকনে টানুন।

  3. পদক্ষেপ 1 এ আপনি তৈরি করেছেন এমন আনইন্ড সেলগ নির্বাচন করুন

    শুভকামনা।


ভিউডিড অ্যাপয়ারটি আগুন না দেয় এমন সময়ের জন্য এটি সেরা সমাধান (অর্থাত্ যদি শিশু দৃষ্টিভঙ্গি ফর্ম শিট হিসাবে আধুনিকভাবে উপস্থাপন করা হয় এবং পুরো স্ক্রিনটি কভার করে না)।
ফিডস্ট

1

আমি কোরডাটা ব্যবহার করছি তাই আমার জন্য কাজ করা কোডটি সুইফটে বিভিন্ন উত্তর থেকে ধারণার সংমিশ্রণ ছিল:

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

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

0

আমি দীর্ঘদিন ধরে একই সমস্যাটি নিয়ে আসছি তাই অন্য কেউ লড়াইয়ের ক্ষেত্রে:

আপনার একবার দেখুন -tableView: cellForRowAtIndexPath: এবং দেখুন যে আপনি ঘর তৈরি করছেন বা একটি 'পুনরায় ব্যবহার শনাক্তকারী' ব্যবহার করছেন। যদি দ্বিতীয়টি হয় তবে নিশ্চিত হয়ে নিন যে আইবিতে আপনার টেবিলে সেই শনাক্তকারীর সাথে একটি ঘর আছে। আপনি যদি পুনঃব্যবহারের শনাক্তকারী ব্যবহার না করে থাকেন তবে প্রতিটি সারির জন্য একটি নতুন ঘর তৈরি করুন।

এটির পরে আপনার টেবিলটি প্রত্যাশিত 'বিবর্ণ নির্বাচিত সারি' দেওয়া উচিত।


0

ইউআইটিএবল ভিউসেল ক্লাসে এই পদ্ধতিটি ব্যবহার করুন

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

   // Just comment This line of code
   // [super setSelected:selected animated:animated];        
}

0

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

নির্ধারণ: -

    var selectedIndexPath = IndexPath()

ভিউডিডডিস্পায়ারে: -

    override func viewDidDisappear(_ animated: Bool) {
    yourTableView.deselectRow(at: selectedIndexPath, animated: true)
}

ডিডলেস্টরোউএটিআইডেক্সপথে: -

    func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
    selectedIndexPath = indexPath
}

0

সেলটি স্পর্শ করার পরে যদি সেটিকে হাইলাইট করা হয়, আপনি ইউআইটিবেলভিউ পদ্ধতিতে কল করতে পারেন,

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

`[tableView deselectRowAtIndexPath:indexPath animated:YES];`   

}

অথবা, আপনি নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন এবং আপনার প্রয়োজনীয়তা অনুসারে এটিকে সংশোধন করতে পারেন,

// মার্ক: UITableViewDelegate

func tableView(tableView: UITableView, didHighlightRowAtIndexPath indexPath: NSIndexPath) {
  if let cell = tableView.cellForRowAtIndexPath(indexPath) {
     cell.backgroundColor = UIColor.greenColor()
  }
}

func tableView(tableView: UITableView, didUnhighlightRowAtIndexPath indexPath: NSIndexPath) {
  if let cell = tableView.cellForRowAtIndexPath(indexPath) {
     cell.backgroundColor = UIColor.blackColor()
  }
} 

0

এক্সকোড 10, সুইফট 4

আমার এই একই সমস্যা ছিল এবং আমি আবিষ্কার করেছি যে আমি আমার টেবিলভিউকন্ট্রোলারের নীচে ভিউইল অ্যাপয়ারে একটি খালি কল রেখেছি। একবার আমি খালি ওভাররাইড ফাংশনটি সরিয়ে নিয়ে সারণীভিউ ভিউতে ফিরে আসার পরে সারিটি আর হাইলাইট করা যায় না।

সমস্যা মজা

override func viewWillAppear(_ animated: Bool) {
  // need to remove this function if not being used.
}

খালি ফাংশন অপসারণ আমার সমস্যার সমাধান করে।


0

সুইফট 5 সমাধান:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.