gpt4 book ai didi

swift - 尝试通过委托(delegate)方法更新 tableview 时出现弱和委托(delegate)失败警告

转载 作者:行者123 更新时间:2023-11-30 11:45:31 24 4
gpt4 key购买 nike

我一直在努力通过我制作的另一个类(class)来更新我的桌面 View 。然后我找到了这个 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):

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

来 self 的 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)

最佳答案

只需更新您的协议(protocol)定义即可。

protocol UpdateDelegate: class {
// protocol body
}

protocol UpdateDelegate: AnyObject {
// protocol body
}

这是必需的(我认为从 Swift 4 开始),因为类是引用类型,并且只能在引用类型上使用弱引用。不是像结构那样的值类型。

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

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

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

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

APIgetter.shared.addDataFromSQL()

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

APIgetter.shared.delegate = self

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

关于swift - 尝试通过委托(delegate)方法更新 tableview 时出现弱和委托(delegate)失败警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48873807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com