2013-03-23 33 views
21

Trình nghe thời gian dài, người gọi lần đầu tiên ở đây trên tràn ngăn xếp. Hãy nhẹ nhàng.UIRefreshControl - Làm cách nào để thực hiện hành động làm mới sau khi chạm được phát hành?

Tôi đang triển khai UIRefreshControl trên UITableView để làm mới dữ liệu của bảng. Trên các triển khai pull-to-refresh khác, quá trình làm mới không bắt đầu cho đến khi ngón tay của người dùng được nhấc lên trong khoảng cách làm mới của kéo. UIRefreshControl không ngay lập tức có vẻ như nó có tùy biến này.

UIRefreshControl My mã init:

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 
[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged]; 
[self.tableView addSubview:refreshControl]; 

refresh của tôi: Mã là khá cơ bản:

-(void)refresh:(id)sender { 
(... refresh code ...) 
[sender endRefreshing]; 
} 

Làm thế nào tôi có thể trì hoãn việc làm mới: chức năng đến khi người dùng loại bỏ ngón tay của họ từ kéo?

Trả lời

25

Tôi cũng bị mắc kẹt với cùng một vấn đề. Tôi không nghĩ rằng cách tiếp cận của tôi là rất tốt đẹp, nhưng có vẻ như nó hoạt động.

  1. Init UIRefreshControl

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 
    self.refreshControl = refreshControl; 
    
  2. Kiểm tra tình trạng UIRefreshControl khi người dùng kết thúc kéo bảng (UITableViewDelegate phù hợp với UIScrollViewDelegate)

    - (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView 
    {  
        if(self.refreshControl.isRefreshing) 
         [self refresh]; 
    } 
    
  3. Cập nhật bảng

    - (void)refresh 
    { 
        [self.refreshControl endRefreshing]; 
    
        // TODO: Update here your items 
    
        [self.tableView reloadData]; 
    } 
    

Hy vọng nó sẽ giúp bạn.

+1

Giải pháp này hoạt động nếu người dùng từ từ kéo và kéo. Nếu nó gần giống như một bộ phim, bánh xe tải sẽ chạy nhưng chức năng refresh: sẽ không được gọi cho đến khi bảng được di chuyển lần nữa. chỉnh sửa: Tôi đã thay đổi hàm thành scrollViewDidEndDecelerating: và nó có vẻ hoạt động tốt ngay bây giờ. Cảm ơn! – outphase

+0

Có, bạn hoàn toàn đúng! Bây giờ nó hoạt động tốt hơn nhiều, nhờ chỉnh sửa mã của tôi!) – Ned

+1

Có một vấn đề nhỏ với điều này. Nếu bạn kéo bàn xem xuống đủ để làm mới, hãy giữ ngón tay của bạn xuống, quay trở lại nơi spinner là khoảng một nửa có thể nhìn thấy, sau đó cho đi ... nó sẽ hiển thị quay quay và không có gì sẽ xảy ra. –

18

UIRefreshControl đã có chỗ ở để bắt đầu vào thời điểm "đúng". Hành vi chính xác cho điều khiển kéo để làm mới là bắt đầu làm mới sau khi người dùng đã vượt qua một số ngưỡng "đủ xa", không phải khi người dùng đã phát hành kéo của họ.

Để thực hiện điều này, bạn cần phải sửa đổi phương pháp -refresh: của bạn để kiểm tra khi kiểm soát đã chuyển vào refreshing nhà nước:

-(void)refresh:(id)sender { 
    UIRefreshControl *refreshControl = (UIRefreshControl *)sender; 
    if(refreshControl.refreshing) { 
     (... refresh code ...) 
    } 
} 

Lưu ý rằng bất kỳ phương pháp nào bạn gọi cho (... refresh code ...) của bạn nên được đồng bộ, để giao diện người dùng của bạn không bị đóng băng. Bạn nên thay đổi để đợi chính và gọi -endRefreshing vào cuối (... refresh code ...) khối của bạn, thay vì vào cuối -refresh::

- (void)refresh:(id)sender { 
    __weak UIRefreshControl *refreshControl = (UIRefreshControl *)sender; 
    if(refreshControl.refreshing) { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      /* (... refresh code ...) */ 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       [refreshControl endRefreshing]; 
       //reload the table here, too 
      }); 
     }); 
    } 
} 

Thay đổi sự kiện điều khiển để UIControlEventTouchUpInside sẽ không làm việc vì UIRefreshControl không phải là một giao diện người dùng thành phần dự định được tương tác trực tiếp với. Người dùng sẽ không bao giờ chạm vào số UIRefreshControl, vì vậy không thể kích hoạt sự kiện UIControlEventTouchUpInside.

+2

Đây thực sự là câu trả lời đúng! –

+0

nó không hoạt động. phương thức làm mới chỉ được gọi một lần, trước khi người dùng nhấc ngón tay của mình lên (thử nghiệm với ios 10.2) – user1105951

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