Làm cách nào để sử dụng pull để làm mới trong Swift?


247

Tôi đang xây dựng một trình đọc RSS bằng cách sử dụng swift và cần triển khai pull để tải lại chức năng.

Đây là cách tôi đang cố gắng để làm điều đó.

class FirstViewController: UIViewController,
    UITableViewDelegate, UITableViewDataSource {

   @IBOutlet var refresh: UIScreenEdgePanGestureRecognizer
   @IBOutlet var newsCollect: UITableView

   var activityIndicator:UIActivityIndicatorView? = nil

   override func viewDidLoad() {
       super.viewDidLoad()
       self.newsCollect.scrollEnabled = true
      // Do any additional setup after loading the view, typically from a nib.

      if nCollect.news.count <= 2{
          self.collectNews()
       }
      else{
          self.removeActivityIndicator()
       }
      view.addGestureRecognizer(refresh)
   }



@IBAction func reload(sender: UIScreenEdgePanGestureRecognizer) {
    nCollect.news = News[]()
    return newsCollect.reloadData()
}

Tôi đang nhận được:

Thuộc tính 'self.refresh' không được khởi tạo tại cuộc gọi super.init

Xin hãy giúp tôi hiểu hành vi của người nhận biết cử chỉ. Một mã mẫu làm việc sẽ là một trợ giúp tuyệt vời.

Cảm ơn.


Bạn muốn kéo để làm mới trong chế độ xem bảng một số thứ như techrepublic.com/blog/software-engineer/ mẹo
Anil Varghese

Vâng, tôi chỉ cần chức năng này nhưng tôi không có manh mối về ObjC. Muốn thực hiện nhanh chóng.
xrage

Câu trả lời:


590

Kéo để làm mới được xây dựng trong iOS. Bạn có thể làm điều này nhanh chóng như

var refreshControl = UIRefreshControl()

override func viewDidLoad() {
   super.viewDidLoad()

   refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
   refreshControl.addTarget(self, action: #selector(self.refresh(_:)), for: .valueChanged)
   tableView.addSubview(refreshControl) // not required when using UITableViewController
}

@objc func refresh(_ sender: AnyObject) {
   // Code to refresh table view  
}

Tại một số điểm bạn có thể kết thúc làm mới.

refreshControl.endRefreshing()

15
Cảm ơn! Tôi đã sử dụng này. Chỉ cần một số điều chỉnh, cho tải lười biếng. Tôi sẽ làm: "lazy var refreshControl = UIRefreshControl ()" Tôi thấy đó là cách thực hành tốt để tránh buộc phải hủy bỏ các biến, vì cảm giác như nó đánh bại sự an toàn của ngôn ngữ.
nmdias

10
Chỉ cần một ghi chú nhanh, bạn thậm chí không cần thêm refreshControl vào chế độ xem bảng. Điều đó được xử lý ngầm.
Kendrick Ledet

1
@KendrickLedet ngay cả khi bạn không sử dụng UITableViewControll?
Văn Du Trần

3
Làm thế nào tôi có thể sử dụng giải pháp này cho đầu bảng và ở dưới cùng?
AustinT

3
Cập nhật Swift 4: refreshControl.addTarget (tự, hành động: "refresh:", cho: .valueChanged)
akseli

148

Một giải pháp với bảng phân cảnh và nhanh chóng ...

1.) Mở tệp .storyboard của bạn, chọn TableViewContaptor trong bảng phân cảnh của bạn và "Kích hoạt" Trình điều khiển xem bảng - Tính năng làm mới trong Tiện ích.

nhập mô tả hình ảnh ở đây

2.) Mở UITableViewControll-Class được liên kết và thêm dòng sau vào viewDidLoad-Phương thức.

self.refreshControl?.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)

Đã chỉnh sửa cho Swift 5.0:

self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)

HOẶC trong Swift 2.2:

self.refreshControl?.addTarget(self, action: #selector(TestTableViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)

3.) Thêm Phương thức sau phía trên viewDidLoad-Phương thức

func refresh(sender:AnyObject)
{
    // Updating your data here...

    self.tableView.reloadData()
    self.refreshControl?.endRefreshing()
}

7
đồng thời, bạn có thể thêm hành động làm mới với bảng phân cảnh bằng cách kéo điều khiển từ Điều khiển làm mới trong bảng phân cảnh vào ViewContoder của bạn
uiureo

Nếu dữ liệu tải của tôi là không đồng bộ, nên tôi put self.tableView.reloadData()self.refreshControl?.endRefreshing()trong gọi lại?
Qian Chen

Chính xác! Và đặt reloadData()hàng đợi chính để làm mới giao diện người dùng của bạn ngay lập tức: dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });
Trống

1
Cách này được ưa thích hơn câu trả lời được chấp nhận vì lý do là không có lỗi bố cục (ít nhất là đối với tôi sử dụng swift 2+)
Ryan Walton

1
Câu trả lời này nên có nhiều phiếu bầu nhất và là câu trả lời đúng
krummens

75

Tôi muốn đề cập đến một tính năng PRETTY COOL đã được đưa vào kể từ iOS 10, đó là:

Hiện tại, UIRefreshControl được hỗ trợ trực tiếp trong mỗi UICollectionView, UITableViewUIScrollView!

Mỗi một trong các khung nhìn này có thuộc tính cá thể refreshControl , điều đó có nghĩa là không còn cần phải thêm nó dưới dạng một khung nhìn phụ trong chế độ xem cuộn của bạn , tất cả những gì bạn phải làm là:

@IBOutlet weak var collectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()

    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(doSomething), for: .valueChanged)

    // this is the replacement of implementing: "collectionView.addSubview(refreshControl)"
    collectionView.refreshControl = refreshControl
}

func doSomething(refreshControl: UIRefreshControl) {
    print("Hello World!")

    // somewhere in your code you might need to call:
    refreshControl.endRefreshing()
}

Cá nhân, tôi thấy tự nhiên hơn khi coi nó như một thuộc tính cho chế độ xem cuộn hơn là thêm nó dưới dạng một khung nhìn phụ, đặc biệt bởi vì chế độ xem thích hợp duy nhất để làm giám sát cho UIRefreshControl là một cuộn xem, tức là chức năng sử dụng UIRefreshControl hữu ích khi làm việc với chế độ xem cuộn; Đó là lý do tại sao cách tiếp cận này rõ ràng hơn để thiết lập chế độ xem điều khiển làm mới.

Tuy nhiên, bạn vẫn có tùy chọn sử dụng addSubviewdựa trên phiên bản iOS:

if #available(iOS 10.0, *) {
  collectionView.refreshControl = refreshControl
} else {
  collectionView.addSubview(refreshControl)
}

này anh bạn, tôi gọi cái gì trong func doS Something? nếu tôi gọi reload. Nó không muốn tải lại!

@JavierV. thêm một điểm dừng trong doSomethingchức năng, nếu nó có thể truy cập thì bạn phải kiểm tra mã của mình.
Ahmad F

50

Swift 4

var refreshControl: UIRefreshControl!

override func viewDidLoad() {
    super.viewDidLoad()

    refreshControl = UIRefreshControl()
    refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
    refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
    tableView.addSubview(refreshControl) 
}

@objc func refresh(_ sender: Any) {
    //  your code to reload tableView
}

Và bạn có thể ngừng làm mới với:

refreshControl.endRefreshing()

Đừng quên đề cập đến tableView.reloadData()trong ví dụ của bạn!
Konstantinos Natsios

Xin chào, tôi tạo refreshcontrol của mình bằng cách đó : var refControl: UIRefreshControl{ let rfControl = UIRefreshControl() rfControl.attributedTitle = NSAttributedString(string: "") rfControl.tintColor = UIColor(red:0.16, green:0.68, blue:0.9, alpha:1) rfControl.addTarget(self, action: #selector(getNewMessageList), for: .valueChanged) return rfControl }. Sau đó gọi endRefreshing (), nó không hoạt động (refreshcontrol vẫn hiển thị ở đó), nhưng hãy làm theo cách của bạn, nó đã hoạt động, xin vui lòng cho tôi biết tại sao?
lee

@lee Vì rfControl là cục bộ và không có quyền truy cập từ bên ngoài. Cố gắng khởi tạo rfControl như một biến toàn cục cho VC: var rfControl = UIRefreshControl () và dừng với rfControl.endRefreshing ()
Gilad Brunfman 17/03/2017

Một câu hỏi: .valueChangedsự kiện được kích hoạt ở đâu? Tôi không hiểu kết nối này.
juniorgarcia

khi UIRefreshControl được kích hoạt, như bạn thấy khi bạn thêmTarget: refreshControl.addTarget (tự, hành động: #selector (self.refresh), cho: UIControlEvents.valueChanged)
Gilad Brunfman

9

Trong Swift sử dụng cái này,

Nếu bạn muốn kéo để làm mới trong WebView,

Vì vậy, hãy thử mã này:

override func viewDidLoad() {
    super.viewDidLoad()
    addPullToRefreshToWebView()
}

func addPullToRefreshToWebView(){
    var refreshController:UIRefreshControl = UIRefreshControl()

    refreshController.bounds = CGRectMake(0, 50, refreshController.bounds.size.width, refreshController.bounds.size.height) // Change position of refresh view
    refreshController.addTarget(self, action: Selector("refreshWebView:"), forControlEvents: UIControlEvents.ValueChanged)
    refreshController.attributedTitle = NSAttributedString(string: "Pull down to refresh...")
    YourWebView.scrollView.addSubview(refreshController)

}

func refreshWebView(refresh:UIRefreshControl){
    YourWebView.reload()
    refresh.endRefreshing()
}

Cảm ơn ngài! Đã giải quyết vấn đề của một người mới mà tôi gặp phải khi học.
David David Smith

5

Câu trả lời của Anhil đã giúp tôi rất nhiều.

Tuy nhiên, sau khi thử nghiệm thêm, tôi nhận thấy rằng giải pháp được đề xuất đôi khi gây ra trục trặc giao diện người dùng không đẹp .

Thay vào đó, đi theo cách tiếp cận này * đã lừa tôi.

* Swift 2.1

//Create an instance of a UITableViewController. This will host your UITableView.
private let tableViewController = UITableViewController()

//Add tableViewController as a childViewController and set its tableView property to your UITableView.
self.addChildViewController(self.tableViewController)
self.tableViewController.tableView = self.tableView
self.refreshControl.addTarget(self, action: "refreshData:", forControlEvents: .ValueChanged)
self.tableViewController.refreshControl = self.refreshControl

2

Những gì lỗi đang nói với bạn, đó refreshlà không được khởi tạo. Lưu ý rằng bạn đã chọn để làm cho refreshkhông bắt buộc, mà trong Swift phương tiện mà nó để có một giá trị trước khi bạn gọi super.init(hoặc nó mặc nhiên được gọi, mà có vẻ là trường hợp của bạn). Hoặc là refreshtùy chọn (có thể là những gì bạn muốn) hoặc khởi tạo nó theo một cách nào đó.

Tôi sẽ đề nghị đọc tài liệu giới thiệu Swift một lần nữa, trong đó bao gồm điều này rất dài.

Một điều cuối cùng, không phải là một phần của câu trả lời, như được chỉ ra bởi @Anil, có một điều khiển tích hợp để làm mới trong iOS được gọi UIRefresControl, đây có thể là điều đáng để xem xét.


2

Tôi đã xây dựng một ứng dụng RSS feed trong đó tôi có tính năng Pull To refresh ban đầu có một số vấn đề được liệt kê ở trên.

Nhưng để thêm vào câu trả lời của người dùng ở trên, tôi đã tìm mọi nơi cho trường hợp sử dụng của mình và không thể tìm thấy nó. Tôi đã tải xuống dữ liệu từ web (RSSFeed) và tôi muốn kéo xuống bảng của mình Xem các câu chuyện để làm mới.

Những gì được đề cập ở trên bao gồm các lĩnh vực phù hợp nhưng với một số vấn đề mọi người đang gặp phải, đây là những gì tôi đã làm và nó có tác dụng:

Tôi đã sử dụng cách tiếp cận của @Blankarsch và đi đến main.storyboard của tôi và chọn chế độ xem bảng để sử dụng làm mới, sau đó, điều không được đề cập là tạo IBOutlet và IBAction để sử dụng làm mới hiệu quả

//Created from main.storyboard cntrl+drag refresh from left scene to assistant editor
@IBOutlet weak var refreshButton: UIRefreshControl

override func viewDidLoad() {
  ...... 
  ......
  //Include your code
  ......
  ......
  //Is the function called below, make sure to put this in your viewDidLoad 
  //method or not data will be visible when running the app
  getFeedData()
}

//Function the gets my data/parse my data from the web (if you havnt already put this in a similar function)
//remembering it returns nothing, hence return type is "-> Void"
func getFeedData() -> Void{
  .....
  .....
}

//From main.storyboard cntrl+drag to assistant editor and this time create an action instead of outlet and 
//make sure arguments are set to none and note sender
@IBAction func refresh() {
  //getting our data by calling the function which gets our data/parse our data
  getFeedData()

  //note: refreshControl doesnt need to be declared it is already initailized. Got to love xcode
  refreshControl?.endRefreshing()
}

Hy vọng điều này sẽ giúp bất cứ ai có cùng hoàn cảnh như tôi


2
func pullToRefresh(){

    let refresh = UIRefreshControl()
    refresh.addTarget(self, action: #selector(handleTopRefresh(_:)), for: .valueChanged )
    refresh.tintColor = UIColor.appBlack
    self.tblAddressBook.addSubview(refresh)

}
@objc func handleTopRefresh(_ sender:UIRefreshControl){
    self.callAddressBookListApi(isLoaderRequired: false)
    sender.endRefreshing()
}

2

Chi tiết

  • Phiên bản Xcode 10.3 (10G8), Swift 5

Đặc trưng

  • Khả năng "kéo để làm mới" theo chương trình
  • Bảo vệ khỏi các sự kiện "kéo để làm mới"
  • Khả năng tiếp tục hoạt hình của chỉ báo hoạt động khi chuyển đổi bộ điều khiển xem (ví dụ trong trường hợp TabContoder)

Giải pháp

import UIKit

class RefreshControl: UIRefreshControl {

    private weak var actionTarget: AnyObject?
    private var actionSelector: Selector?
    override init() { super.init() }

    convenience init(actionTarget: AnyObject?, actionSelector: Selector) {
        self.init()
        self.actionTarget = actionTarget
        self.actionSelector = actionSelector
        addTarget()
    }

    private func addTarget() {
        guard let actionTarget = actionTarget, let actionSelector = actionSelector else { return }
        addTarget(actionTarget, action: actionSelector, for: .valueChanged)
    }

    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }

    func endRefreshing(deadline: DispatchTime? = nil) {
        guard let deadline = deadline else { endRefreshing(); return }
        DispatchQueue.global(qos: .default).asyncAfter(deadline: deadline) { [weak self] in
            DispatchQueue.main.async { self?.endRefreshing() }
        }
    }

    func refreshActivityIndicatorView() {
        guard let selector = actionSelector else { return }
        let _isRefreshing = isRefreshing
        removeTarget(actionTarget, action: selector, for: .valueChanged)
        endRefreshing()
        if _isRefreshing { beginRefreshing() }
        addTarget()
    }

    func generateRefreshEvent() {
        beginRefreshing()
        sendActions(for: .valueChanged)
    }
}

public extension UIScrollView {

    private var _refreshControl: RefreshControl? { return refreshControl as? RefreshControl }

    func addRefreshControll(actionTarget: AnyObject?, action: Selector, replaceIfExist: Bool = false) {
        if !replaceIfExist && refreshControl != nil { return }
        refreshControl = RefreshControl(actionTarget: actionTarget, actionSelector: action)
    }

    func scrollToTopAndShowRunningRefreshControl(changeContentOffsetWithAnimation: Bool = false) {
        _refreshControl?.refreshActivityIndicatorView()
        guard   let refreshControl = refreshControl,
                contentOffset.y != -refreshControl.frame.height else { return }
        setContentOffset(CGPoint(x: 0, y: -refreshControl.frame.height), animated: changeContentOffsetWithAnimation)
    }

    private var canStartRefreshing: Bool {
        guard let refreshControl = refreshControl, !refreshControl.isRefreshing else { return false }
        return true
    }

    func startRefreshing() {
        guard canStartRefreshing else { return }
        _refreshControl?.generateRefreshEvent()
    }

    func pullAndRefresh() {
        guard canStartRefreshing else { return }
        scrollToTopAndShowRunningRefreshControl(changeContentOffsetWithAnimation: true)
        _refreshControl?.generateRefreshEvent()
    }

    func endRefreshing(deadline: DispatchTime? = nil) { _refreshControl?.endRefreshing(deadline: deadline) }
}

Sử dụng

// Add refresh control to UICollectionView / UITableView / UIScrollView
private func setupTableView() {
    let tableView = UITableView()
    // ...
    tableView.addRefreshControll(actionTarget: self, action: #selector(refreshData))
}

@objc func refreshData(_ refreshControl: UIRefreshControl) {
    tableView?.endRefreshing(deadline: .now() + .seconds(3))
}

// Stop refreshing in UICollectionView / UITableView / UIScrollView
tableView.endRefreshing()

// Simulate pull to refresh in UICollectionView / UITableView / UIScrollView
tableView.pullAndRefresh()

Mẫu đầy đủ

Đừng quên thêm mã giải pháp tại đây

import UIKit

class ViewController: UIViewController {

    private weak var tableView: UITableView?

    override func viewDidLoad() {
        super.viewDidLoad()
        setupTableView()
    }

    private func setupTableView() {
        let tableView = UITableView()
        view.addSubview(tableView)
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        tableView.dataSource = self
        tableView.delegate = self
        tableView.addRefreshControll(actionTarget: self, action: #selector(refreshData))
        self.tableView = tableView
    }
}

extension ViewController {
    @objc func refreshData(_ refreshControl: UIRefreshControl) {
        print("refreshing")
        tableView?.endRefreshing(deadline: .now() + .seconds(3))
    }
}

extension ViewController: UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int { return 1 }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 20 }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = "\(indexPath)"
        return cell
    }
}

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.pullAndRefresh()
    }
}

2

Swift 5

private var pullControl = UIRefreshControl()

pullControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
        pullControl.addTarget(self, action: #selector(refreshListData(_:)), for: .valueChanged)
        if #available(iOS 10.0, *) {
            tableView.refreshControl = pullControl
        } else {
            tableView.addSubview(pullControl)
        }
// Actions
@objc private func refreshListData(_ sender: Any) {
        self.pullControl.endRefreshing() // You can stop after API Call
        // Call API
    }

1

Tôi đề nghị thực hiện một phần mở rộng kéo để làm mới để sử dụng trong mỗi lớp.

1) Tạo một tệp nhanh chóng trống: Tệp - Mới - Tệp - Tệp Swift.

2) Thêm các mục sau

    //  AppExtensions.swift

    import Foundation
    import UIKit    

    var tableRefreshControl:UIRefreshControl = UIRefreshControl()    

    //MARK:- VIEWCONTROLLER EXTENSION METHODS
    public extension UIViewController
    {
        func makePullToRefreshToTableView(tableName: UITableView,triggerToMethodName: String){

            tableRefreshControl.attributedTitle = NSAttributedString(string: "TEST: Pull to refresh")
            tableRefreshControl.backgroundColor = UIColor.whiteColor()
            tableRefreshControl.addTarget(self, action: Selector(triggerToMethodName), forControlEvents: UIControlEvents.ValueChanged)
            tableName.addSubview(tableRefreshControl)
        }
        func makePullToRefreshEndRefreshing (tableName: String)
        {
            tableRefreshControl.endRefreshing()
//additional codes

        }
    }    

3) Trong Trình điều khiển Chế độ xem của bạn gọi các phương thức này là:

  override func viewWillAppear(animated: Bool) {

self.makePullToRefreshToTableView(bidderListTable, triggerToMethodName: "pullToRefreshBidderTable")
}

4) Tại một số điểm bạn muốn kết thúc làm mới:

  func pullToRefreshBidderTable() {
self.makePullToRefreshEndRefreshing("bidderListTable")    
//Code What to do here.
}
OR    
self.makePullToRefreshEndRefreshing("bidderListTable")

1
Mã của bạn có tên dự án và thông báo bản quyền, có thể không tốt cho bạn :). Bất cứ mã nào bạn đăng ở đây đều phải miễn phí cho mọi người sử dụng
Anil Varghese

Cảm ơn Anil! Tôi đã quên để loại bỏ những người.
AG

1

Để kéo để làm mới tôi đang sử dụng

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

Cài đặt

nhóm 'DGElasticPullToRefresh'

import DGElasticPullToRefresh

và đặt chức năng này vào tập tin nhanh chóng của bạn và gọi chức năng này từ bạn

ghi đè func viewWillAppear (_ hoạt hình: Bool)

     func Refresher() {
      let loadingView = DGElasticPullToRefreshLoadingViewCircle()
      loadingView.tintColor = UIColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1.0)
      self.table.dg_addPullToRefreshWithActionHandler({ [weak self] () -> Void in

          //Completion block you can perfrom your code here.

           print("Stack Overflow")

           self?.table.dg_stopLoading()
           }, loadingView: loadingView)
      self.table.dg_setPullToRefreshFillColor(UIColor(red: 255.0/255.0, green: 57.0/255.0, blue: 66.0/255.0, alpha: 1))
      self.table.dg_setPullToRefreshBackgroundColor(self.table.backgroundColor!)
 }

Và đừng quên xóa tham chiếu trong khi chế độ xem sẽ biến mất

để loại bỏ pull để làm mới, hãy đặt mã này vào

ghi đè func viewDidDisappear (_ hoạt hình: Bool)

override func viewDidDisappear(_ animated: Bool) {
      table.dg_removePullToRefresh()

 }

Và nó sẽ trông giống như

nhập mô tả hình ảnh ở đây

Chúc mừng mã hóa :)


1

Bạn có thể đạt được điều này bằng cách sử dụng một vài dòng mã. Vậy tại sao bạn lại bị mắc kẹt trong thư viện hoặc UI của bên thứ ba. Kéo để làm mới được xây dựng trong iOS. Bạn có thể làm điều này nhanh chóng như

nhập mô tả hình ảnh ở đây

var pullControl = UIRefreshControl()

override func viewDidLoad() {
   super.viewDidLoad()

   pullControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
   pullControl.addTarget(self, action: #selector(pulledRefreshControl(_:)), for: UIControl.Event.valueChanged)
   tableView.addSubview(pullControl) // not required when using UITableViewController
}

@objc func pulledRefreshControl(sender:AnyObject) {
   // Code to refresh table view  
}

0

bạn có thể sử dụng lớp con này của bảngView:

import UIKit

protocol PullToRefreshTableViewDelegate : class {
    func tableViewDidStartRefreshing(tableView: PullToRefreshTableView)
}

class PullToRefreshTableView: UITableView {

    @IBOutlet weak var pullToRefreshDelegate: AnyObject?
    private var refreshControl: UIRefreshControl!
    private var isFirstLoad = true

    override func willMoveToSuperview(newSuperview: UIView?) {
        super.willMoveToSuperview(newSuperview)

        if (isFirstLoad) {
            addRefreshControl()
            isFirstLoad = false
        }
    }

    private func addRefreshControl() {
        refreshControl = UIRefreshControl()
        refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
        refreshControl.addTarget(self, action: "refresh", forControlEvents: .ValueChanged)
        self.addSubview(refreshControl)
    }

    @objc private func refresh() {
       (pullToRefreshDelegate as? PullToRefreshTableViewDelegate)?.tableViewDidStartRefreshing(self)
    }

    func endRefreshing() {
        refreshControl.endRefreshing()
    }

}

Trình tạo giao diện 1 - trong lớp thay đổi lớp của bảng Xem của bạn thành PullToRefreshTableViewhoặc tạo một PullToRefreshTableViewchương trình

2 - thực hiện PullToRefreshTableViewDelegatetrong trình điều khiển xem của bạn

3 - tableViewDidStartRefreshing(tableView: PullToRefreshTableView)sẽ được gọi trong trình điều khiển chế độ xem của bạn khi chế độ xem bảng bắt đầu làm mới

4 - gọi yourTableView.endRefreshing()để hoàn thành việc làm mới


0

Đây là cách tôi làm cho nó hoạt động bằng Xcode 7.2 mà tôi nghĩ là một lỗi lớn. Tôi đang sử dụng nó bên UITableViewControllertrong của tôiviewWillAppear

refreshControl = UIRefreshControl()
refreshControl!.addTarget(self, action: "configureMessages", forControlEvents: .ValueChanged)
refreshControl!.beginRefreshing()

configureMessages()

func configureMessages() {
    // configuring messages logic here

    self.refreshControl!.endRefreshing()
}

Như bạn có thể thấy, tôi thực sự phải gọi configureMessage()phương thức sau khi thiết lập UIRefreshControlrồi sau đó, các lần làm mới tiếp theo sẽ hoạt động tốt.


-1

Những câu trả lời khác đều đúng nhưng để biết thêm chi tiết, hãy kiểm tra bài này Kéo để làm mới

Cho phép làm mới trong Storyboard

Khi bạn đang làm việc với UITableViewCont kiểm soát, giải pháp khá đơn giản: Đầu tiên, Chọn bộ điều khiển xem bảng trong bảng phân cảnh của bạn, mở trình kiểm tra thuộc tính và cho phép làm mới:

Một UITableViewControll được trang bị với một tham chiếu đến UIRefreshControl ra khỏi hộp. Bạn chỉ cần nối một vài thứ để bắt đầu và hoàn thành việc làm mới khi người dùng kéo xuống.

Ghi đè viewDidLoad ()

Trong phần ghi đè của viewDidLoad (), hãy thêm mục tiêu để xử lý việc làm mới như sau:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
        
    self.refreshControl?.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged)
}
  1. Vì tôi đã chỉ định xử lý củaRRrresh: ghi (dấu hai chấm!) Là đối số hành động, tôi cần xác định một hàm trong lớp UITableViewControll này có cùng tên. Ngoài ra, hàm sẽ lấy một đối số
  2. Chúng tôi muốn hành động này được gọi cho UIControlEvent có tên là ValueChanged
  3. Đừng quên gọi refreshControl.endRefreshing()

Để biết thêm thông tin Vui lòng truy cập Liên kết và tất cả tín dụng vào bài đăng đó


Trong khi điều này về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Tunaki 8/2/2016
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.