উত্তর:
আপনার সেলটি অনির্বাচিত didSelectRowAtIndexPath
করার deselectRowAtIndexPath
জন্য আপনাকে কল করতে হবে।
সুতরাং আপনি যা কিছু করছেন didSelectRowAtIndexPath
আপনি কেবল এটির কল করুন deselectRowAtIndexPath
।
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Do some stuff when the row is selected
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
-deselectRowAtIndexPath:animated:
এর টেবিলভিউ সম্পত্তি থেকে পদ্ধতিটিকে কল করে -viewDidAppear
। তবে, যদি আপনার কোনও ইউআইভিউকন্ট্রোলার সাবক্লাসে একটি টেবিল ভিউ থাকে, আপনার নিজের -deselectRowAtIndexPath:animated:
থেকে কল করা উচিত -viewDidAppear
। :)
-viewWillAppear:
। [super viewWillAppear:animated]
আবার কাজ করার জন্য একটি কল যুক্ত করা।
UITableViewController
এর clearsSelectionOnViewWillAppear
সম্পত্তি সেট করা হয় YES
(যা ডিফল্ট), এবং করতে বাধা নি [super viewWillAppear]
নামক হওয়া থেকে।
এটি করার সবচেয়ে পরিষ্কার উপায় হল ভিউ অ্যাপ্লিকেশন:
- (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)
}
}
viewDidAppear
পরিবর্তে এটি কল করুন ।
indexPathForSelectedRow
কলটি শূন্য করতে পারে যাতে এটি পরীক্ষা করা উচিত। ডকুমেন্টেশনটিতে বলা হয়েছে : নির্বাচিত সারির সারি এবং বিভাগ সূচিগুলি সনাক্ত করে এমন একটি সূচক পথ, বা সূচক পথটি অবৈধ থাকলে শূন্য।
আপনি কি সাবক্লাস করেছেন -(void)viewWillAppear:(BOOL)animated
? আপনি যখন [super viewWillAppear:animated];
নিজের কাস্টম পদ্ধতিতে কল করবেন না তখন নির্বাচিত ইউআইটিএবলভিউসেলটি অনির্বাচিত হবে না ।
সুইফ্ট ব্যবহারকারীদের জন্য, আপনার কোডটিতে এটি যুক্ত করুন:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
এটি ওবজ-সি-এর পরিবর্তে সুইফট বাদে পোল্টনার্ডের উত্তর।
সুইফট 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)
}
}
সর্বশেষে তবে সর্বনিম্ন নয়, আপনি যদি কোনও ইউআইটিএবলভিউ কনট্রোলার ব্যবহার করেন তবে আপনি সম্পত্তি ক্লিয়ারসলেশনওনভিউউইলওয়্যার অ্যাপের সুবিধাও নিতে পারেন ।
এই আচরণটি পেতে কেন্ডাল হেলস্টেটার জেলনার তার মন্তব্যে বর্ণনা করেছেন, আপনি সম্ভবত ডিসলেক্টরওএটিআইডেক্সপথটি চান না বরং আপনার নিয়ামকের ক্লিয়ারসলেশনঅনভিউউইলওয়্যার অ্যাপের সম্পত্তিটি চান। সম্ভবত এটি দুর্ঘটনাক্রমে হ্যাঁ সেট করা হয়েছিল?
নতুন ইউআইটিএবল ভিউকন্ট্রোলার সাবক্লাসের জন্য ডিফল্ট অ্যাপল টেমপ্লেটে মন্তব্যটি দেখুন:
- (void)viewDidLoad
{
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
}
আমার ড্রিল-ডাউন অ্যাপ্লিকেশনটির জন্যও আমি এই সমস্যাটি পাচ্ছিলাম। আমি ভিসি কল করব এমন একটি ভিউকন্ট্রোলার পরে, অন্য ভিউকন্ট্রোলারকে চাপ দেওয়ার পরে ফিরে আসে, ভিসির মধ্যে নির্বাচিত ঘরটি হাইলাইট হয়ে যায়। আমার অ্যাপ্লিকেশনটিতে, আমি আমার ড্রিল-ডাউনের দ্বিতীয় স্তরের (তিন স্তরের মধ্যে) পরিচালনা করতে ভিসি তৈরি করেছি।
আমার ক্ষেত্রে সমস্যাটি হ'ল ভিসি একজন ইউআইভিউউকন্ট্রোলার ছিলেন (এতে একটি টেবিলভিউ রয়েছে এমন একটি ভিউ রয়েছে)। আমি পরিবর্তে ভিসিকে একটি ইউআইটিএবলভিউ কনট্রোলার বানিয়েছি (এতে একটি টেবিলভিউ রয়েছে)। ইউআইটিএবলভিউকন্ট্রোলার শ্রেণি স্বয়ংক্রিয়ভাবে কোনও চাপ থেকে ফিরে আসার পরে টেবিল ঘরের ডি-হাইলাইটিং পরিচালনা করে। " টেবিলভিউতে অনির্বাচিত রউএটিআইএনডেক্সপথ সহ ইস্যু পোস্টের দ্বিতীয় উত্তর এই সমস্যার আরও সম্পূর্ণ উত্তর দেয়।
রুট ভিউকন্ট্রোলারের ক্ষেত্রে সমস্যাটি দেখা দেয় নি কারণ আমি যখন এক্সকোডে একটি "নেভিগেশন-ভিত্তিক অ্যাপ" হিসাবে অ্যাপটি তৈরি করেছি, ফলস্বরূপ মূল ভিউকন্ট্রোলার ইতিমধ্যে UITableViewController সাবক্লাসে তৈরি হয়েছিল।
যদি এগুলির কোনওটি আপনার পক্ষে কাজ না করে তবে এই কাজের চারপাশে বিবেচনা করুন:
কল করার জন্য একটি অনিচ্ছাকৃত সিগ ব্যবহার করুন:
@IBAction func unwind_ToTableVC (segue: UIStoryboardSegue) {
if let index = tableView.indexPathForSelectedRow {
tableView.deselectRowAtIndexPath(index, animated: true)
}
}
কেন এমন করবেন? প্রাথমিকভাবে যদি আপনার সঠিক সময়ে চালনার জন্য অনির্বাচিত কোড পেতে সমস্যা হয়। এটিতে উইলঅপ অ্যাপায় কাজ না করা নিয়ে আমার সমস্যা ছিল তাই আনইন্ডাইন্ড আরও ভাল কাজ করে।
পদক্ষেপ:
আপনার প্রথম ভিসিতে (টেবিলের সাথে একটি) অন আনইন্ড সেগু লিখুন (বা উপরে থেকে আটকান)
২ য় ভিসিতে যান। আপনি সেই ভিসিকে বরখাস্ত করতে এবং বাতিল করা / করা / ইত্যাদি বোতামটি থেকে নিয়ন্ত্রণ-টেনে আনুন এবং উপরের প্রস্থান আইকনে টানুন।
পদক্ষেপ 1 এ আপনি তৈরি করেছেন এমন আনইন্ড সেলগ নির্বাচন করুন
শুভকামনা।
আমি কোরডাটা ব্যবহার করছি তাই আমার জন্য কাজ করা কোডটি সুইফটে বিভিন্ন উত্তর থেকে ধারণার সংমিশ্রণ ছিল:
override func viewDidAppear(_ animated: Bool) {
if let testSelected = yourTable.indexPathForSelectedRow {
yourTable.deselectRow(at: testSelected, animated: true)
}
super.viewDidAppear(true)
}
আমি দীর্ঘদিন ধরে একই সমস্যাটি নিয়ে আসছি তাই অন্য কেউ লড়াইয়ের ক্ষেত্রে:
আপনার একবার দেখুন -tableView: cellForRowAtIndexPath:
এবং দেখুন যে আপনি ঘর তৈরি করছেন বা একটি 'পুনরায় ব্যবহার শনাক্তকারী' ব্যবহার করছেন। যদি দ্বিতীয়টি হয় তবে নিশ্চিত হয়ে নিন যে আইবিতে আপনার টেবিলে সেই শনাক্তকারীর সাথে একটি ঘর আছে। আপনি যদি পুনঃব্যবহারের শনাক্তকারী ব্যবহার না করে থাকেন তবে প্রতিটি সারির জন্য একটি নতুন ঘর তৈরি করুন।
এটির পরে আপনার টেবিলটি প্রত্যাশিত 'বিবর্ণ নির্বাচিত সারি' দেওয়া উচিত।
সুইফ্ট 3 এর জন্য: আমি ভিউডিডিস্পিয়ারে এটি ব্যবহার করতে পছন্দ করব
নির্ধারণ: -
var selectedIndexPath = IndexPath()
ভিউডিডডিস্পায়ারে: -
override func viewDidDisappear(_ animated: Bool) {
yourTableView.deselectRow(at: selectedIndexPath, animated: true)
}
ডিডলেস্টরোউএটিআইডেক্সপথে: -
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
selectedIndexPath = indexPath
}
সেলটি স্পর্শ করার পরে যদি সেটিকে হাইলাইট করা হয়, আপনি ইউআইটিবেলভিউ পদ্ধতিতে কল করতে পারেন,
- (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()
}
}
এক্সকোড 10, সুইফট 4
আমার এই একই সমস্যা ছিল এবং আমি আবিষ্কার করেছি যে আমি আমার টেবিলভিউকন্ট্রোলারের নীচে ভিউইল অ্যাপয়ারে একটি খালি কল রেখেছি। একবার আমি খালি ওভাররাইড ফাংশনটি সরিয়ে নিয়ে সারণীভিউ ভিউতে ফিরে আসার পরে সারিটি আর হাইলাইট করা যায় না।
সমস্যা মজা
override func viewWillAppear(_ animated: Bool) {
// need to remove this function if not being used.
}
খালি ফাংশন অপসারণ আমার সমস্যার সমাধান করে।
deselectRowAtIndexPath
আমার ভিউডিড অ্যাপে কল করতে পছন্দ করি , যদি সারিটি নির্বাচন করে একটি নতুন ভিউ উপস্থিত হয়।