Заголовок, смещенный в TableView с помощью UIRefreshControl
Мой UIRefreshController делает что-то странное. Когда я опускаю обновление, заголовки tableView смещаются.
Если я выпадаю, это выглядит нормально, но если я прокручиваю таблицу вниз, пока освежитель все еще работает, заголовки смещаются на высоту элемента управления обновлением, в то время как UITableCells в порядке и прокручиваются за заголовком.
Я хочу избежать создания 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];