我一直在努力通过我制作的另一个课程更新我的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)
答案 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。只需在函数中使用完成处理程序。如果不仔细管理,在共享实例上设置和更改委托可能会产生一些副作用。