UITableView UIRefreshControl не показывает свое представление в первый раз

Я добавил функциональность UIRefreshControl в свой проект, который использует UITableView. Приложение работает путем получения записей из веб-службы в табличное представление. Ниже приведен код, который я использовал для добавления UIRefreshControl:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    refreshControl.tintColor = [UIColor grayColor];
    refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Updating New Entries"];
    [refreshControl addTarget:self action:@selector(pullToRefresh) forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;

    [self pullToRefresh];    
}

- (void) pullToRefresh
{
    counter = 1;
    [self fetchEntriesNew:counter]; // My code for updating table view

    [self performSelector:@selector(updateTable) withObject:nil afterDelay:2];
}

- (void)updateTable
{
    [self.tableView reloadData];
    [self.refreshControl endRefreshing];
}

Теперь, если я потяну, чтобы обновить, он обновится, добавив новые записи, если они есть, и покажет мне следующее представление поверх табличного представления:

введите описание изображения здесь

Все работает отлично, за исключением случаев, когда приложение запускается или открывается в первый раз, оно не отображает представление, которое я показал на изображении выше, хотя оно обновляет представление таблицы. Я хочу, чтобы он отображал элемент управления обновлением каждый раз, когда он обновляет его. Может ли кто-нибудь указать, что я делаю не так? Спасибо!

ОБНОВЛЕНИЕ: я добавил [self refreshControl beginRefreshing], и теперь представление счетчика UIRefreshControl отображается, но оно находится над первой записью представления таблицы. Может кто подскажет, как исправить?


person AJ112    schedule 19.06.2013    source источник


Ответы (4)


Какое-то время эта проблема меня действительно озадачивала: я обнаружил, что у 4-дюймовых устройств iOS этой проблемы нет, а у 3,5-дюймовых есть.

Я попытался выяснить, чем отличается первый раз, когда refreshControl начал обновление самого себя, и когда я использовал жест вытягивания.

И я проверил документ Apple на UIRefreshControl, там написано The control does not initiate the refresh operation directly. Instead, it sends the UIControlEventValueChanged event when a refresh operation should occur.

Поэтому я подумал, может быть, я мог бы добавить что-нибудь, имитирующее жест тяги, чтобы вызвать отображение refreshControl.

[yourScrollView(or tableView) setContentOffset:CGPointMake(0.0f, -60.0f)
                                      animated:YES];
[yourRefreshControl beginRefreshing];

Работает!

PS. UIRefreshControl также работает с UIScrollView. [yourScrollView addSubview:yourRefreshControl] просто работает.

person satgi    schedule 19.10.2013
comment
Судя по вашему ответу, вы можете решить эту проблему. Я пробовал ваш код, но у меня это не сработало. Я использовал этот [self.tableView setContentOffset: CGPointMake (0.0f, 60.0f) animated: YES]; [self.refreshControl beginRefreshing]; - person AJ112; 19.10.2013
comment
Теперь первая ячейка табличного представления находится почти за панелью навигации. Подскажите, как это исправить? - person AJ112; 19.10.2013
comment
Привет, @ AJ112, в моем коде -60.0f, а не 60.0f. - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated предназначен для установки смещения, поэтому смещение здесь должно быть отрицательным, чтобы имитировать жест опускания, если он установлен положительным, верх содержимого будет за пределами окна . - person satgi; 19.10.2013
comment
Я добавил и -60, и 60 и попытался добавить другие значения, но результат точно такой же. По умолчанию он находится в обычном месте, но после завершения загрузки первая ячейка перемещается под панель навигации. Что еще мне нужно сделать, чтобы это исправить? - person AJ112; 19.10.2013
comment
для людей, которые не могут заставить его работать таким образом: stackoverflow.com/questions/40154014/ - person Dbl; 20.10.2016

Я бы переместил ваш вызов [self pullToRefresh] в viewWillAppear вместо viewDidLoad.

person Dan    schedule 19.06.2013
comment
Я добавил [self pullToRefresh] в viewWillAppear, но не увидел разницы в выводе. Что еще я могу сделать? - person AJ112; 19.06.2013
comment
Можете ли вы опубликовать изображение того, что вы видите, что НЕ является желаемым результатом? Перечитывая это, я просто хочу убедиться, что полностью понимаю проблему. - person Dan; 19.06.2013
comment
Когда приложение запускается, TableView обновляется с новыми данными, но счетчик не отображается сам по себе. Но если я обновлюсь вручную, он появится. Надеюсь, что это устранит путаницу - person AJ112; 19.06.2013
comment
какой спиннер? тот, что на панели навигации, или тот, что под ним? - person Dan; 19.06.2013
comment
тот, что панель навигации добавлена ​​мной программно, поэтому она всегда отображается. Я говорю о следующем, добавленном UIRefreshControl. - person AJ112; 19.06.2013

Есть две вещи, которые можно сделать, чтобы добавить UIRefreshControl в ваш tableview, ни один из них не добавлен в ваш код.

1. [self setRefreshControl:tableRefreshControl];
2. [self.m_TableView addSubview:tableRefreshControl];

Либо добавьте 1, либо 2, если ваш класс является подклассом UIViewController.

Если ваш класс является подклассом UITableViewController, попробуйте заменить

self.refreshControl = refreshControl; with 2 line
person channi    schedule 19.06.2013
comment
Мой класс является подклассом UITableViewController, поэтому, как вы сказали, мне нужно заменить self.refreshControl = refreshControl на [self.tableView addSubview: tableRefreshControl]; а что такое tableRefreshControl? он не узнает его, потому что он не объявлен ни где, ни как встроенная вещь. Можете уточнить? Спасибо! - person AJ112; 19.06.2013

перед кодом :

[refreshControl beginRefresh]

вставьте код :

[refreshControl layoutIfNeeded]

person Nirav Ghori    schedule 03.02.2017