上一次我们实现了缓存图片加载,这一次我们在上次的基础上加上下拉刷新,上拉加载。
Paste_Image.png
申明var data:NSArray = NSArray()
,作为获取数据的储存,网络数据获取到后都放入data.下面创建下拉刷新和上拉加载。
var refreshing: Bool = false {
didSet {
if (self.refreshing) {
self.refreshControl?.beginRefreshing()
self.refreshControl?.attributedTitle = NSAttributedString(string: "Loading...")
println("Loading...")
}
else {
self.refreshControl?.endRefreshing()
self.refreshControl?.attributedTitle = NSAttributedString(string: "Pull to Refresh")
println("Loaded & set:Pull to Refresh")
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
//添加下拉刷新
self.refreshControl = UIRefreshControl()
self.refreshControl?.addTarget(self, action: "onPullToFresh", forControlEvents: UIControlEvents.ValueChanged)
self.tableView.addSubview(refreshControl!)
//上拉刷新
self.setupInfiniteScrollingView()
}
//下拉获取数据
func onPullToFresh() {
fetchDataFromServer()
}
//上拉刷新
private func setupInfiniteScrollingView() {
self.infiniteScrollingView = UIView(frame: CGRectMake(0, self.tableView.contentSize.height, self.tableView.bounds.size.width, 60))
self.infiniteScrollingView!.autoresizingMask = UIViewAutoresizing.FlexibleWidth
self.infiniteScrollingView!.backgroundColor = UIColor.whiteColor()
var activityViewIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.White)
activityViewIndicator.color = UIColor.darkGrayColor()
activityViewIndicator.frame = CGRectMake(self.infiniteScrollingView!.frame.size.width/2-activityViewIndicator.frame.width/2, self.infiniteScrollingView!.frame.size.height/2-activityViewIndicator.frame.height/2, activityViewIndicator.frame.width, activityViewIndicator.frame.height)
activityViewIndicator.startAnimating()
self.infiniteScrollingView!.addSubview(activityViewIndicator)
}
实现上拉加载的原理:
1.cellForRowAtIndexPath 中判断下拉位置,执行加载操作
2.第一次申请的数据(数组)放入data
3.第二次以后申请的数据使用arrayByAddingObjectsFromArray
往data填充,更新tableView
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell
//当下拉到底部,执行loadMore()
if (loadMoreEnabled && indexPath.row == self.data.count-1) {
self.tableView.tableFooterView = self.infiniteScrollingView
loadMore()
}
return cell
}
func loadMore(){
println("loadMore")
self.data = self.data.arrayByAddingObjectsFromArray(self.newData as! [String])
self.tableView.reloadData()
}
网友评论
比较合适的方法是在scrollView的didEndDeacceleration里面检查是否滚动到了底部再loadMore
不过好多情况下设计就是不想用系统样式,我写了一个自定义的 http://www.jianshu.com/p/c5bc2d8c68e4 如果需要自定义的话可以试试。