繁体   English   中英

当我回到视图控制器时刷新 tableview 顶部的控件

[英]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 = trueclipToBounds = 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM