308

すぐに可能とは思えないので興味深いのですが、サブクラスUIRefreshControlを使用せずに新しい iOS 6 クラスを活用するための巧妙な方法はありますか?UITableViewController

私はよくサブビューでUIViewControlleraを使用し、完全に使用するのではなくandに準拠します。UITableViewUITableViewDataSourceUITableViewDelegateUITableViewController

4

12 に答える 12

388

直感で、DrummerB のインスピレーションに基づいて、単純にUIRefreshControlインスタンスをサブビューとして my に追加してみましたUITableView。そして、それは魔法のように機能します!

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

これにより、テーブル ビューの上に が追加され、 :)UIRefreshControlを使用しなくても期待どおりに機能します。UITableViewController


編集: 上記はまだ機能しますが、いくつか指摘されているように、この方法で UIRefreshControl を追加すると、わずかな「スタッター」があります。その解決策は、UITableViewController をインスタンス化し、UIRefreshControl と UITableView をそれに設定することです。

UITableViewController *tableViewController = [[UITableViewController alloc] init];
tableViewController.tableView = self.myTableView;

self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(getConnections) forControlEvents:UIControlEventValueChanged];
tableViewController.refreshControl = self.refreshControl;
于 2012-09-19T20:32:48.213 に答える
94

受け入れられた回答によって引き起こされる吃音をなくすために、 を に割り当てることができ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;

編集:

テーブルビューのデータを更新した後、スタッターUIRefreshControlなしでなしを追加し、素敵なアニメーションを保持する方法。UITableViewController

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];
}
于 2013-01-03T22:14:03.170 に答える
21

あなたがしようとしているのは、使用しているViewController内でコンテナビューを使用することです。専用のテーブルビューを使用してクリーンな UITableViewController サブクラスを定義し、それを ViewController に配置できます。

于 2012-10-25T21:09:31.120 に答える
18

UIRefreshControl は UIView サブクラスなので、単独で使用できます。それがどのようにレンダリングされるかはわかりません。レンダリングは単にフレームに依存する場合もありますが、UIScrollView または UITableViewController に依存する場合もあります。

いずれにせよ、それは洗練されたソリューションというよりもハックになるでしょう。利用可能なサードパーティのクローンのいずれかを調べるか、独自のクローンを作成することをお勧めします。

ODRefreshControl

ここに画像の説明を入力

スライムリフレッシュ

ここに画像の説明を入力

于 2012-09-19T15:38:46.483 に答える
7

NSObjectまたは GCD の-endRefreshいずれかを使用して、tableView がコンテンツをリロードした後、refreshControl メソッドの呼び出しを数分の 1 遅らせてみてください。-performSelector:withObject:afterDelay:dispatch_after

このために、UIRefreshControl にカテゴリを作成しました。

@implementation UIRefreshControl (Delay)

- (void)endRefreshingAfterDelay:(NSTimeInterval)delay {
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self endRefreshing];
    });
}

@end

私はそれをテストしましたが、これはコレクション ビューでも機能します。0.01 秒程度の遅延で十分であることに気付きました。

// My data refresh process here while the refresh control 'isRefreshing'
[self.tableView reloadData];
[self.refreshControl endRefreshingAfterDelay:.01];
于 2013-08-03T04:48:41.250 に答える
7

IOS 10 スイフト 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 について知りたい場合は、こちらをお読みください

于 2016-12-22T15:49:46.610 に答える
3

リフレッシュ コントロールをサブビューとして追加すると、セクション ヘッダーの上に空のスペースが作成されます。

代わりに、UITableViewController を UIViewController に埋め込み、tableViewプロパティを変更して、埋め込まれたものを指すようにしました。最小限のコード変更。:-)

手順:

  1. Storyboard で新しい UITableViewController を作成し、元の UIViewController に埋め込みます
  2. @IBOutlet weak var tableView: UITableView!以下に示すように、新しく埋め込まれた UITableViewController のものに置き換えます。

class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tableViewController = self.childViewControllers.first as! UITableViewController
        tableView = tableViewController.tableView
        tableView.dataSource = self
        tableView.delegate = self

        // Now we can (properly) add the refresh control
        let refreshControl = UIRefreshControl()
        refreshControl.addTarget(self, action: "handleRefresh:", forControlEvents: .ValueChanged)
        tableViewController.refreshControl = refreshControl
    }

    ...
}
于 2015-03-05T05:46:11.447 に答える
2

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()
}
于 2016-05-17T20:06:31.170 に答える