Потяните, чтобы обновить UITableView внутри UIViewController

Я пытаюсь реализовать функцию обновления в своем приложении. Архитектура такова, что UITableView находится внутри UIViewController. Я хочу иметь возможность обновлять табличное представление при опускании. Я попробовал приведенный ниже код в методе viewDidLoad, но он не работает. Может ли кто-нибудь сказать мне, где я ошибаюсь в реализации?

UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
    refresh.tintColor = [UIColor grayColor];
    refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"];
    [refresh addTarget:self action:@selector(get_vrns) forControlEvents:UIControlEventValueChanged];
    [self.vrnTable addSubview:refresh];

person Hassan Zaheer    schedule 22.11.2013    source источник
comment
возможный дубликат UIRefreshControl без UITableViewController   -  person Amar    schedule 22.11.2013
comment
возможный дубликат Потяните, чтобы обновить UITableView без UITableViewController   -  person Lanorkin    schedule 07.09.2014


Ответы (11)


UIRefreshControl без UITableViewController

Или вы можете использовать UITableViewController вместо UIViewController.

person Evgeniy S    schedule 22.11.2013
comment
Не могу этого сделать из-за некоторых ограничений. Есть ли обходной путь, чтобы мне не нужно было менять архитектуру. - person Hassan Zaheer; 22.11.2013
comment
Амар публикует хорошую ссылку над вашим вопросом. stackoverflow.com/questions/12497940/ - person Evgeniy S; 22.11.2013

Поскольку вы не можете использовать UITableViewController вместо UIViewController, попробуйте сделать это:

UITableViewController *tableViewController = [[UITableViewController alloc] init];
tableViewController.tableView = self.vrnTable;

UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
refresh.tintColor = [UIColor grayColor];
refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"];
[self.refresh addTarget:self action:@selector(get_vrns) forControlEvents:UIControlEventValueChanged];

tableViewController.refreshControl = self.refresh;

Надеюсь это поможет!

person aksh1t    schedule 22.11.2013

Обновленный ответ для Swift 1.2

    var refreshControl = UIRefreshControl()
    refreshControl.backgroundColor = blue
    refreshControl.tintColor = UIColor.whiteColor()
    refreshControl.addTarget(self, action: Selector("yourFunctionHere"), forControlEvents: UIControlEvents.ValueChanged)
    self.tableView.addSubview(refreshControl)
person leerob    schedule 04.05.2015
comment
добавление refreshControll в качестве подвида tableview также работает с целью c - person Husein Behboudi Rad; 23.03.2016

вы можете увидеть здесь: UIRfreshControl в UIViewController (с UITableView)

@interface MyViewController ()
{
    UIRefreshControl *refreshControl;
}
  @property (weak, nonatomic) IBOutlet UITableView *tableView;
@end

@implementation MyViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIView *refreshView = [[UIView alloc] initWithFrame:CGRectMake(0, 55, 0, 0)];
    [self.tableView insertSubview:refreshView atIndex:0]; //the tableView is a IBOutlet

    refreshControl = [[UIRefreshControl alloc] init];
    refreshControl.tintColor = [UIColor redColor];
    [refreshControl addTarget:self action:@selector(reloadDatas) forControlEvents:UIControlEventValueChanged];
    /* NSMutableAttributedString *refreshString = [[NSMutableAttributedString alloc] initWithString:@"Pull To Refresh"];
    [refreshString addAttributes:@{NSForegroundColorAttributeName : [UIColor grayColor]} range:NSMakeRange(0, refreshString.length)];
    refreshControl.attributedTitle = refreshString; */
    [refreshView addSubview:refreshControl];
}

-(void)reloadDatas
{
   //update here...

   [refreshControl endRefreshing];
}

@end

http://www.g8production.com/post/79514553078/ios7-and-uirefreshcontrol-in-uiviewcontroller-with

person ldt25290    schedule 13.04.2014

Если ваше приложение поддерживает только iOS 6 (и более поздние версии): я предлагаю UIRefreshControl

Если вы также поддерживаете iOS 5, вы можете использовать https://github.com/enormego/EGOTableViewPullRefresh.

person Nhat Dinh    schedule 27.06.2014

Для обратной совместимости Swift 3 и iOS

var refreshControl = UIRefreshControl()
let string = "Pull to refresh"
let attributedString = NSMutableAttributedString(string: string)
    attributedString.addAttributes([NSFontAttributeName:UIFont.systemFont(ofSize: 16)),NSForegroundColorAttributeName:UIColor.white], range: NSRange.init(location: 0, length: string.characters.count))
self.refreshControl.attributedTitle = attributedString
self.refreshControl.tintColor = UIColor.white
self.refreshControl.addTarget(self,
                             action: #selector(self.pulledDownForRefresh),
                             for: .valueChanged)
if #available(iOS 10.0, *) {
    self.accountSummaryTableView.refreshControl = refreshControl
} else {
    self.accountSummaryTableView.addSubview(refreshControl)
}

func pulledDownForRefresh() {
     //do some opertaion and then call
    self.refreshControl.endRefreshing()
}
person Satheesh    schedule 28.04.2017

Попробуйте готовые элементы управления. Их намного проще реализовать

https://www.cocoacontrols.com/controls/pullorefreshtransform

https://www.cocoacontrols.com/controls/qbrefreshcontrol

https://www.cocoacontrols.com/controls/mspulltorefreshcontroller

person Jay Gajjar    schedule 22.11.2013


Я думаю, вам нужно установить элемент управления обновлением UITableView. Мне нужно увидеть больше вашего кода и просмотреть структуру, чтобы диагностировать проблему.

Вот руководство для Objective-C и Swift: http://www.jackrabbitmobile.com/design/ios-custom-pull-to-refresh-control/

person Anthony Blatner    schedule 27.02.2015

Для Свифт 3:

var refreshControl: UIRefreshControl!

override func viewDidLoad() {
    super.viewDidLoad()

    self.refreshControl = UIRefreshControl()

    self.refreshControl.tintColor = UIColor.black
    self.refreshControl.addTarget(self,
                                  action: #selector(ViewController.pullToRefreshHandler),
                                  for: .valueChanged)

    self.tableView.addSubview(self.refreshControl)
}

@objc func pullToRefreshHandler() {
    // refresh table view data here
}
person pableiros    schedule 22.11.2016

person    schedule
comment
Не могли бы вы добавить некоторые пояснения? - person Sal00m; 27.06.2014