Заголовок перемещен в 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];