2013-02-11 35 views
5

Tôi cần được thông báo khi kéo của UITableView kết thúc.Làm thế nào để phát hiện sự kiện kéo kết thúc của một UITableView?

Nhưng tôi đang làm việc trên danh mục của UITableView, vì vậy tôi không thể sử dụng scrollViewDidEndDragging:willDecelerate: để lưu trữ điều này.

tôi đã cố gắng sử dụng KVO để quan sát trên dragging Đường dẫn chính:

[self addObserver:self forKeyPath:@"dragging" options:NSKeyValueObservingOptionNew context:nil]; 

Nhưng observeValueForKeyPath:ofObject:change:context: không được gọi, vì UITableView.dragging không có và setter và tài sản này là không phù hợp với KVO.

Có phương pháp nào khác để lưu trữ mong đợi này khi sử dụng scrollViewDidEndDragging:willDecelerate: không?

Mọi trợ giúp đều biết ơn! Cảm ơn!

Trả lời

8

Chỉnh sửa: Giải pháp của tôi dưới đây là điều đầu tiên cần lưu ý và trở nên khá khó khăn và có thể không an toàn để sử dụng trong trường hợp Apple quyết định thay đổi nội bộ của lớp UIScrollView. Xem answer được đề xuất bởi Mazyod nên an toàn hơn và đơn giản hơn.


Đây là thực hiện phụ thuộc và có thể được thay đổi bởi Apple trong bản cập nhật iOS trong tương lai, nhưng hiện tại UIScrollView lớp dường như dựa vào recognizers cử chỉ để quản lý tương tác người dùng và UITableView là một lớp con của lớp xem di chuyển cũng làm như vậy .

Nếu bạn truy cập UIScrollView.h của khung công tác UIKit, bạn có thể nhận thấy một loại đá quý _pan đáng ngờ có loại id, nhưng có vẻ thực sự là UIPanGestureRecognizer.

Vì vậy, tôi đã thử điều này và có vẻ như nó hoạt động.

[_tableView addObserver: self 
       forKeyPath: @"pan.state" 
       options: NSKeyValueObservingOptionNew 
       context: nil]; 

Khi kéo xem bảng, state của nhận dạng cử chỉ thay đổi nhiều lần, và khi bạn ngừng kéo, state nhận thay đổi cuối cùng của nó với giá trị của UIGestureRecognizerStateEnded.

Xin lưu ý rằng mặc dù điều này dường như thực hiện thủ thuật, một số vấn đề khác có thể cản trở bạn. Nó thường không phải là một ý tưởng tốt để ghi đè lên phương thức lớp hiện có trong một thể loại kể từ khi thực hiện ban đầu trở thành không thể tiếp cận sau đó. Tài liệu trên giao thức NSKeyValueObserving không chính thức nêu rõ rằng

NSObject cung cấp khả năng giám sát tự động cho tất cả các đối tượng.

Vì vậy, nếu bạn ghi đè observeValueForKeyPath:ofObject:change:context: trong một thể loại, việc thực hiện mặc định sẽ không truy cập được (và chúng ta không thể chắc chắn rằng UITableView hoặc UIScrollView không sử dụng KVO cho một cái gì đó). Điều đó có thể gây ra một số lỗi không mong muốn.

+0

Làm thế nào nếu tôi triển khai 'observValueForKeyPath: ofObject: change: context:' trong một số lớp 'Foo' và danh mục UITableView giữ một thể hiện của Foo? – OpenThread

+0

Cảm ơn bạn đã trợ giúp! câu trả lời của bạn là vvvvvery có ích cho tôi! – OpenThread

+1

Triển khai 'observValueForKeyPath: ofObject: change: context:' trong một lớp Foo riêng biệt thực sự cần trợ giúp với vấn đề 'ghi đè phương thức hiện có trong một thể loại'. –

8

Câu trả lời của Egor Chiglintsev nhắc tôi rằng tôi có thể quan sát thuộc tính panGestureRecognizer đã được hiển thị trong UIScrollView. Nó sẽ an toàn hơn nhiều so với pan. Nhưng sau đó .. Tôi phát hiện ra tôi chỉ có thể thêm bản thân mình như là một mục tiêu!

[_scrollView.panGestureRecognizer addTarget:self action:@selector(gestureRecognizerUpdate:)]; 

Điều này phù hợp với tôi!

+1

Tôi đoán đó là cách thích hợp nên được thực hiện. Không biết tại sao những điều đầu tiên đến trong tâm trí của tôi thường là một số thời gian chạy hoặc hack liên quan đến KVO. Cảm ơn) –

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