2012-07-10 42 views
7

Tôi có một ứng dụng, trong đó tôi có một UITableView bên trong một UIView, mà là một lần nữa bên trong một UIScrollView, vì vậy hệ thống phân cấp trở nên như thế này:Tại sao UITableView gọi các phương thức ủy nhiệm của UIScrollView?

UIScrollView ->UIView ->UITableView

Các dữ liệu bên trong của tôi UITableView được điền đầy đủ.

Bây giờ, vấn đề của tôi là, Khi tôi cuộn UITableView, phương thức ủy quyền UIScrollView's ủy quyền scrollViewDidEndDecelerating:scrollViewDidEndDragging:: được gọi.

Tôi không muốn hành vi này, tôi nên làm gì để ngăn chặn hành vi này?

Bất kỳ ai vui lòng trợ giúp, Cảm ơn trước !!!

+0

Nếu tôi hiểu bạn chính xác, bạn có 2 chế độ xem cuộn khi UITable đã nằm trên chế độ xem cuộn. Điều này có thể gây ra sự cố. – geminiCoder

+0

Không, tôi đã giữ [parentScroll setScrollEnabled: NO] ... Vì vậy, đó không phải là vấn đề ... –

+0

OK Trong trường hợp đó tôi thấy lý do tại sao điều này sẽ gây nhầm lẫn, hãy để tôi có một suy nghĩ – geminiCoder

Trả lời

8

UITableViewDelegate mở rộng UIScrollViewDelegate. Do đó việc gọi các phương thức đại biểu.

Để ngăn chặn điều này bạn có thể đặt tableView.tag = 1000; khi bạn alloc tableView và trong các phương pháp UIScrollViewDelegate (scrollViewDidEndDecelerating: and scrollViewDidEndDragging::) thêm này vào lúc bắt đầu rất:

if(scrollView.tag == 1000) 
    return; 
+1

... hoặc giữ con trỏ đến chế độ xem bảng dưới dạng ivar và so sánh với điều đó. –

+0

đúng. Tôi sử dụng thẻ để giảm thiểu việc sử dụng con trỏ. Không phải là tôi sợ chúng, nhưng IMO sử dụng autorelease và các thẻ làm cho mã ít dễ bị rò rỉ bộ nhớ hơn. – George

+0

Tôi sử dụng con trỏ vì lo sợ không hợp lý rằng các thẻ có thể không hoạt động độc đáo! Dumb trong trường hợp này, tôi biết ... –

3

Vì UITableView thừa hưởng từ UIScrollView. Vì vậy, nó cho thấy tất cả các thuộc tính và hành vi của UIScrollView. Nếu bạn không muốn điều này thì hãy làm một điều.

Giả sử bạn có một chế độ xem cuộn khác trong trang của mình.

trong viewDidLoad hoặc từ XIB (nếu bạn có tableview trong XIB), hãy đặt thẻ cho chế độ xem bảng của bạn.

trong mã,

self.objYourTableView.tag = 101; 

sau đó trong giao diện cuộn đại biểu

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 
    { 
     if(!(scrollView.tag == 101)) 
     { 
      // Go for your code to run. 
     } 
    } 

Vì vậy mà mã của bạn sẽ bỏ qua nếu nó gọi bằng độ xem bảng. Các trường hợp khác nó hoạt động hoàn hảo. Hy vọng điều này sẽ giúp bạn.

+1

'Bởi vì UITableView kế thừa từ UIScrollView'. Không. Đó là vì 'Vì UITableViewDelegate kế thừa từ UIScrollViewDelegate'. – George

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