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


Мой UIRefreshController делает что-то странное. Когда я раскрываю обновление, заголовки tableView смещаются.

Если я потяну вниз, это выглядит нормально, но если я прокручиваю вниз таблицу, в то время как обновление все еще работает, заголовки смещаются на высоту элемента управления refresh, в то время как 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 28

4 ответа:

Это может быть проблемой из-за того, что вы добавляете _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];

Быстрое решение этой проблемы заключается в следующем

Цель-С

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

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

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

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

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

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