อะไรจะทำให้เซลล์มุมมองตารางยังคงเน้นอยู่หลังจากถูกสัมผัส ฉันคลิกเซลล์และสามารถดูว่าไฮไลต์อยู่เมื่อมีการผลักมุมมองรายละเอียด เมื่อมุมมองรายละเอียดปรากฏขึ้นเซลล์จะยังคงเน้นอยู่
อะไรจะทำให้เซลล์มุมมองตารางยังคงเน้นอยู่หลังจากถูกสัมผัส ฉันคลิกเซลล์และสามารถดูว่าไฮไลต์อยู่เมื่อมีการผลักมุมมองรายละเอียด เมื่อมุมมองรายละเอียดปรากฏขึ้นเซลล์จะยังคงเน้นอยู่
คำตอบ:
ในของ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:
วิธีการเกี่ยวกับทรัพย์สิน tableView -viewDidAppear
จาก อย่างไรก็ตามหากคุณมีมุมมองตารางในคลาสย่อย UIViewController คุณควรโทร-deselectRowAtIndexPath:animated:
จาก-viewDidAppear
ตัวคุณเอง :)
-viewWillAppear:
ที่มันพัง เพิ่มการเรียกเพื่อให้[super viewWillAppear:animated]
มันทำงานอีกครั้ง
UITableViewController
's 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
หรือไม่ UITableViewCell ที่เลือกจะไม่ยกเลิกการเลือกเมื่อคุณไม่ได้โทร[super viewWillAppear:animated];
ด้วยวิธีการที่กำหนดเองของคุณ
สำหรับผู้ใช้ Swift เพิ่มรหัสของคุณ:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
มันเป็นคำตอบของ paulthenerd ยกเว้นใน Swift แทนที่จะเป็น Obj-C
โซลูชัน Swift 3
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}
หากคุณใช้ UITableViewCell ให้คอมเม้นต์บรรทัดต่อไปนี้
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
// [super setSelected:selected animated:animated];
}
หวังว่านี่จะช่วยได้
อัปเดตด้วย Swift 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)
}
}
ฉันใช้วิธีแรกเป็นการส่วนตัวเพราะมันเป็นเรื่องง่ายกว่า ความเป็นไปได้อีกประการหนึ่งหากคุณต้องการภาพเคลื่อนไหวเล็ก ๆ น้อย ๆ เมื่อคุณกลับไปที่ tableView คุณต้องใช้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)
}
}
สุดท้าย แต่ไม่ท้ายสุดถ้าคุณใช้ UITableViewController คุณสามารถใช้ประโยชน์จากคุณสมบัติเคลียร์ SelectSOnViewWillAppear
เพื่อให้ได้พฤติกรรม Kendall Helmstetter Gelner อธิบายในความคิดเห็นของเขาคุณอาจไม่ต้องการ deselectRowAtIndexPath แต่ควรจะล้างคุณสมบัติSelectionOnViewWillAppearบนคอนโทรลเลอร์ของคุณ บางทีนี่อาจถูกตั้งค่าเป็นใช่โดยบังเอิญ?
ดูความคิดเห็นในเทมเพลต Apple ที่เป็นค่าเริ่มต้นสำหรับคลาสย่อย UITableViewController ใหม่:
- (void)viewDidLoad
{
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
}
ฉันได้รับปัญหานี้เช่นกันสำหรับแอปพลิเคชันเจาะลึก หลังจาก viewcontroller ซึ่งฉันจะเรียก VC กลับมาหลังจากกด ViewController อื่นเซลล์ที่เลือกใน VC ยังคงเน้นอยู่ ในแอพของฉันฉันได้สร้าง VC เพื่อจัดการระดับที่สอง (จากสามระดับ) ของการเจาะลึกของฉัน
ปัญหาในกรณีของฉันคือ VC เป็น UIViewController (ที่มีมุมมองที่มี TableView) ฉันทำ VC เป็น UITableViewController (ที่มี TableView) แทน คลาส UITableViewController จัดการการไฮไลต์ของเซลล์ตารางโดยอัตโนมัติหลังจากกลับมาจากการกด คำตอบที่สองสำหรับการโพสต์ " ปัญหาเกี่ยวกับ deselectRowAtIndexPath ใน tableView " ให้คำตอบที่สมบูรณ์ยิ่งขึ้นสำหรับปัญหานี้
ปัญหาไม่ได้เกิดขึ้นกับ root viewcontroller เพราะเมื่อฉันสร้างแอปเป็น "แอพที่ใช้การนำทาง" ใน XCode ตัวควบคุมรูทที่ได้ทำให้ผลลัพธ์นั้นได้ทำการ subclass UITableViewController แล้ว
หากคุณไม่เห็นด้วยกับสิ่งเหล่านี้
ใช้การผ่อนคลายเพื่อโทร:
@IBAction func unwind_ToTableVC (segue: UIStoryboardSegue) {
if let index = tableView.indexPathForSelectedRow {
tableView.deselectRowAtIndexPath(index, animated: true)
}
}
ทำไมต้องทำเช่นนี้? หลักถ้าคุณมีปัญหาในการรับรหัสยกเลิกการเลือกให้ทำงานในเวลาที่เหมาะสม ฉันมีปัญหากับมันไม่ทำงานในมุมมอง WillAppear ดังนั้นการผ่อนคลายก็ทำงานได้ดีขึ้นมาก
ขั้นตอน:
เขียนการแบ่งการคลาย (หรือวางจากด้านบน) ลงใน VC แรกของคุณ (อันที่มีโต๊ะ)
ไปที่ VC ที่ 2 ควบคุมการลากจากปุ่มยกเลิก / เสร็จสิ้น / อื่น ๆ ที่คุณใช้เพื่อยกเลิก VC และลากไปที่ไอคอนออกที่ด้านบน
เลือกชุดการคลายที่คุณสร้างในขั้นตอนที่ 1
โชคดี.
ฉันใช้ CoreData ดังนั้นรหัสที่ใช้งานได้สำหรับฉันคือการผสมผสานความคิดจากคำตอบต่าง ๆ ใน Swift:
override func viewDidAppear(_ animated: Bool) {
if let testSelected = yourTable.indexPathForSelectedRow {
yourTable.deselectRow(at: testSelected, animated: true)
}
super.viewDidAppear(true)
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}
ฉันมีปัญหาเดียวกันมานานแล้วดังนั้นในกรณีที่มีคนอื่นกำลังดิ้นรน
ดูที่ของคุณ-tableView: cellForRowAtIndexPath:
และดูว่าคุณกำลังสร้างเซลล์หรือใช้ 'ตัวระบุการใช้ซ้ำ' หากหลังตรวจสอบให้แน่ใจว่าตารางของคุณใน IB มีเซลล์พร้อมตัวระบุนั้น หากคุณไม่ได้ใช้ตัวระบุซ้ำเพียงแค่สร้างเซลล์ใหม่สำหรับแต่ละแถว
สิ่งนี้จะทำให้ตารางของคุณ 'จางแถวที่เลือก' ที่คาดหวังเมื่อปรากฏ
ใช้วิธีนี้ในคลาส UITableViewCell
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
// Just comment This line of code
// [super setSelected:selected animated:animated];
}
สำหรับ Swift 3: ฉันต้องการใช้ใน viewDidDisappear
กำหนด:-
var selectedIndexPath = IndexPath()
ใน viewDidDisappear: -
override func viewDidDisappear(_ animated: Bool) {
yourTableView.deselectRow(at: selectedIndexPath, animated: true)
}
ใน didSelectRowAtIndexPath: -
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
selectedIndexPath = indexPath
}
หากเซลล์ยังคงไฮไลต์อยู่หลังจากแตะคุณสามารถเรียกใช้วิธี UITabelView
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
`[tableView deselectRowAtIndexPath:indexPath animated:YES];`
}
หรือคุณสามารถใช้วิธีการต่อไปนี้และแก้ไขตามความต้องการของคุณ
// MARK: 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()
}
}
Xcode 10, Swift 4
ฉันมีปัญหาเดียวกันนี้และค้นพบว่าฉันออกจากสายที่ว่างเปล่าเพื่อดู WillAppear ที่ด้านล่างของ tableViewController ของฉัน เมื่อฉันลบฟังก์ชั่นการแทนที่ที่ว่างเปล่าแถวนั้นจะไม่ถูกเน้นอีกเมื่อกลับสู่มุมมอง tableView
ปัญหา func
override func viewWillAppear(_ animated: Bool) {
// need to remove this function if not being used.
}
ลบฟังก์ชั่นที่ว่างเปล่าแก้ปัญหาของฉัน
โซลูชัน Swift 5:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}
deselectRowAtIndexPath
ใน viewDidAppear ของฉันหากเลือกแถวจะแสดงมุมมองใหม่