web-dev-qa-db-ja.com

UIRefreshControlを使用してTableViewでヘッダーが置き換えられました

私のUIRefreshControllerは奇妙なことをしています。更新をプルダウンすると、tableViewヘッダーが移動します。

プルダウンすると問題ないように見えますが、リフレッシャーがまだ機能しているときにテーブルを下にスクロールすると、UITableCellsが問題なくヘッダーの後ろにスクロールしている間に、ヘッダーが更新コントロールの高さによってオフセットされます。

http://oi49.tinypic.com/2a8hqti.jpg

http://oi46.tinypic.com/acssrb.jpg

TableViewControllerの作成を避けたいので、viewDidLoadで次のことを行っています。

_refreshControl = [[UIRefreshControl alloc] init];
[_refreshControl addTarget:self action:@selector(refresh) forControlEvents:UIControlEventValueChanged];
[_tableView addSubview:_refreshControl];

この機能を必要とするさまざまなViewControllerに多くのテーブルがあります。それぞれにUITableViewControllerを作成しないようにする方法はありますか?

トンありがとう!

28
Dave

これは、実行されるはずのないサブビューとして_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];
18
iDev

これに対する簡単な修正は、このようにすることです

Objective-C

//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;

スウィフト2.1

//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に接続し、他のものをストーリーボードにリンクさせて、いじりたくない場合に役立ちます。

17
Fonix

UIRefreshControlはサブビューを意味するのではなく、(文字通り)テーブルの更新コントロールを意味します。 UITableViewControllerには、それら専用のアウトレットがあります(ここでも、文字通り refreshControl と呼ばれます)。テーブルのサブビューとして、テーブルの周りに再計算を強制する単なるサブビューではなく、セルであるとテーブルに想定させている可能性があります。運が良ければ、コントロールが適切な場所に設定される場合がありますが、これも未定義の動作の結果です。

UITableViewControllerは制限クラスを意図したものではなく、「複数のテーブルビュー」(とにかく新しいビューコントローラーを提示する必要があるほどコンテキスト固有に聞こえる)の実装を妨げるものではありません。クラスごとに定型文を作成する必要がある場合は、実装するテーブルビューごとに抽象スーパークラスコントローラーを作成し、必要に応じてサブクラス化します。

1
CodaFi

@available(iOS 10.0、*)

tableView.refreshControl = refreshControl

0
Oleja

この方法でプッシュビューコントローラーを追加してみてください。

テーブルビューコントローラを作成し、既存のビューコントローラのサブビューとして追加します。次に、テーブルビューとリフレッシュコントローラーをテーブルビューコントローラーのプロパティに割り当てます。

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];
0
Anand Prem