无法使用协变类型'UIRefreshControl'覆盖可变属性'type'为'UIRefreshControl?'的问题。

6

我在我的表格视图中使用UIRefreshControl来拉取新数据。但是当我定义这个控件时,出现了以下错误。我已经谷歌搜索了一段时间,但没有找到有用的信息。

我使用的是Xcode版本9.2(9C40b),Swift4,iOS11.2

无法用协变类型'UIRefreshControl'覆盖可变属性'refreshControl'的类型为'UIRefreshControl?'。

var refreshControl = UIRefreshControl()

enter image description here

3个回答

10
如果您想定义另一个控件,则更改名称...自iOS10/iOS6 [分别],refreshControlUIScrollView/UITableViewController实例变量。 您正在尝试重新定义它,这就是导致错误的原因。 或者您当然可以使用提供的那个。
您可能想要像这样写:self.refreshControl = UIRefreshControl()

3

Swift 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()
}

1
编译器防止您在子类中指定比超类设置的更严格的要求。
假设编译器允许您使用非“Optional”类型覆盖“Optional”属性。如果有人这样做会发生什么:
let tableView: UITableView = CoolTableViewSubclass()
tableView.refreshControl = nil // but my overridden property can't be nil!

作为子类,当有人把你当作你的超类时,你需要正常工作。因此,编译器在这种情况下会停止你,因为它已经能够发现你正在违反这个规则。 https://www.mikeash.com/pyblog/friday-qa-2013-02-08-subclassing-of-swift-built-in-types.html">如果你感兴趣,Mike Ash 在一篇不出所料的好文章中详细介绍了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接