[英]Refresh Control on top of tableview when I go back to view controller
出于某种原因,第一次加载视图控制器时,刷新控件的行为符合预期(向下滑动时显示在 tableview 下)。 问题是当我点击另一个选项卡,然后返回视图控制器时,刷新控件不再淡入并且在 tableview 顶部可见。
这是代码的一部分:
class CoreTableViewController : UIViewController, UITableViewDataSource, UITableViewDelegate {
var tableView:UITableView!
var tableData:Array<AnyObject> = []
var dataFetched:Bool = false
var refreshControl:UIRefreshControl?
override func viewDidLoad() {
super.viewDidLoad()
self.edgesForExtendedLayout = UIRectEdge.None;
self.tableView = self.assignTableView()
self.tableView.delegate = self
self.tableView.dataSource = self
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
if self.enableRefresher() {
self.setRefreshControl()
}
}
func enableRefresher() -> Bool {
return true
}
func fetchData(cleanFirst:Bool = false) {
// Fetch data.
}
func refresh() {
self.fetchData(true)
self.refreshControl!.endRefreshing()
}
func setRefreshControl() {
self.refreshControl = UIRefreshControl()
//self.refreshControl!.attributedTitle = NSAttributedString(string: "Actualizar")
self.refreshControl!.addTarget(self, action: #selector(CoreTableViewController.refresh), forControlEvents: UIControlEvents.ValueChanged)
self.tableView.addSubview(refreshControl!)
}
}
有什么想法吗?
我在这里找到了修复: https : //stackoverflow.com/a/29088409/209200
而不是self.tableView.addSubview(refreshControl!)
,它应该是self.tableView.insertSubview(refreshControl!, atIndex: 0)
。
这导致 refres 控件出现在 tableview 上。
尝试将 z 索引设置为 -1,这意味着 UIRefreshControl 位于任何视图之后。
refreshControl.layer.zPosition = -1
和
tableView.refreshControl?.beginRefreshing()
self.tableView.refreshControl?.endRefreshing()
两者必须成对使用。
试试这个,
上述解决方案很好,但 tableView.refreshControl 仅适用于 UITableViewController,直到 iOS 9.x 并且从 iOS 10.x 开始出现在 UITableView 中。
要解决这个问题只需使用:
用 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)
在索引 0 处插入刷新控件不起作用,只需将其设置为 tableview 的背景视图:
tableView.backgroundView = refreshControl
当我检查您的代码和您的问题时,我认为问题出在这里:
“除了将刷新控件分配给表视图控制器的refreshControl
属性之外,您还必须配置控件本身的目标和操作。” https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIRefreshControl_class/index.html#//apple_ref/occ/instm/UIRefreshControl/endRefreshing
因此,根据文档,您需要使用 UITableViewController,而不是 UIViewController。 并设置它的 refreshControl 属性。
在当前状态下,您只需将 UIRefreshControl 添加为常规子视图。
看起来没问题,我怀疑这是因为与控件本身的创建有关的一些竞争条件。 我发现在这种情况下使用惰性属性有很大帮助。 我会做这样的事情:
lazy var refreshControl: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action:#selector(CoreTableViewController.refresh(_:)), forControlEvents: .ValueChanged)
return refreshControl
}()
override public func viewDidLoad() {
super.viewDidLoad()
if self.enableRefresher() {
tableView.addSubview(refreshControl)
}
........
}
func refresh(refreshControl: UIRefreshControl) {
self.fetchData(true)
refreshControl.endRefreshing()
}
您不需要使用 TableViewController,一个 UIViewController 就足够了,而且通常更灵活。
希望它有帮助
不幸的是,上面没有一个解决方案对我有帮助。
在我的情况下,当表视图为空时重新加载表视图后会出现刷新控件。 也许如果表视图至少有一行它只是隐藏了刷新控件,我还没有检查它。 此外,当我的视图控制器再次出现时,它就像一种解决方法,它隐藏了刷新控件。
但是我找到了另一种解决方法来立即隐藏刷新控件。 async
调用在这里是强制性的。
tableView.reloadData()
DispatchQueue.main.async {
refreshControl.endRefreshing()
}
我在另一篇文章中受到了这个答案的启发。
对我来说,在表视图的第 0 个索引处使用插入并像惰性变量一样初始化:
private lazy var refreshControl: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.tintColor = .gray
refreshControl.addTarget(self, action: #selector(refreshFollowingList(_:)), for: .valueChanged)
return refreshControl
}()
func setupRefresher() {
self.tableView.insertSubview(refreshControl, at: 0)
}
override func viewDidLoad() {
super.viewDidLoad()
setupRefresher()
}
如果我刚刚将惰性变量分配给 tableviews 刷新控件,它会在 109 像素的内容偏移 20 像素处跳转,所以我像这样修复了它。 我使用的是 UIViewController 而不是 UITableViewController,希望这会有所帮助
我们必须做一个简单的配置来将 UIRefreshControl 分配给 tableView,如下所示。
@IBOutlet weak var tableView : UITableView! {
didSet {
tableView.dataSource = self
tableView.delegate = self
tableView.refreshControl = UIRefreshControl()
tableView.refreshControl?.addTarget(self, action: #selector(handleRefresh(_:)), for: UIControl.Event.valueChanged)
}
}
现在添加 handleRefresh 方法来处理您的逻辑
@objc
func handleRefresh(_ refreshControl: UIRefreshControl) {
// Here i am disabling the user interaction while refreshing
tableView.alpha = 0.5
self.view.isUserInteractionEnabled = false
// Get your work done here
// At the end stop the refresh control and enable user interaction again.
tableView.refreshControl?.endRefreshing()
tableView.alpha = 1.0
self.view.isUserInteractionEnabled = true
}
现在,当您从另一个选项卡返回时,刷新控件将停止旋转。 因此,要处理添加以下代码行...
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Here we are forcefully end refreshing and again starting, as we know it works when we scroll down the table. We are doing it programmatically.
if tableView.refreshControl!.isRefreshing {
let contentOffset = tableView.contentOffset
tableView.refreshControl?.endRefreshing()
tableView.refreshControl?.beginRefreshing()
tableView.contentOffset = contentOffset
}
}
希望它能帮助人们:-)
UIRefreshControl 的容器视图与 UIView 类似,您也应该设置isOpaque = true
和clipToBounds = true
。
private lazy var refreshControl: UIRefreshControl = {
let refreshControl = UIRefreshControl(frame: .zero)
refreshControl.isOpaque = true
refreshControl.clipsToBounds = true
refreshControl.backgroundColor = .black
refreshControl.addTarget(self, action: #selector(self.refresh(_:)), for: .valueChanged)
return refreshControl
}()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.