Заголовок смещен в TableView с помощью UIRefreshControl

Мой 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];

У меня есть много таблиц в разных контроллерах представления, которым требуется эта функциональность. Можно ли как-то избежать создания UITableViewController для каждого из них?

Благодаря тонну!


person Dave    schedule 05.03.2013    source источник
comment
Разместите изображение на некоторых сторонних сайтах для загрузки изображений и поделитесь ссылками здесь. Мы можем помочь вам разместить изображения здесь.   -  person iDev    schedule 06.03.2013
comment
возможный дубликат UIRefreshControl без UITableViewController. Вместо того, чтобы сосредоточиться на отказе от использования UITableViewController, вам следует сосредоточиться на создании абстрактного суперкласса, который вы легко расширяете, добавляя определенные функции к каждой таблице. Контроллеры дешевые, я удивлен, что вы их не любите.   -  person CodaFi    schedule 06.03.2013
comment
Хорошая идея, спасибо! При первом обновлении это выглядит так: tinypic.com/view.php?pic=2a8hqti&s= 6, то при прокрутке вниз это выглядит так: tinypic.com/view. php?pic=acssrb&s=6   -  person Dave    schedule 06.03.2013
comment
Я не верю, что это дубликат этого поста, его код на самом деле такой же, как и ответ на вопрос из поста, на который вы ссылаетесь.   -  person JonathanC    schedule 06.03.2013
comment
@JonathanC он спрашивает, почему это не работает (на это есть ответ в ответе на другой вопрос (в другом посте это детали реализации и хак, который сработал)) Почему это не обман?   -  person CodaFi    schedule 06.03.2013
comment
@Dave, за все проблемы, изложенные в этом посте, вы должны признать, что принятый ответ показывает, сколько они решают для нас автоматически. Кроме того, имея доступ к внутренностям UITableView, они всегда знают о ненужных деталях реализации, которые вызывают у вас головную боль. На самом деле я бы не предложил воссоздавать их, а скорее создавать подклассы и использовать этот подкласс в качестве абстрактного суперкласса, который я продолжаю поднимать.   -  person CodaFi    schedule 06.03.2013
comment
Я столкнулся с той же проблемой, когда заголовок быстро перемещался вниз, а затем снова подскакивал, когда табличное представление отскакивало внизу. Я исправил это, переключившись с использования собственного табличного представления на использование UITableViewController.   -  person sudoExclaimationExclaimation    schedule 28.01.2016


Ответы (5)


Это может быть проблемой из-за того, что вы добавляете _refreshControl в качестве подпредставления, что не должно быть сделано. Однако вы можете создать объект UITableViewController, добавив его в качестве дочернего контроллера представления вашего текущего класса контроллера представления.

Например: -

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];
person iDev    schedule 05.03.2013
comment
Что, если я не использую UITableViewController, а вместо этого использую UITableView. - person Hemang; 10.06.2015
comment
Иерархия просмотра для моего контроллера выглядит следующим образом: view -> scrollview -> - TableView_1 и TableView_2. - person Hemang; 10.06.2015
comment
На самом деле мне удалось заставить его работать, вызвав: [self.tableView setContentOffset:CGPointMake(0, -1) animated:YES]; после того, как элемент управления обновлением был добавлен в табличное представление. - person Pontus; 13.01.2016
comment
@Pontus у меня есть uitablview, чем я могу справиться? - person ramesh bhuja; 24.06.2016
comment
@rameshbhuja просто добавьте: [self.tableView setContentOffset:CGPointMake(0, -1) animated:YES]; в метод - (void)viewDidLoad ПОСЛЕ того, как вы добавите UIRefreshControl следующим образом: tableViewController.refreshControl = [[UIRefreshControl alloc] init]; - person Pontus; 25.06.2016
comment
@rameshbhuja Нет никакой разницы. В контроллере представления просто добавьте указанные выше строки, подключенные к выходу табличного представления. - person Pontus; 25.06.2016

быстро исправить это, чтобы пойти так

Цель-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, и другие вещи, связанные с раскадровкой, с которыми вам не хочется возиться.

person Fonix    schedule 25.09.2014

UIRefreshControl не предназначены для подвидов, они предназначены (буквально) для управления обновлением таблицы. UITableViewController имеет выход специально для них (опять же, буквально называется refreshControl), который вы должны использовать. В качестве подпредставления таблицы вы можете заставить таблицу предполагать, что это ячейка, а не просто подпредставление, что вызывает перерасчет вокруг нее. Будут случаи, когда вам повезет, и элемент управления может установить себя в нужное место, но это, опять же, результат неопределенного поведения.

UITableViewController не предназначен для того, чтобы быть ограничивающим классом, и он, безусловно, не должен удерживать вас от реализации «множественных табличных представлений» (которые звучат достаточно специфично для контекста, чтобы в любом случае гарантировать наличие нового контроллера представления). Если вас беспокоит необходимость написания шаблона для каждого класса, напишите абстрактный контроллер суперкласса для каждого табличного представления, которое вы хотите реализовать, и при необходимости подклассируйте его.

person CodaFi    schedule 05.03.2013

Попробуйте таким образом добавить push-контроллер представления.

Создайте контроллер табличного представления и добавьте его в качестве подчиненного представления существующего контроллера представления. Затем назначьте свои контроллеры табличного представления и обновления свойствам контроллера табличного представления.

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];
person Anand Prem    schedule 25.02.2016

@доступно (iOS 10.0, *)

tableView.refreshControl = RefreshControl

person Oleja    schedule 05.11.2019