Swift 3 /如何在全局函数中调用tableView.reloadData()?

时间:2016-10-26 04:08:05

标签: ios swift

我正在尝试重构一个函数以使其全局可用。在函数结束时,需要重新加载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()

非常感谢帮助。

2 个答案:

答案 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()
}