2012-01-21 50 views
51

Tôi có một số UITableView làm tiểu sử của UIScrollVIew, là chế độ xem chính được kiểm soát bởi MainViewController của tôi.didSelectRowAtIndexPath: không được gọi là

Trong MainViewController.h

@interface MainViewController : UIViewController <UIGestureRecognizerDelegate, UITableViewDelegate, UITableViewDataSource> 

// other stuff here... 

@property (weak, nonatomic) IBOutlet UITableView *myTableView; 

Trong MainViewController.m

@synthesize myTableView; 

// other stuff here... 

- (void)viewDidLoad { 
    myTableView.delegate = self; 
    myTableView.datasource = self; 
} 

// other stuff here... 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { 
    [self performSegueWithIdentifier:@"listAttributesSegue" sender:self]; 
} 

Tôi biết rằng didSelectRowAtIndexPath không được gọi là bởi vì tôi đã đặt breakpoint trên cả hai phương pháp riêng của mình và các dòng mã bên trong nó, và không được gọi. Tôi cũng biết rằng các nguồn dữ liệu đang hoạt động chính xác bởi vì tôi có các chức năng khác mà sửa đổi các tế bào trong thời gian chạy và họ đang làm việc hoàn toàn tốt đẹp. Tôi đang sử dụng Xcode mới nhất với iOS 5.0 được thiết lập làm mục tiêu phát triển. Tôi đã tìm kiếm và tìm kiếm câu trả lời. Ai có ý tưởng gì không?

Chỉnh sửa: Tôi đã tìm thấy câu trả lời. Tôi đã đặt số UITapGestureRecognizer cho superView của myTableView. Điều này đã vượt qua cuộc gọi lựa chọn. Tín dụng cho bất cứ ai cho rằng đó có thể là nó. Câu trả lời của bạn đã bị xóa trước khi tôi có thể đánh dấu câu trả lời chính xác.

Chỉnh sửa 2: Rất nhiều người đã bình luận về điều này, vì vậy tôi mặc dù tôi sẽ chia sẻ nó. Nếu bạn gặp sự cố này, chỉ cần đặt myGestureRecognizer.cancelsTouchInView thành false và mọi thứ sẽ hoạt động tốt.

+0

Bạn đã thực hiện 'tableView: willSelectRowAtIndexPath:'? Có lẽ nó trở về nil do đó ngăn chặn 'didSelectRowAtIndexPath:' từ gọi? –

+0

vâng tôi cũng đã thử điều đó quá – Garrett

+0

Cảm ơn bạn đã quay trở lại với giải pháp của bạn. Tôi nghĩ sẽ tốt hơn nếu đặt bản chỉnh sửa làm câu trả lời. –

Trả lời

263

Tôi đã tìm thấy câu trả lời. Tôi đã có một bộ UITapGestureRecognizer cho superView của myTableView. Điều này đã vượt qua cuộc gọi lựa chọn. Tín dụng cho bất cứ ai cho rằng đó có thể là nó. Câu trả lời của bạn đã bị xóa trước khi tôi có thể đánh dấu câu trả lời chính xác.

Đặt thuộc tính cancelsTouchesInView thành NO trên trình nhận dạng cử chỉ để cho phép chế độ xem bảng chặn sự kiện.

+13

Đây là vấn đề đối với tôi, đồng nghiệp của tôi đã thêm UITapGestureRecognizer vào chế độ xem cận cảnh gốc để ăn các sự kiện nhấn của tôi. Tuy nhiên, điều gây hiểu lầm là các tế bào bảng sẽ vẫn nổi bật khi chúng được khai thác, vì vậy tôi không nghi ngờ bất cứ điều gì đã chặn đứng những sự kiện đó. – bugloaf

+14

Đây cũng là vấn đề đối với tôi. Hãy chắc chắn kiểm tra các thuộc tính cancelsTouchesInView của trình nhận dạng cử chỉ.Nếu nó là CÓ, thì nó ăn sự kiện này. –

+0

Cảm ơn bạn rất nhiều, thực sự đã cứu ngày của tôi. Đã không nhận ra rằng một UITapGestureRecognizer được thêm vào từ bảng phân cảnh sẽ ngăn không cho chức năng này được gọi! Thật kỳ lạ UITableViewCells nơi vẫn còn làm nổi bật trên Taps. – David

5

Bạn đã xác định biến mẫu cho tableview có cùng tên. Nếu không thì có thể là điều này có thể là vấn đề issue-

_myTableView.delegate = self; 
_myTableView.datasource = self; 

hay-

self.myTableView.delegate = self; 
self.myTableView.datasource = self; 
+0

tôi đã thử self.myTableView.delegate không thành công – Garrett

+1

Tuyệt vời! Tìm kiếm dài và rộng cho vấn đề này, và vấn đề là tôi đã không đặt: self.tableView.delegate = self; – hbruce

10

của bạn là trường hợp nhạy cảm. Mã của bạn:

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

nên

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

đó là một bắt tốt, nhưng sai lầm chỉ là một lỗi đánh máy trong khi sao chép mã của tôi vào câu hỏi, nó là ngay trong ứng dụng của tôi – Garrett

+0

Sự khác biệt giữa hai dòng mã là gì? –

+1

Chữ "i" trong "tableView" đầu tiên được viết hoa trong phiên bản đầu tiên (sai). –

7

Có lẽ đó là một lỗi đánh máy sau khi tất cả. Kiểm tra chức năng của bạn không phải là didDeselectRowAtIndexPath: (de chọn thay vì chọn).

+0

Tôi đọc mã của tôi 20 hai mươi lần so sánh nó với văn bản của cuốn sách và vẫn không nhận thấy tôi đã có 'De'select! –

+0

Khi dựa vào hoàn thành mã sai, chỉ cần dành một giờ cho việc này, cảm ơn vì đã tiết kiệm cho tôi nhiều hơn nữa. –

1

Xin lỗi, chưa có đủ điểm để thêm ý kiến ​​- câu trả lời Garret là tuyệt vời nhưng tôi sẽ thêm:

Bạn vẫn có thể có nhận dạng cử chỉ của bạn, nhưng bạn sẽ cần phải thiết lập 'Dừng chạm trong quan điểm' để NO - sau đó các cử chỉ sẽ được chuyển sang chế độ xem và UITableView của bạn sẽ hoạt động tốt.Sau khi thử nhiều, nhiều cách tiếp cận này dường như là cách làm đúng: một công cụ nhận dạng cử chỉ với 'hủy chạm trong chế độ xem' giống như có một lớp vô hình trên mọi thứ nắm lấy tất cả các sự kiện và định tuyến chúng để bộ điều khiển xem (proxy). Bộ điều khiển xem sau đó nhìn vào cử chỉ để xem nó có một ràng buộc hành động (nút vv) và sẽ định tuyến những thứ đó và bất kỳ phần còn lại nào sẽ chỉ đi đến trình xử lý cử chỉ. Khi sử dụng một UITableView nó đang mong đợi để nhận được vòi nước nhưng bộ điều khiển xem snaffles nó khi bạn có 'Hủy chạm vào xem'.

0

Tôi đã có vấn đề này trong một thời gian, và tôi không thấy bất kỳ tham chiếu đến nó ở đây, vì vậy để tham khảo, một lý do cho điều này có thể là:

tableView.editing = YES; 

nhưng

tableView.allowsSelectionDuringEditing = NO; 

Theo tài liệu cho

- tableView:didSelectRowAtIndexPath: 

phương pháp này không phải là được gọi khi thuộc tính chỉnh sửa của bảng được đặt thành CÓ (nghĩa là, chế độ xem bảng đang ở chế độ chỉnh sửa). Xem "Quản lý lựa chọn" trong Hướng dẫn lập trình bảng xem cho iOS để biết thêm thông tin (và các ví dụ mã) liên quan đến phương pháp này.

5

giải pháp của tôi là:

  1. thiết cancelsTouchesInView Để No của bất kỳ tapGesture

  2. tôi tìm thấy trong tế bào tùy chỉnh của tôi, userInteractionEnable được thiết lập để NO, chỉ cần xóa userInteractionEnable = No và vấn đề giải quyết.

0

Một tế bào có thể được lựa chọn bởi người sử dụng (khai thác trên hàng), bằng cách gọi "tableView.selectRowAtIndexPath (..)" hoặc "cell.setSelected (true, ...).

  • Nếu các tế bào được chọn bằng cách gọi "cell.setSelected (true)", người dùng không thể bỏ chọn các tế bào nữa.

  • Nếu các tế bào được chọn bằng cách gọi "tableView.selectRowAtIndexPath()", các người dùng có thể bỏ chọn ô là dự kiến.

3

Hủy chế độ xem khác chạm ngoại trừ chế độ xem được yêu cầu.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch { 
    if (touch.view == your view) { 
     return YES; 
    } 
    return NO; 
} 
7

Cập nhật cho Swift 3:

nếu bạn đang sử dụng UITapGestureRecognizer trong mã của bạn: - # Swift 3 sử dụng bên dưới dòng mã:

extension YourViewController{ 
    func hideKeyboardWhenTappedAround() { 
     let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.dismissKeyboard)) 
     view.addGestureRecognizer(tap) 
     tap.cancelsTouchesInView = false 
    } 

    func dismissKeyboard() { 
     view.endEditing(true) 
    } 
} 

Cách gọi: - Trong viewDidLoad()

self.hideKeyboardWhenTappedAround() 
1

trường hợp của tôi là lạ. TableView của tôi có 2 phần. Các ô của phần đầu tiên hoạt động tốt khoảng tableView:didSelectRowAt:, nhưng các ô của phần thứ hai không kích hoạt didSelectRowAt:.

Sự cố trên xảy ra tại iPhone 4s, iOS 9.3. Nhưng trong iPhone 5s, iOS 10.3, không có vấn đề gì, những tế bào này hoạt động tốt. Có vẻ như iOS 9 lỗi về số UITableView.

Sau nhiều lần kiểm tra, tôi phát hiện ra một mã dòng sản xuất lỗi này.

tableView.estimatedSectionHeaderHeight = 60.0 

Vì phần 2 không có chế độ xem tiêu đề. Tôi loại bỏ dòng này, và tất cả các công trình tốt.

0

Tôi đã bị lỗi liên tục do didSelectRowAtIndexPath: đang được gọi trên báo chí ô tùy chỉnh của tôi.

tôi phát hiện ra rằng nếu tôi dừng lại gọi [tableView reloadData] rất thường xuyên (10 Hz), và thay đổi nó để cập nhật mỗi 2 giây, hầu hết các báo chí sẽ gọi thành công didSelectRowAtIndexPath:

Nó có vẻ như tải lại các khối xem máy ép.

Các vấn đề liên quan