Заголовок, смещенный в 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 для каждого из них?

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

4 ответа

Решение

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

Например:

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

Быстрое решение этого состоит в том, чтобы пойти как это

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;

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

@available(iOS 10.0, *)

tableView.refreshControl = refreshControl

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

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

Попробуйте этот способ добавить контроллер 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];
Другие вопросы по тегам