无法覆盖可变属性' refreshControl'类型' UIRefreshControl?'与协变型' UIRefreshControl'

时间:2018-01-17 11:03:01

标签: ios swift uitableview uirefreshcontrol

我在tableview中使用UIRefreshControl来获取新数据。但是当我定义控件时,错误显示如下。我已经搜索了一段时间,但没有找到任何有用的东西。

我使用Xcode版本9.2(9C40b),swift4,IOS11.2

  

无法覆盖mutable属性' refreshControl'类型   ' UIRefreshControl&#39?;与协变类型' UIRefreshControl'

var refreshControl = UIRefreshControl()

enter image description here

3 个答案:

答案 0 :(得分:5)

如果你想定义另一个控件,那么更改名称...... refreshControl是一个UIScrollView/UITableViewController ivar,因为iOS10 / iOS6 [分别]。您正在尝试重新定义它,这就是导致错误的原因。或者你可以使用提供的那个。

你的意思可能是self.refreshControl = UIRefreshControl()

答案 1 :(得分:2)

迅速4/5

override func viewDidLoad() {
    super.viewDidLoad()

    self.refreshControl = UIRefreshControl()
    self.refreshControl!.attributedTitle = NSAttributedString(string: "Pull to refresh")
    self.refreshControl!.addTarget(self, action: #selector(refresh(sender:)), for: UIControl.Event.valueChanged)

}

@objc func refresh(sender:AnyObject) {
   // Code to refresh table view

    self.refreshControl!.endRefreshing()
}

答案 2 :(得分:0)

编译器阻止您在子类中指定比超类设置的更严格的要求。

假设编译器允许您覆盖非Optional类型的Optional属性。如果有人这样做会发生什么:

let tableView: UITableView = CoolTableViewSubclass()
tableView.refreshControl = nil // but my overridden property can't be nil!

作为一个子类,当有人像对待你的超类一样对待你时,你需要工作正常。因此,在这种情况下,编译器会阻止您,因为它已经可以告诉您违反此规则。

Mike Ash wrote this up in an unsurprisingly good post if you're curious.