[objective-c] 沒有UITableViewController的UIRefreshControl


Answers

為了消除由接受的答案引起的口吃,你可以將你的UITableView分配給UITableViewController

_tableViewController = [[UITableViewController alloc]initWithStyle:UITableViewStylePlain];
[self addChildViewController:_tableViewController];

_tableViewController.refreshControl = [UIRefreshControl new];
[_tableViewController.refreshControl addTarget:self action:@selector(loadStream) forControlEvents:UIControlEventValueChanged];

_theTableView = _tableViewController.tableView;

編輯:

在沒有任何口吃的情況下添加沒有UITableViewControllerUIRefreshControl ,並在刷新tableview中的數據後保留好動畫。

UIRefreshControl *refreshControl = [UIRefreshControl new];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.theTableView addSubview:refreshControl];
[self.theTableView sendSubviewToBack:refreshControl];

稍後處理刷新的數據時......

- (void)handleRefresh:(UIRefreshControl *)refreshControl {
    [self.theTableView reloadData];
    [self.theTableView layoutIfNeeded];
    [refreshControl endRefreshing];
}
Question

只是好奇,因為它似乎不可能,但有沒有偷偷摸摸的方式來利用新的iOS 6 UIRefreshControl類而不使用UITableViewController子類?

我經常使用帶有UITableView子視圖的UIViewController ,並且符合UITableViewDataSourceUITableViewDelegate而不是直接使用UITableViewController




IOS 10 Swift 3.0

這很簡單

import UIKit

class ViewControllerA: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var myTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        myTableView.delegate = self
        myTableView.dataSource = self

        if #available(iOS 10.0, *) {
            let refreshControl = UIRefreshControl()
            let title = NSLocalizedString("PullToRefresh", comment: "Pull to refresh")
            refreshControl.attributedTitle = NSAttributedString(string: title)
            refreshControl.addTarget(self,
                                     action: #selector(refreshOptions(sender:)),
                                     for: .valueChanged)
            myTableView.refreshControl = refreshControl
        }
    }

    @objc private func refreshOptions(sender: UIRefreshControl) {
        // Perform actions to refresh the content
        // ...
        // and then dismiss the control
        sender.endRefreshing()
    }

    // MARK: - Table view data source

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 12
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        cell.textLabel?.text = "Cell \(String(indexPath.row))"
        return cell
    }

}

如果你想了解iOS 10 UIRefreshControl閱讀here




嘗試這個,

以上解決方案都很好,但tableView.refreshControl只適用於UITableViewController,直到iOS 9.x,並從iOS 10.x開始進入UITableView。

寫在Swift 3 -

let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(FeedViewController.loadNewData), for: UIControlEvents.valueChanged)
// Fix for the RefreshControl Not appearing in background
tableView?.addSubview(refreshControl)
tableView.sendSubview(toBack: refreshControl)



事實證明,當你使用帶有UITableView子視圖的UIViewController並且符合UITableViewDataSource和UITableViewDelegate時,你可以使用以下方法:

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



那麼UIRefreshControl是一個UIView子類,所以你可以自己使用它。 我不確定它是如何呈現自己的。 渲染可以簡單地依賴於框架,但它也可以依賴於UIScrollView或UITableViewController。

無論哪種方式,這將是一個比一個優雅的解決方案更多的黑客。 我建議你查看一個可用的第三方克隆或寫你自己的。

ODRefreshControl

SlimeRefresh




對於Swift 2.2。

首先製作UIRefreshControl()。

var refreshControl : UIRefreshControl!

在你的viewDidLoad()方法中添加:

refreshControl = UIRefreshControl()
    refreshControl.attributedTitle = NSAttributedString(string: "Refreshing..")
    refreshControl.addTarget(self, action: #selector(YourUIViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)
    self.tableView.addSubview(refreshControl)

並使刷新功能

func refresh(refreshControl: UIRefreshControl) {

    // do something ...

    // reload tableView
    self.tableView.reloadData()

    // End refreshing
    refreshControl.endRefreshing()
}



Links