Kéo để làm mới UITableView mà không cần UITableViewCont kiểm


180

Tôi đang cố gắng thực hiện tính năng kéo để làm mới trong UITableView trong UIViewControll. Tôi không thể sử dụng UITableViewContaptor vì tôi muốn UITableView là một khung nhìn nhỏ hơn trong bộ điều khiển khung nhìn, với một số thứ khác ở trên nó. Tôi cho rằng điều này là có thể, nhưng có ai thấy việc thực hiện nó không?

Câu trả lời:


465

Thêm điều khiển làm mới trực tiếp vào một UITableViewmà không sử dụng UITableViewController:

override func viewDidLoad() {
    super.viewDidLoad()
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)

    if #available(iOS 10.0, *) {
        tableView.refreshControl = refreshControl
    } else {
        tableView.backgroundView = refreshControl
    }
}

@objc func refresh(_ refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}

1
Tuyệt vời và dễ dàng. Nó hoạt động với tôi khi tôi dùng thử trên chế độ xem bảng được thêm vào UIViewControll trên iOS 7.0.4.
thandasoru

5
có ai gặp vấn đề trong đó bản thân điều khiển không hiển thị nhưng mặt khác dường như hoạt động tốt?
sửa đổi

16
Chế độ xem bảng dường như nhảy xuống bất ngờ khi "nhấp chuột". Không chắc tại sao.
Bob Spryn

3
Tôi thấy rằng nó cần phải có trong viewdidappear, không chắc đó có phải là tính năng của iOS 7 hay không - Tôi vẫn chưa thử nghiệm nó trong iOS 8 ...
Jack Solomon

4
RefreshControl xuất hiện trên đầu bảngView. Tôi đã sửa lỗi này bằng cách: tableView.insertSubview(refreshControl, atIndex: 0)thay vìtableView.addSubview(refreshControl)
kbpontius

12

Mục tiêu-C :

Đây là cách bạn có thể thực hiện kéo để làm mới cho chế độ xem bảng. Tương tự như trong trường hợp xem bộ sưu tập. Chỉ cần thay thế bảng phân bổ xem với bộ sưu tập xem.

UITableView *tableViewDemo  =  [[UITableView alloc]init];
tableViewDemo.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
tableViewDemo.dataSource =  self;
tableViewDemo.delegate =  self;
[self.view addSubView: tableViewDemo];

UIRefreshControl *refreshController = [[UIRefreshControl alloc] init];
[refreshController addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[tableViewDemo addSubview:refreshController];

#pragma mark - Handle Refresh Method

-(void)handleRefresh : (id)sender
{
   NSLog (@"Pull To Refresh Method Called");
   [refreshController endRefreshing];
}

Làm thế nào để phiên bản obj-c chỉ có 9 upvote khi phiên bản swift có> 430?
Chase Roberts

1
@ChaseRoberts, Cái đó đã được trả lời vào ngày 13 tháng 2, hãy xem lịch sử chỉnh sửa, ban đầu nó là trong object-c, Vì tại thời điểm đó, swift là mới, mọi người đều tìm kiếm phiên bản nhanh chóng ... stackoverflow.com/posts / 15010646 / phiên bản
Irfan

4

Giải pháp này từ @berik hoạt động tốt nhưng UIControll được hiển thị trên đầu trang của UITableViewControll. Cách khắc phục là thực hiện thay đổi này:

override func viewDidLoad() {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
    tableView.backgroundView = refreshControl // <- THIS!!!
}

func refresh(refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}

3
RefreshControl xuất hiện trên đầu bảngView cho tôi, nhưng đề xuất của bạn làm cho tôi refreshControlbiến mất, không xuất hiện bên dưới tableView. Tôi đã sửa lỗi này bằng cách: tableView.insertSubview (refreshControl, at Index: 0) thay vì tableView.addSubview (refreshControl)
kbpontius

3

Tôi đã triển khai EGORefreshTableHeaderView với UIViewControll và chế độ xem bảng đơn giản, mẹo ở đây là ở vị trí mà EGO lấy chế độ xem cuộn làm tham số, nếu bạn xem chính chế độ xem bảng sẽ kế thừa từ chế độ xem cuộn.

Nó chỉ yêu cầu điều đó và một vài kết nối bổ sung :)

Hi vọng điêu nay co ich.


-1

Có vẻ như nếu bạn tạo UIRefreshControl bên trong phương thức loadView của viewContoder thì mọi thứ đều hoạt động tốt. UIRefreshControl hoạt động như bình thường. Đã thử nghiệm với iOS 7.1 và iOS 8.2


-1

Tôi đã kết thúc bằng cách sử dụng ODRefreshControl . Nó không cần bất kỳ bản hack nào như trên tableView.backgroundView = refreshControl, hoạt động gần giống như vậy và mang lại giao diện người dùng đẹp hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.