尝试通过委托方法更新tableview时,弱和委托失败警告

时间:2018-02-19 20:37:22

标签: swift delegates

我一直在努力通过我制作的另一个课程更新我的tableview。 然后我找到了这个stackoverflow解决方案: How to access and refresh a UITableView from another class in Swift

但是当我一步一步地执行并实现所有代码时,我会收到以下错误:

我的专栏:

weak var delegate: UpdateDelegate?

获取警告

'weak' may only be applied to class and class-bound protocol types, not 'UpdateDelegate'

我的路线:

self.delegate.didUpdate(self)

获取警告:

Instance member 'delegate' cannot be used on type 'APIgetter'

这可能是因为代码很旧而且我使用的是swift 4吗?否则我不明白为什么这应该失败。我希望你能帮助我:)。

更新

我的协议:

protocol UpdateDelegate: AnyObject {
    func didUpdate(sender: APIgetter)
}

我的ViewController中包含tableview的片段:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UpdateDelegate {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        APIgetter.addDataFromSQL()
        let updates = APIgetter()
        updates.delegate = self
    }

    //update func
    func didUpdate(sender: APIgetter) {
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }

我在APIgetter.swift中的APIgetter类:

class APIgetter {
weak var delegate: UpdateDelegate?

class func addDataFromSQL (){

//Code to fetch data from API

//Code that comes after DispatchQueue.global & DispatchQueue.main and my result being executed
//result
self.delegate.didUpdate(self)

1 个答案:

答案 0 :(得分:0)

只需更新您的协议定义。

protocol UpdateDelegate: class {
   // protocol body
}

protocol UpdateDelegate: AnyObject {
   // protocol body
}

这是必需的(我认为是Swift 4),因为类是引用类型,你只能在引用类型上使用弱引用。不是类似结构的值类型。

更新:您无法以当前的方式从静态函数访问属性/实例成员。从函数中删除class关键字,它应该工作。

如果您希望/需要在整个应用程序中使用此类的单个实例,则可以使用静态属性将其设为Singleton

class APIgetter {
    static let shared: APIgetter = APIgetter()
}

然后你就可以像这样访问它:

APIgetter.shared.addDataFromSQL()

您也可以在调用函数之前以相同的方式更新委托。

APIgetter.shared.delegate = self

我认为在这种情况下我会使用没有委托的Singleton。只需在函数中使用完成处理程序。如果不仔细管理,在共享实例上设置和更改委托可能会产生一些副作用。