私のUIRefreshControllerは奇妙なことをしています。更新をプルダウンすると、tableViewヘッダーが移動します。
プルダウンすると問題ないように見えますが、リフレッシャーがまだ機能しているときにテーブルを下にスクロールすると、UITableCellsが問題なくヘッダーの後ろにスクロールしている間に、ヘッダーが更新コントロールの高さによってオフセットされます。
TableViewControllerの作成を避けたいので、viewDidLoadで次のことを行っています。
_refreshControl = [[UIRefreshControl alloc] init];
[_refreshControl addTarget:self action:@selector(refresh) forControlEvents:UIControlEventValueChanged];
[_tableView addSubview:_refreshControl];
この機能を必要とするさまざまなViewControllerに多くのテーブルがあります。それぞれにUITableViewControllerを作成しないようにする方法はありますか?
トンありがとう!
これは、実行されるはずのないサブビューとして_refreshControl
を追加しているために問題になる可能性があります。ただし、UITableViewController
オブジェクトを作成して、現在のviewcontrollerクラスの子ViewControllerとして追加することはできます。
例:-
UITableViewController *tableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
[self addChildViewController:tableViewController];
tableViewController.refreshControl = [[UIRefreshControl alloc] init];
[tableViewController.refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
tableViewController.tableView.frame = CGRectMake(...);//set the frame here
[self.view addSubview:tableViewController.tableView];
これに対する簡単な修正は、このようにすることです
//header
@property UITableViewController *tableController;
//.m (right at the beginning of viewDidLoad for example)
self.tableController = [[UITableViewController alloc] init];
[self addChildViewController:self.tableController];
self.tableController.tableView = self.tableView;
...
//then create the refresh control and assign it to the UITableViewController
self.tableController.refreshControl = refreshControl;
//Create an instance of a UITableViewController. This will Host your UITableView.
private let tableController = UITableViewController()
//Add tableController as a childViewController and set its tableView property to your UITableView.
self.addChildViewController(self.tableController)
self.tableController.tableView = self.tableView
self.refreshControl.addTarget(self, action: "refreshData:", forControlEvents: .ValueChanged)
self.tableController.refreshControl = self.refreshControl
これは、テーブルをIBOutletに接続し、他のものをストーリーボードにリンクさせて、いじりたくない場合に役立ちます。
UIRefreshControl
はサブビューを意味するのではなく、(文字通り)テーブルの更新コントロールを意味します。 UITableViewController
には、それら専用のアウトレットがあります(ここでも、文字通り refreshControl と呼ばれます)。テーブルのサブビューとして、テーブルの周りに再計算を強制する単なるサブビューではなく、セルであるとテーブルに想定させている可能性があります。運が良ければ、コントロールが適切な場所に設定される場合がありますが、これも未定義の動作の結果です。
UITableViewControllerは制限クラスを意図したものではなく、「複数のテーブルビュー」(とにかく新しいビューコントローラーを提示する必要があるほどコンテキスト固有に聞こえる)の実装を妨げるものではありません。クラスごとに定型文を作成する必要がある場合は、実装するテーブルビューごとに抽象スーパークラスコントローラーを作成し、必要に応じてサブクラス化します。
@available(iOS 10.0、*)
tableView.refreshControl = refreshControl
この方法でプッシュビューコントローラーを追加してみてください。
テーブルビューコントローラを作成し、既存のビューコントローラのサブビューとして追加します。次に、テーブルビューとリフレッシュコントローラーをテーブルビューコントローラーのプロパティに割り当てます。
UITableViewController *newTableViewController = [[UITableViewController alloc] init];
newTableViewControler.tableView = <yourTableView>;
<yourRefreshController> = [[UIRefreshControl alloc] init];
[<yourRefreshController> addTarget:self
action:@selector(refreshTableView:)
forControlEvents:UIControlEventValueChanged];
newTableViewController.refreshControl = _chatListRefreshControl;
[self addChildViewController:newTableViewController];