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

Спасибо, тонна!

Ответ 1

Это может быть проблемой из-за того, что вы добавляете _refreshControl в качестве подсмотра, который не должен выполняться. Однако вы можете создать объект UITableViewController, добавив его в качестве контроллера дочернего представления вашего текущего класса 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];

Ответ 2

Быстрое исправление этого должно идти следующим образом

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

Ответ 3

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

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

Ответ 4

Попробуйте этот способ, чтобы добавить контроллер просмотра.

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

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