2016-10-26 2 views
2

Я пытаюсь реорганизовать функцию, чтобы она была доступна по всему миру. В конце функции необходимо перезагрузить UITableView. Я думал о прохождении ОК, но я все еще получаюSwift 3/Как вызвать tableView.reloadData() в глобальной функции?

Значения типа «UIViewController» не имеет ни одного члена «Tableview»

Я знаю, что я получаю эту ошибку, потому что Tableview не является частью UIViewController по умолчанию, но как его обходить?

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)") 
    } 
} 

Справка очень приветствуется.

+0

по крайней мере, прокомментировать? –

+0

Зачем вам это глобальная функция? – Alexander

+0

, потому что я вызываю ту же самую функцию в 3-4 разных диспетчерах просмотров. –

ответ

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() 
} 
+0

большое спасибо за ваши усилия. блок завершения был хорошей идеей. –

+1

Мне просто пришлось изменить его на: 'завершение: @escaping()', из-за swift 3 –

+0

Добро пожаловать, и да, забыл об этом – Callam

3

'UIViewController' не имеет ни одного члена 'Tableview'

Это говорит все! Ваш vc имеет тип UIViewController, очевидно, что он не имеет ни одного члена с именем tableView.

Вы использовали параметр vc только один раз и его для перезагрузки таблицы. Поэтому вместо того, чтобы передавать его, попробуйте передать ссылку на tableveiew.

По каким-либо причинам, если вы не можете это сделать, и вы должны сами использовать ViewController, попробуйте создать протокол, реализовать его во всех ваших VC и использовать его как тип. tableview должен быть членом этого протокола

Это базовое программирование. Надеюсь, это поможет

+0

, как я сказал, я знаю, почему я получаю ошибку, но идея передачи tableView отлично. но по какой-то причине перезагрузка не называется –

+1

Что происходит, когда вы передаете tableView вместо viewController? Таким образом, функция будет «func downloadAvatar (_ userForAvatar: String, tv: UITableView)», и вы будете «tv.reloadData()» – Callam

+0

, так что табличное представление просто не перезагружается. Я попробовал его с расширением протокола. одна и та же. но называя его с блоком завершения сделал это тогда –

Смежные вопросы