2012-02-27 34 views
7

Tôi có ứng dụng MonoTouch iPhone có UITableViewController làm bộ điều khiển chế độ xem chính.MonoTouch - Phát hiện cuộn UITableView

Tôi cố gắng để phát hiện khi tableview đang được cuộn với mã:

this.TableView.Scrolled += TableViewScrolled; 

nơi TableViewScrolled(object sender, EventArgs e) { } là phương pháp của tôi được gọi. Nhưng không thể gọi số TableViewScrolled() vì một số lý do.

Có ai có kinh nghiệm với điều này không?

Trả lời

6

@ bình luận Krumelur của trên câu trả lời trước đó làm cho một điểm rất tốt và IMO nên có được một câu trả lời (không phải là một bình luận).

Vấn đề là nếu bạn đặt Delegate (hoặc WeakDelegate) thành UITableView thì sự kiện đó sẽ không hoạt động nữa.

Tại sao? vì để triển khai các sự kiện đó, MonoTouch tạo loại đại biểu nội bộ riêng cho UIScrollView (phụ huynh của UITableView), nơi ghi đè các phương thức (của đại biểu) và phơi bày chúng càng nhiều, tự nhiên (in .NET), sự kiện bên trong loại .

Điều này có nghĩa là bạn không thể kết hợp những sự kiện UITableView này với loại đại biểu của riêng bạn UITableViewDelegate (vì sau này sẽ ghi đè tên cũ).

3

đọc tài liệu này: UIScrollViewDelegate

Bạn có thể sử dụng:

- (void) scrollViewDidScroll:(UIScrollView *)scrollView { 


} 

hoặc

- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView { 


} 

Chúc may mắn, Nathan

+1

Đó là các phương pháp được ánh xạ trong MonoTouch tới UITableView.Scrolled; Lý do tại sao tôi đã suy nghĩ this.TableView.Scrolled + = TableViewScrolled; nên làm các trick. Nhưng không đi. :-) – Brett

+3

Bạn có đang sử dụng đại biểu không? Nếu bạn làm thế, các cuộc gọi lại không hoạt động. Nếu bạn sử dụng các cuộc gọi lại, đại biểu không hoạt động. Đó là một trong hai hoặc. – Krumelur

+1

@Nathan Đây là câu hỏi về Xamarin, nơi nó được gọi là Scrolled(). –

13

câu trả lời của tôi là không thực sự chỉ về di chuyển, nhưng vì thực tế là tôi đã dành khá một giờ chiến đấu với một vấn đề gây ra bởi sự kiện di chuyển, tôi đã quyết định viết thư trả lời ở đây.

Vì vậy, vấn đề đối với tôi là sau khi đăng ký:

this.myTableView.Scrolled += (sender, args) => 
    { 
     ... 
    }; 

phương pháp overriden của tôi kế thừa từ lớp UITableViewDataSource:

public override UIView GetViewForHeader(UITableView tableView, int section) 
    public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath) 

ngừng làm việc (trở nên không được gọi). Đó là ... rõ ràng, khá bất ngờ!

Vì vậy, tôi chỉ phải ghi đè

public override void Scrolled(UIScrollView scrollView) 

trong cùng một đại biểu nguồn dữ liệu thay vì đăng ký để existent sự kiện trên xem bảng.

Tôi hy vọng, một người nào đó sẽ không gặp rắc rối như vậy!

+0

Cảm ơn lời khuyên của bạn! – DeeRain

+0

Hi Tôi đã cùng một loại vấn đề với một DialogViewController (từ Monotouch MTD). Trong trường hợp của tôi, ngay sau khi tôi bắt đầu xử lý sự kiện được cuộn, tất cả sự kiện được nhấn vào các ô của tôi đều ngừng hoạt động. Do UITableViewDataSource được tạo động bởi khung công tác, bạn có biết cách tôi có thể ghi đè phương thức được cuộn thay vì xử lý sự kiện hay không. –

+0

Điều gì về việc triển khai (ghi đè) nguồn dữ liệu của riêng bạn? Một tùy chọn khác là xử lý (nếu cần) tất cả các sự kiện trực tiếp từ lớp Window. – Agat

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