只是好奇,因为它不立即看起来可能,但有一种狡猾的方式来利用新的iOS 6 UIRefreshControl类而不使用UITableViewController子类吗?

我经常使用带有UITableView子视图的UIViewController,并符合UITableViewDataSource和UITableViewDelegate,而不是直接使用UITableViewController。


当前回答

为了消除由接受的答案引起的口吃,你可以将你的UITableView分配给一个UITableViewController。

_tableViewController = [[UITableViewController alloc]initWithStyle:UITableViewStylePlain];
[self addChildViewController:_tableViewController];

_tableViewController.refreshControl = [UIRefreshControl new];
[_tableViewController.refreshControl addTarget:self action:@selector(loadStream) forControlEvents:UIControlEventValueChanged];

_theTableView = _tableViewController.tableView;

编辑:

一种添加UIRefreshControl的方法,没有UITableViewController,没有口吃,并在刷新tableview上的数据后保留漂亮的动画。

UIRefreshControl *refreshControl = [UIRefreshControl new];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.theTableView addSubview:refreshControl];
[self.theTableView sendSubviewToBack:refreshControl];

稍后在处理刷新数据时…

- (void)handleRefresh:(UIRefreshControl *)refreshControl {
    [self.theTableView reloadData];
    [self.theTableView layoutIfNeeded];
    [refreshControl endRefreshing];
}

其他回答

为了消除由接受的答案引起的口吃,你可以将你的UITableView分配给一个UITableViewController。

_tableViewController = [[UITableViewController alloc]initWithStyle:UITableViewStylePlain];
[self addChildViewController:_tableViewController];

_tableViewController.refreshControl = [UIRefreshControl new];
[_tableViewController.refreshControl addTarget:self action:@selector(loadStream) forControlEvents:UIControlEventValueChanged];

_theTableView = _tableViewController.tableView;

编辑:

一种添加UIRefreshControl的方法,没有UITableViewController,没有口吃,并在刷新tableview上的数据后保留漂亮的动画。

UIRefreshControl *refreshControl = [UIRefreshControl new];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.theTableView addSubview:refreshControl];
[self.theTableView sendSubviewToBack:refreshControl];

稍后在处理刷新数据时…

- (void)handleRefresh:(UIRefreshControl *)refreshControl {
    [self.theTableView reloadData];
    [self.theTableView layoutIfNeeded];
    [refreshControl endRefreshing];
}

基于直觉,基于DrummerB的灵感,我尝试简单地添加一个UIRefreshControl实例作为子视图到我的UITableView。它神奇地工作了!

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.myTableView addSubview:refreshControl];

这添加了一个UIRefreshControl在你的表视图和工作的预期,而不需要使用UITableViewController:)


编辑:上面的方法仍然有效,但正如一些人指出的那样,当以这种方式添加UIRefreshControl时,会有轻微的“口吃”。一个解决方案是实例化一个UITableViewController,然后设置你的UIRefreshControl和UITableView,即:

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

self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(getConnections) forControlEvents:UIControlEventValueChanged];
tableViewController.refreshControl = self.refreshControl;

你要尝试的是在ViewController中使用容器视图。你可以用专用的tableview定义干净的UITableViewController子类并把它放在ViewController中。

将刷新控件添加为子视图将在节头上方创建一个空白区域。

相反,我嵌入了一个UITableViewController到我的UIViewController中,然后改变我的tableView属性指向嵌入的那个,viola!最小的代码更改。: -)

步骤:

在Storyboard中创建一个新的UITableViewController并将其嵌入到你原来的UIViewController中 替换@IBOutlet weak var tableView: UITableView!与新嵌入的UITableViewController中的一个,如下所示


class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tableViewController = self.childViewControllers.first as! UITableViewController
        tableView = tableViewController.tableView
        tableView.dataSource = self
        tableView.delegate = self

        // Now we can (properly) add the refresh control
        let refreshControl = UIRefreshControl()
        refreshControl.addTarget(self, action: "handleRefresh:", forControlEvents: .ValueChanged)
        tableViewController.refreshControl = refreshControl
    }

    ...
}

试试这个,

上述解决方案是很好的,但tableView。refreshControl只适用于UITableViewController,直到iOS 9。x,来自iOS 10的UITableView。x开始。

写在Swift 3 -

let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(FeedViewController.loadNewData), for: UIControlEvents.valueChanged)
// Fix for the RefreshControl Not appearing in background
tableView?.addSubview(refreshControl)
tableView.sendSubview(toBack: refreshControl)