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

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


当前回答

UIRefreshControl是一个UIView子类,你可以单独使用它。但我不确定它是如何呈现的。渲染可以简单地依赖于帧,但它也可以依赖于UIScrollView或UITableViewController。

无论哪种方式,它都将是一种hack而不是优雅的解决方案。我建议你找一个第三方的克隆版本,或者自己写一个。

ODRefreshControl

SlimeRefresh

其他回答

为了消除由接受的答案引起的口吃,你可以将你的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];
}

UIRefreshControl是一个UIView子类,你可以单独使用它。但我不确定它是如何呈现的。渲染可以简单地依赖于帧,但它也可以依赖于UIScrollView或UITableViewController。

无论哪种方式,它都将是一种hack而不是优雅的解决方案。我建议你找一个第三方的克隆版本,或者自己写一个。

ODRefreshControl

SlimeRefresh

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

相反,我嵌入了一个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
    }

    ...
}

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

尝试在tableView重新加载其内容后延迟调用refreshControl -endRefresh方法几分之一秒,可以使用NSObject的-performSelector:withObject:afterDelay:或GCD的dispatch_after。

我在UIRefreshControl上创建了一个类别:

@implementation UIRefreshControl (Delay)

- (void)endRefreshingAfterDelay:(NSTimeInterval)delay {
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self endRefreshing];
    });
}

@end

我测试了它,这也适用于集合视图。我注意到,一个小到 0.01秒就足够了:

// My data refresh process here while the refresh control 'isRefreshing'
[self.tableView reloadData];
[self.refreshControl endRefreshingAfterDelay:.01];