UITableView didSelectRowAtIndexPath: ไม่ได้ถูกเรียกเมื่อแตะครั้งแรก


352

UITableView's didSelectRowAtIndexPathฉันมีปัญหากับ

ตารางของฉันถูกตั้งค่าเพื่อที่เมื่อฉันเลือกแถวมันจะเริ่มต้นตัวควบคุมมุมมองใหม่และผลักดันมัน

ครั้งแรกที่ฉันแตะแถวใด ๆ ในตารางวิธีการจะไม่ถูกเรียก เมื่อฉันเลือกแถวอื่นมันจะเริ่มทำงานตามปกติ

didSelectRowAtIndexPathฉันได้รับการตรวจสอบโดยการตั้งค่าเบรกพอยต์ใน เมื่อเพิ่มNSLogวิธีการที่ฉันเห็นว่าเมื่อฉันเลือกแถวที่สองที่ในที่สุดก็ผลักดันตัวควบคุมมุมมองใหม่ฉันเห็นคำสั่งบันทึกสองรายการปรากฏในคอนโซลในเวลาเดียวกัน

ข้อเสนอแนะใด ๆ


2
คุณช่วยโพสต์โค้ดได้tableView:didSelectRowAtIndexPath:ไหม
gerry3

ฉันมีปัญหาเดียวกันตรวจสอบคำตอบของฉัน: stackoverflow.com/a/44097559/1600061
Zsivics Sanel

1
การจัดส่งในคิวหลักแก้ปัญหาstackoverflow.com/questions/20149167/
durgeshtrivedi

คำตอบ:


1356

มีโอกาสใดที่คุณพิมพ์โดยไม่ตั้งใจDe selectRowAtIndexPath?


17
@Dschee มันไม่ได้ถูกเรียกในการแตะครั้งแรกเพราะคุณไม่ได้ยกเลิกการเลือกอะไร เมื่อคุณเลือกหนึ่งแถวเมื่อคุณพยายามเลือกแถวที่สองแถวแรกจะถูกยกเลิกการเลือก
เพื่อน

19
นั่นเป็นเหตุผลที่ฉันรักดังนั้น
elbuild

4
ฉัน upvoting นี้ไม่ได้เพราะฉันทำผิดครั้งเดียว ฉันลงคะแนนเพราะฉันทำผิดนี้ไม่น้อยกว่า 4 ครั้งในเวลาหลายปีทำให้เสียเวลามาก
Brooks Hanes

8
พระเจ้าช่วย!! นี่อาจเป็นข้อผิดพลาดที่แย่ที่สุดที่ฉันแนะนำในรหัสของฉัน
Shantanu Paul

4
ว้าว. ช่วยให้ฉันมีเวลามาก
MortalMan

24

ตรวจสอบคุณสมบัติการเลือกของมุมมองตารางของคุณในไฟล์ xib ใช้ 'Single Selection' หรือ 'Multiple Selection' ตามต้องการ


2
บาฮาฮ่า ๆ ๆ ! ว้าวฉันใช้เวลา 4 ชั่วโมงในการพยายามคิดออก @ รวมถึงการช่วยเหลือ (คำนับ)! ขอบคุณ!

17

ฉันพบปัญหาต่อไปนี้:

  • แตะแรกในแถว -> ไม่มีผลไม่มีการเลือกไม่เคย
  • แตะครั้งที่สองและต่อไปนี้ -> พฤติกรรมการเลือกที่ถูกต้องเสมอ

ในกรณีของฉันข้อผิดพลาดของฉันกำลังตรวจสอบShow Selection on Touchในตัวสร้างส่วนต่อประสาน คุณสามารถยกเลิกการเลือกใน IB ได้ที่นี่:

ป้อนคำอธิบายรูปภาพที่นี่

หวังว่าจะช่วยใครซักคน


คุณคือฮีโร่ของฉัน! ความคิดใดที่เป็นค่าเริ่มต้น ฉันไม่สามารถนึกถึงแอปที่มีพฤติกรรมนั้นและฉันคิดว่านี่เป็นค่าเริ่มต้นที่แปลกมาก
Christophe Fondacci

12

ตรวจสอบว่าคุณได้ตั้งตัวจดจำท่าทางในชั้นเรียนของคุณหรือไม่ การลบท่าทางใช้งานได้สำหรับฉัน


ฉันมีทั้งคู่ ใช้ท่าทางจดจำและ didSelectRowAtIndexPath หรือไม่ อย่างไรก็ตามตัวรู้จำท่าทางใช้การตั้งค่าเสมอ ไม่สามารถไปที่สองได้ มีวิธีจัดการทั้งสองอย่างหรือฉันต้องกำจัดตัวจดจำท่าทางสัมผัสหรือไม่? ขอบคุณ!
Ron

สิ่งนี้จะต้องอยู่ด้านบนสุด :) ค่าใช้จ่ายฉัน 1 ชั่วโมงหลังจาก 7 ปีในการพัฒนา iOS
ตัวตลก

6

ฉันถกเถียงกันแม้จะโพสต์คำตอบนี้เพราะฉันคิดว่าดาวเรียงกันเพื่อให้สิ่งนี้ปรากฏออกมาเอง

ฉันกำลังประสบกับปัญหานี้และได้ตรวจสอบวิธีแก้ไขปัญหาอื่น ๆ ในมุมมองตารางของฉันมันไม่ได้ประมวลผลแถวสุดท้ายของตารางในการแตะครั้งแรก มันเน้นมัน แต่didSelectRowAtIndexPathไม่ได้ถูกเรียก แถวอื่นทั้งหมดทำงานได้ดี แต่ถ้าฉันเปิดเด้ง tableview แล้วดูเหมือนว่าจะแก้ปัญหา (แต่คุณต้องจัดการกับเด้ง tableview)


คุณพบสาเหตุที่ทำให้เกิดเหตุการณ์นี้หรือไม่? ฉันมีปัญหาเดียวกันทุกประการ เมื่อฉันปิดการตีกลับตารางแล้วแถวแรก / สุดท้ายในตารางจะไม่ตอบสนองเมื่อแตะครั้งแรก ฉันคิดว่ามันเป็นข้อผิดพลาด แต่มันเกินหนึ่งปีและมันยังคงเกิดขึ้น
filip.karas

ไม่ฉันเพิ่งเปิดใช้เด้ง tableview แล้วปล่อยไว้ที่นั่น
Chase Roberts เมื่อ

ฉันมีปัญหานี้ใน iPhone 5 เท่านั้น (iOS 10.3) - การเปิดใช้การตีกลับที่ tableview ของฉันแก้ไข แปลกมาก!
Lee Probert

4

UITableViewCellSelectionStyleNone ถูกตั้งค่าสำหรับเซลล์ที่แสดงปัญหานั้น (ios9)

จบลงด้วยการโทร

[tableView deselectRowAtIndexPath:indexPath animated:NO];

สิ่งแรกค่ะ

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

ซึ่งไม่เหมือนกัน แต่ก็ดีพอ ทำให้ฉันสงสัยว่าการแตกของตาราง ios10 เป็นอย่างไร


สิ่งนี้ใช้ได้สำหรับฉัน แต่ฉันต้องการวิธีแก้ปัญหาเพื่อซ่อนการเลือกโดยไม่ต้องมีสไตล์ไม่มี ฉันลบล้างsetSelectedแต่ในขณะที่ผู้ใช้กำลังถือเซลล์การเลือกจะปรากฏขึ้นซึ่งไม่เป็นที่ยอมรับ
MMujtabaRoohani

1

SWIFT 2

ตรวจสอบให้แน่ใจว่าคุณมีชุดนี้เป็นจริง:

self.tableView.allowsSelection = true

ใส่สิ่งนี้ไว้ด้านบนขวาของคุณหลังจากviewDidLoad()และก่อนsuper.viewDidLoad()


1

สวิฟท์ 3

หากคุณกำลังทำงานกับ Swift 3 ในชั้นเรียนที่ไม่ได้เป็นUITableViewControllerและคุณกำลังใช้UITableViewDelegateงานอยู่คุณอาจต้องใช้ชื่อวิธีการ:

@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){...}

สิ่งนี้ใช้ได้ผลสำหรับฉันแม้ว่าฉันเพิ่งจะย้ายโครงการของฉันไปที่ Swift 3 มันค่อนข้างใหม่ดังนั้นจึงอาจได้รับการแก้ไขในภายหลัง


1

หากคุณตั้งค่า UITapGestureRecognizer ใด ๆ ในชั้นเรียนของคุณคุณสามารถเพิ่มบรรทัดนี้ใน didSelectRowAtIndexPath ของคุณ:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

สิ่งนี้ใช้ได้สำหรับฉัน


1

ปัญหานี้เกิดขึ้นเมื่อคุณทำงานกับตัวจดจำท่าทางภายใน tableView ในกรณีนี้คุณไม่จำเป็นต้องลบออกคุณต้องตรวจสอบให้แน่ใจว่าคุณสมบัติท่าทางสัมผัสของคุณcancelsTouchesInView = falseเป็นค่าบูลีนที่ส่งผลต่อการสัมผัสเมื่อส่งไปยังมุมมองเมื่อ มีการจดจำท่าทางสัมผัส


0

สวิฟท์ 3

ไม่มีคำตอบอื่นใดที่ทำงานในกรณีของฉันสิ่งที่แก้ไขสำหรับฉันคือ:

tableView.delaysContentTouches = false


0

didSelectRowAtฟังก์ชั่นไม่ได้ถูกเรียกในแอพของฉันในการแตะครั้งแรกหรือครั้งที่สอง ... ฉันพยายามที่จะแก้ปัญหาไม่สามารถหาวิธีการแก้ปัญหาใด ๆ แต่ทันใดนั้นฉันก็จำได้ว่าฉันกำลังใช้การเปลี่ยนสี view.animation Delegateวิธี... ไม่ได้เรียกว่าในขณะที่ภาพเคลื่อนไหวยังคงมีอยู่


0

ในกรณีของฉันฉันมีส่วนหัวของ UITableView พร้อมด้วยตัวจำแนกลายมือ เมื่อมีการแตะส่วนหัวก็ควรแทรกสองสามแถวลงในส่วนนั้นและทำให้การแทรก (เช่นส่วนขยาย / ยุบ) เคลื่อนไหว ครั้งแรกเมื่อขยายและเคาะวิธีการมอบหมาย didSelectRow ไม่ได้ถูกเปิดใช้งาน สำหรับการแตะเพิ่มเติมและการขยาย / ยุบการกระทำนั้นทำงานตามที่คาดไว้

ต่อคำตอบโดย@Ayoub Nouriฉันตั้งค่า cancelsTouchesInView เป็น false และสิ่งนี้สามารถแก้ไขปัญหาได้ tapGestureRecognizer? .cancelsTouchesInView = false


0

สวิฟท์ 4.2

การปิดใช้งาน"Delay Touch Down"ในตัวตรวจสอบคุณสมบัติจะแก้ไขปัญหาได้
หลังจากนั้นการคลิกราบรื่นและไม่ได้เลือก SelectRowAt จะยิงทันที

ตัวตรวจสอบแอตทริบิวต์ของ XCode


0

สิ่งที่ใช้ได้ผลสำหรับฉันคือการเริ่มพิมพ์ "didSelect ... " แล้วปล่อยให้แก้ไขอัตโนมัติในส่วนที่เหลือ เห็นได้ชัดว่ารายละเอียดของไวยากรณ์ของฉันไม่ชัดเจน อย่างที่คนอื่น ๆ พูดใช้ IDE !!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.