web-dev-qa-db-ja.com

iOS 10.0 UIRefreshControlがインジケーターを表示しない

私は[Pull down to refresh]機能を持つUITableViewを使用していますが、[self.refreshControl beginRefreshing]を呼び出したときに、Pull down to refresh機能のスピナーが表示されません。

上記のコードはviewDidLoad内で呼び出され、テーブルが最初に一部のデータをロードしています。最初の更新後にプルダウンを実行して更新すると、スピナーは正常に動作します。タイトルは表示されますが、スピナーは表示されません。

カントはこの問題を解決するようです。 iOS 9.3.2では正常に機能しますが、iOS 10では機能しません。

これが私が現在使用しているコードです。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setupView];
    [self customSetup];
    self.refreshControl = [[UIRefreshControl alloc] init];
    self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Updating Discounts..."];
    [self.refreshControl addTarget:self action:@selector(reloadDeals) forControlEvents:UIControlEventValueChanged];
    [self.refreshControl beginRefreshing];
    [self.tableView setContentOffset:CGPointMake(0, -self.refreshControl.frame.size.height) animated:YES];
}

よろしくお願いします

18
dogwasstar

コードの前:

[refreshControl beginRefresh]

コードを挿入:

[refreshControl layoutIfNeeded]

23
weirdyu

ViewDidLoadでの更新呼び出しの遅延は私にとってはうまくいきました:

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.refreshControl beginRefreshing];
});
3
user6869501

IOS 10で修正するには、[self.view layoutIfNeeded]を呼び出す必要があります。私の場合、viewDidLoadを呼び出すだけで十分でした(そのプロジェクトでストーリーボードを使用していました)。その他の場合は、viewWillAppearの方が適しています。

- (void)viewDidLoad
  {
   [super viewDidLoad];
   [self.view layoutIfNeeded];
   ...
2
Thorax

@jprosと同じですが、Swift

if #available(iOS 10.0, *) {
    tableView.refreshControl = refreshControl
} else {
    tableView.addSubview(refreshControl)
}
refreshControl.layoutIfNeeded()
refreshControl.beginRefreshing()
1
givip

これは、iOS 10で報告されている既知のバグです。

レーダーrdar:// 27468436

回避策があるかどうかはわかりません。

1
Dejan Skledar

私はviewDidLoad()から呼び出すことでこれを修正することができました:

refreshControl.layoutIfNeeded()
0
AlexD

IOS10では、UITableViewまたはUICollectionViewのsetRefreshControlを使用してUIRefreshControlを追加する必要があります。

if([self.tableView respondsToSelector:@selector(setRefreshControl:)]) {
    [self.tableView setRefreshControl:self.refreshControl];
}
else {
    [self.tableView addSubview:self.refreshControl];
}
[self.refreshControl layoutIfNeeded];
[self.refreshControl beginRefreshing];
0
jpros

更新インジケーターが表示されない場合は、テーブルビューまたはスクロールビューのInterface BuilderでBounce Verticallyを有効にしてみてください。

0
DarkoM