1. ホーム
  2. ios

[解決済み] UIRefreshControl - UITableViewControllerがUINavigationControllerの中にある場合、beginRefreshingは動作しません。

2022-07-11 01:11:13

質問

UITableViewController(UINavigationController内にある)にUIRefreshControlをセットアップしたところ、期待通りに動作しました(すなわち、プルダウンが正しいイベントを発生させる)。しかし、プログラム的に beginRefreshing のようなリフレッシュコントロールのインスタンスメソッドを呼び出すと

[self.refreshControl beginRefreshing];

何も起こりません。アニメーションしてスピナーが表示されるはずです。その endRefreshing メソッドは、リフレッシュの後にそれを呼び出すと、適切に動作します。

この動作で基本的なプロトタイププロジェクトを作成し、UITableViewControllerをアプリケーションデリゲートのルートビューコントローラに直接追加した場合、正しく動作します。

self.viewController = tableViewController;
self.window.rootViewController = self.viewController;

しかし、もし私が tableViewController を UINavigationController に追加してから、ナビゲーション・コントローラーを rootViewController として、ナビゲーション・コントローラーを beginRefreshing メソッドはもう機能しません。例

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableViewController];
self.viewController = navController;
self.window.rootViewController = self.viewController;

私の感覚では、これはナビゲーション・コントローラ内のネストされたビュー階層がリフレッシャーコントロールとうまくいっていないことと関係があるような気がします。

ありがとうございます。

どのように解決するのですか?

プログラム的に更新を開始する場合、テーブルビューを自分でスクロールする必要があるようです、例えば、contentoffsetを変更することによって

[self.tableView setContentOffset:CGPointMake(0, -self.refreshControl.frame.size.height) animated:YES];

この理由は、ユーザーがテーブルビューの真ん中や底にいるときに、リフレッシュコントロールまでスクロールするのが望ましくない可能性があるからでしょうか。

Swift 2.2 バージョン (@muhasturk による)

self.tableView.setContentOffset(CGPoint(x: 0, y: -refreshControl.frame.size.height), animated: true)

簡単に言うと、これをポータブルなものにするために、次の拡張子を追加します。

UIRefreshControl+ProgramaticallyBeginRefresh.swiftを追加します。

extension UIRefreshControl {
    func programaticallyBeginRefreshing(in tableView: UITableView) {
        beginRefreshing()
        let offsetPoint = CGPoint.init(x: 0, y: -frame.size.height)
        tableView.setContentOffset(offsetPoint, animated: true)        
    }
}