UITableViewControllerなしでプルしてUITableViewを更新する


180

UIViewController内のUITableViewにプルトゥリフレッシュ機能を実装しようとしています。UITableViewControllerを使用することはできません。UITableViewをビューコントローラーの小さなサブビューにしたいのですが、その上に他のものがいくつかあります。私はこれが可能だと思いますが、誰かがそれの実装を見たことがありますか?

回答:


465

UITableView使用せずに、にリフレッシュコントロールを直接追加します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
とても簡単です。iOS 7.0.4のUIViewControllerに追加されたテーブルビューで試したところ、うまくいきました。
thandasoru 2014

5
コントロール自体が表示されないが、それ以外の場合は正常に動作するように見えるという問題が発生したことがありますか?
リモートビジョン2014年

16
「クリック」すると、テーブルビューが突然下がるように見えます。理由はまだわかりません。
Bob Spryn 2014

3
私はそれがviewdidappearに入る必要があることを発見しました、それがiOS 7機能であるかどうかはわかりません-私はまだiOS 8でそれをテストしていません...
ジャックソロモン

4
refreshControlがtableViewの上に表示されます。私はこれを次のtableView.insertSubview(refreshControl, atIndex: 0)ように修正しました:代わりにtableView.addSubview(refreshControl)
kbpontius

12

Objective-C

これは、テーブルビューのプルトゥリフレッシュを実装する方法です。コレクションビューの場合と同じです。テーブルビューのallocをコレクションビューに置き換えるだけです。

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];
}

迅速なバージョンが> 430である場合、obj-cバージョンはどうして9つの賛成票しか持っていないのですか?
Chase Roberts

1
@ChaseRoberts、これは2月13日に回答されたものです。編集履歴を確認してください。元々はObjective-Cでしたが、当時Swiftが新しいため、Swiftバージョンを探していました... stackoverflow.com/posts / 15010646 / revisions
Irfan

4

@berikのこのソリューションは正常に機能しますが、UIControllerはUITableViewControllerの上に表示されます。それを修正する方法はこの変更を行うことです:

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はtableViewの上に表示されますが、あなたの提案によりrefreshControl、は表示されず、の下には表示されませんtableView。私はこれを修正しました:tableView.addSubview(refreshControl)の代わりにtableView.insertSubview(refreshControl、atIndex:0)
kbpontius

3

UIViewControllerと単純なテーブルビューを使用してEGORefreshTableHeaderViewを実装しました。トリックは、EGOがスクロールビューをパラメーターとして取る場所で、テーブルビュー自体がスクロールビューから継承されていることを確認した場合です。

それだけでいくつかの追加の接続が必要です:)

お役に立てれば。


-1

viewControllerのloadViewメソッド内にUIRefreshControlを作成すると、すべてが正常に機能するようです。UIRefreshControlは正常に動作します。iOS 7.1およびiOS 8.2でテスト済み


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.