Я пытаюсь реализовать функцию «тянуть для обновления» в UITableView в UIViewController. Я не могу использовать UITableViewController, потому что я хочу, чтобы UITableView был меньшим подвидом в контроллере представления с некоторыми другими вещами над ним. Я предполагаю, что это возможно, но кто-нибудь видел его реализацию?
Потяните, чтобы обновить UITableView без UITableViewController
Ответы (6)
Добавьте элемент управления обновлением непосредственно в UITableView
без использования UITableViewController
:
override func viewDidLoad() {
super.viewDidLoad()
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)
if #available(iOS 10.0, *) {
tableView.refreshControl = refreshControl
} else {
tableView.backgroundView = refreshControl
}
}
@objc func refresh(_ refreshControl: UIRefreshControl) {
// Do your job, when done:
refreshControl.endRefreshing()
}
tableView.insertSubview(refreshControl, atIndex: 0)
вместо tableView.addSubview(refreshControl)
- person kbpontius; 16.12.2015
Цель-C:
Вот как вы можете реализовать вытягивание для обновления для представления таблицы. То же, что и в случае просмотра коллекции. Просто замените выделенное табличное представление представлением коллекции.
UITableView *tableViewDemo = [[UITableView alloc]init];
tableViewDemo.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
tableViewDemo.dataSource = self;
tableViewDemo.delegate = self;
[self.view addSubView: tableViewDemo];
UIRefreshControl *refreshController = [[UIRefreshControl alloc] init];
[refreshController addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[tableViewDemo addSubview:refreshController];
#pragma mark - Handle Refresh Method
-(void)handleRefresh : (id)sender
{
NSLog (@"Pull To Refresh Method Called");
[refreshController endRefreshing];
}
Это решение от @berik отлично работает, но UIController отображается поверх UITableViewController. Чтобы исправить это, внесите следующие изменения:
override func viewDidLoad() {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
tableView.backgroundView = refreshControl // <- THIS!!!
}
func refresh(refreshControl: UIRefreshControl) {
// Do your job, when done:
refreshControl.endRefreshing()
}
refreshControl
исчезнуть, а не отображаться под tableView
. Я исправил это: tableView.insertSubview (refreshControl, atIndex: 0) вместо tableView.addSubview (refreshControl)
- person kbpontius; 16.12.2015
Я реализовал EGORefreshTableHeaderView с UIViewController и простым табличным представлением, трюк в том, что a в тех местах, где EGO принимает прокручиваемый вид в качестве параметра, если вы посмотрите, само табличное представление наследуется от прокручиваемого представления.
Для этого требуется только это и несколько дополнительных подключений :)
Надеюсь это поможет.
Кажется, что если вы создадите UIRefreshControl внутри метода loadView viewController, все будет работать нормально. UIRefreshControl ведет себя должным образом. Протестировано с iOS 7.1 и iOS 8.2.
В итоге я использовал ODRefreshControl. Он не требует взлома, подобного приведенному выше tableView.backgroundView = refreshControl
, работает почти так же и дает более красивый интерфейс.