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.
Nguồn
2013-02-11 17:44:18
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
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
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'. –