我正在尝试重构一个函数以使其全局可用。在函数结束时,需要重新加载UIViewController
。我在考虑传递VC,但我仍然得到了
'UIViewController'类型的值没有成员'tableView'
我知道我收到了这个错误,因为默认情况下tableView不属于func downloadAvatar(_ userForAvatar: String, vc: UIViewController) {
let whereClause = "objectId = '\(userForAvatar)'"
let dataQuery = BackendlessDataQuery()
dataQuery.whereClause = whereClause
let dataStore = backendless?.persistenceService.of(BackendlessUser.ofClass())
dataStore?.find(dataQuery, response: { (users : BackendlessCollection?) in
let withUser = users?.data.first as! BackendlessUser
let imgURL = withUser.getProperty("Avatar") as? String
avatare.setValue(imgURL, forKey: userForAvatar)
vc.tableView.reloadData() // problem here
}) { (fault : Fault?) in
print("error: \(fault)")
}
}
,但是如何绕过呢?
getOutputStream()
非常感谢帮助。
答案 0 :(得分:3)
'的UIViewController'没有会员' tableView'
它告诉一切!您的vc
类型为UIViewController
,显然它没有名为tableView
的成员。
您仅使用参数vc一次,并将其用于重新加载表。因此,不要传递它,尝试传递tableveiew引用本身。
由于某些原因,如果您无法执行此操作并且您应该使用ViewController本身,请尝试创建协议,在所有VC中实现它并将其用作类型。 tableview应该是该协议的成员
这是基本编程。希望这有帮助
答案 1 :(得分:3)
您应该只使用vc: UIViewController
而不是tv: UITableView
作为参数。然后,不是传递视图控制器,而是传递它的tableView。虽然如果这不起作用,您可以尝试使用完成块。
func downloadAvatar(_ userForAvatar: String, completion: @escaping () -> ()) {
let whereClause = "objectId = '\(userForAvatar)'"
let dataQuery = BackendlessDataQuery()
dataQuery.whereClause = whereClause
let dataStore = backendless?.persistenceService.of(BackendlessUser.ofClass())
dataStore?.find(dataQuery, response: { (users : BackendlessCollection?) in
let withUser = users?.data.first as! BackendlessUser
let imgURL = withUser.getProperty("Avatar") as? String
avatare.setValue(imgURL, forKey: userForAvatar)
completion()
}) { (fault : Fault?) in
print("error: \(fault)")
}
}
然后假设您从相应的视图控制器调用此方法,您可以在完成块中重新加载tableView数据。
downloadAvatar("$uid") { [weak self] in
self?.tableView.reloadData()
}