UITableView didSelectRowAtIndexPath: không được gọi trong lần nhấn đầu tiên


352

Tôi đang có một vấn đề với UITableView's didSelectRowAtIndexPath.

Bảng của tôi được thiết lập để khi tôi chọn hàng, nó sẽ khởi chạy một trình điều khiển khung nhìn mới và đẩy nó.

Lần đầu tiên tôi nhấn vào bất kỳ hàng nào trong bảng, phương thức không được gọi. Khi tôi chọn một hàng khác, nó bắt đầu hoạt động như bình thường.

Tôi đã xác minh điều này bằng cách đặt một điểm dừng trên didSelectRowAtIndexPath. Khi thêm một NSLogphương thức tôi thấy rằng khi tôi chọn hàng thứ hai cuối cùng đẩy bộ điều khiển khung nhìn mới, tôi thấy hai câu lệnh log xuất hiện trong bảng điều khiển cùng một lúc.

Bất kỳ đề xuất?


2
Bạn có thể gửi mã của bạn cho tableView:didSelectRowAtIndexPath:?
gerry3

Tôi đã có cùng một vấn đề, kiểm tra câu trả lời của tôi: stackoverflow.com/a/44097559/1600061
Zsivics Sanel

1
Công văn trong hàng đợi chính đã giải quyết vấn đề stackoverflow.com/questions/20149167/
durgeshtrivedi

Câu trả lời:


1356

Bất kỳ cơ hội nào bạn vô tình gõ vào De selectRowAtIndexPath?


17
@Dschee nó không được gọi trong lần nhấn đầu tiên vì bạn không bỏ chọn bất cứ điều gì. Khi bạn đã chọn một hàng, khi bạn cố gắng chọn một hàng thứ hai, hàng đầu tiên sẽ được bỏ chọn.
chàng

19
Đó là lý do tại sao tôi yêu
elbuild 20/03/2015

4
Tôi ủng hộ điều này không phải vì tôi đã phạm sai lầm này một lần. Tôi ủng hộ vì tôi đã phạm sai lầm này không dưới 4 lần chỉ trong nhiều năm, tốn rất nhiều thời gian.
Brooks Hanes

8
CHÚA ƠI!! Đây có thể là lỗi tồi tệ nhất mà tôi đã giới thiệu trong mã của mình.
Chaianu Paul

4
Ôi. Tiết kiệm cho tôi rất nhiều thời gian.
MortalMan

24

Đồng thời kiểm tra thuộc tính lựa chọn của chế độ xem bảng của bạn trong tệp xib. Sử dụng 'Một lựa chọn' hoặc 'Nhiều lựa chọn' theo yêu cầu.


2
Ba ha ha ha! Wow tôi đã dành 4 giờ cố gắng để tìm ra điều này. @includeMe để giải cứu (chào)! Cảm ơn!

17

Tôi gặp vấn đề sau:

  • lần đầu tiên chạm vào hàng -> không có hiệu lực, không có lựa chọn, không bao giờ
  • chạm thứ hai và theo dõi -> hành vi lựa chọn chính xác, luôn luôn

Trong trường hợp của tôi, lỗi của tôi là kiểm tra Show Selection on Touchtrong Trình tạo giao diện. Bạn có thể bỏ chọn nó trong IB tại đây:

nhập mô tả hình ảnh ở đây

Mong rằng sẽ giúp được ai đó


Bạn là người hùng của tôi! Bất cứ ý tưởng tại sao đây là mặc định? Tôi không thể nghĩ ra ứng dụng nào có hành vi đó và tôi nghĩ đây là một mặc định rất kỳ lạ.
Barshe Fondacci

12

Kiểm tra Nếu bạn đã đặt bất kỳ trình nhận dạng cử chỉ nào trong lớp của mình. Loại bỏ cử chỉ làm việc cho tôi.


Tôi có cả hai; Trình nhận dạng cử chỉ và didSelectRowAtIndexPath? Tuy nhiên, luôn luôn nhận dạng cử chỉ được ưu tiên. Không thể đến cái thứ hai. Có cách nào để xử lý cả hai hay tôi phải thoát khỏi nhận dạng cử chỉ? Cảm ơn!
Ron

cái này phải ở trên đỉnh :) nó làm tôi mất 1 giờ sau 7 năm phát triển iOS.
Chú hề

6

Tôi đã tranh luận thậm chí đăng câu trả lời này bởi vì tôi nghĩ rằng các ngôi sao sắp xếp theo thứ tự để nó tự thể hiện.

Tôi đang có một biến thể của vấn đề này và đã kiểm tra các giải pháp khác. Trên chế độ xem bảng của tôi, nó không xử lý hàng cuối cùng của bảng trong lần nhấn đầu tiên. Nó làm nổi bật nó, nhưng didSelectRowAtIndexPathkhông được gọi. Tất cả các hàng khác hoạt động tốt. Nhưng nếu tôi bật tính năng bật bảng xem thì nó có vẻ giải quyết được vấn đề (nhưng sau đó bạn phải xử lý một lần thoát bảng xem).


Bạn đã tìm thấy lý do tại sao điều này đang xảy ra? Tôi có chính xác cùng một vấn đề. Khi tôi tắt bàn nảy, thì hàng đầu tiên / cuối cùng trong bảng không phản ứng ở lần chạm đầu tiên. Tôi nghĩ đó là lỗi nhưng đã hơn một năm và nó vẫn xảy ra.
filip.kara

Không. Tôi chỉ bật nút bật lên và để nó ở đó.
Chase Roberts

Tôi chỉ gặp sự cố này trên iPhone 5 (iOS 10.3) - bật BẬT trên chế độ xem bảng của tôi đã khắc phục sự cố. Rất kỳ quặc!
Lee Probert

4

UITableViewCellSelectionStyleNone đã được đặt cho ô hiển thị vấn đề đó (ios9).

Tôi đã kết thúc cuộc gọi

[tableView deselectRowAtIndexPath:indexPath animated:NO];

điều đầu tiên trong

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

Điều này không giống nhau, nhưng là đủ tốt. làm cho tôi tự hỏi những gì loại vỡ bảng ios10 mang lại.


Điều này làm việc cho tôi nhưng tôi cần một cách giải quyết để ẩn lựa chọn mà không tạo kiểu cho nó. Tôi đã ghi đè setSelectednhưng trong khi người dùng đang giữ ô, lựa chọn xuất hiện không được chấp nhận
MMujtabaRoohani

1

Chuyển 2

Hãy chắc chắn rằng bạn có bộ này thành đúng:

self.tableView.allowsSelection = true

Đặt cái này ở trên bên phải của bạn sau viewDidLoad()và trướcsuper.viewDidLoad()


1

Chuyển 3

Nếu bạn đang làm việc với Swift 3 trong một lớp không phải là UITableViewControllervà bạn đang sử dụng UITableViewDelegate, thì bạn có thể cần phải sử dụng tiêu đề phương thức:

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

Điều này làm việc cho tôi, mặc dù tôi mới chuyển dự án của mình sang Swift 3. Nó khá mới nên điều này có thể được khắc phục sau này.


1

Nếu bạn đã đặt bất kỳ UITapGestureRecognizer nào trong lớp của mình, bạn có thể thêm dòng này vào didSelectRowAtIndexPath:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

Điều này làm việc cho tôi.


1

vấn đề này cũng xảy ra khi bạn đang làm việc với trình nhận dạng cử chỉ trong bảng Xem trong trường hợp này bạn không cần xóa chúng, bạn chỉ cần đảm bảo rằng thuộc tính cử chỉ của bạn cancelsTouchesInView = falseđây là giá trị boolean ảnh hưởng đến việc chạm có được đưa đến chế độ xem không một cử chỉ được công nhận.


0

Chuyển 3

Không có câu trả lời nào khác có tác dụng trong trường hợp của tôi, điều đã khắc phục nó cho tôi là:

tableView.delaysContentTouches = false


0

didSelectRowAtchức năng không được gọi trong ứng dụng của tôi trong lần chạm đầu tiên hoặc lần thứ hai ... Tôi đang cố gắng giải quyết vấn đề không thể tìm thấy bất kỳ giải pháp nào. Nhưng đột nhiên tôi nhận ra, tôi đang sử dụng Delegatephương pháp thay đổi màu sắc của view.animation ... không được gọi trong khi hoạt ảnh vẫn tồn tại


0

Trong trường hợp của tôi, tôi đã có một tiêu đề phần UITableView với một trình nhận dạng cử chỉ. Khi tiêu đề được gõ, nó sẽ chèn một vài hàng vào phần đó và làm động phần chèn (như phần mở rộng / thu gọn). Lần đầu tiên khi được mở rộng và khai thác, phương thức ủy nhiệm didSelectRow không được kích hoạt. Đối với các thao tác vòi và mở rộng / thu gọn hơn nữa, nó đã hoạt động như mong đợi.

Mỗi câu trả lời của @Ayoub Nouri tôi đặt cancelsTouchesInView thành false và điều này đã giải quyết vấn đề. tapGestureRecognizer? .cancelsTouchesInView = false


0

Swift 4.2

Vô hiệu hóa "Delay Touch Down" trong trình kiểm tra thuộc tính đã giải quyết vấn đề.
Sau đó, các nhấp chuột được thực hiện trơn tru và didSelectRowAt kích hoạt ngay lập tức.

Trình kiểm tra thuộc tính XCode


0

Điều làm việc cho tôi là bắt đầu gõ "didSelect ..." và sau đó để tự động điền vào phần còn lại. Rõ ràng một số chi tiết về cú pháp của tôi là rất khó khăn. Như những người khác đã nói, Sử dụng IDE !!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.