我试图从我的Task类中调用HomeViewController中的函数reloadTable
。但我一直被抛出
使用实例成员' reloadTable'在类型' HomeViewController&#39 ;;你的意思是使用类型' HomeViewController'代替?
这是我的HomeViewController代码:
import UIKit
import Alamofire
import SwiftyJSON
class HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
func reloadTable() {
self.displayTask.reloadData()
}
}
这是我的任务类:
import Foundation
import Alamofire
import SwiftyJSON
class Tasks {
static let sharedInstance = Tasks()
var datas: [JSON] = []
func getTaskDetails(){
Alamofire.request(.GET, Data.weeklyEndpoint).validate().responseJSON { response in
switch response.result {
case .Success(let data):
let json = JSON(data)
if let buildings = json.array {
for building in buildings {
if let startDate = building["start_date"].string{
print(startDate)
}
if let tasks = building["tasks"].array{
Tasks.sharedInstance.datas = tasks
HomeViewController.reloadTable()
for task in tasks {
if let taskName = task["task_name"].string {
print(taskName)
}
}
}
}
}
case .Failure(let error):
print("Request failed with error: \(error)")
}
}
}
// for prevent from creating this class object
private init() { }
}
答案 0 :(得分:0)
将类Task作为Struct,将函数getTaskDetails作为static,并尝试在HomeViewController中调用函数getTaskDetails()。结果这个函数使用了realoadTable()
答案 1 :(得分:0)
在这种情况下,reloadTable()
是一种实例方法。你不能通过类名调用它,你必须为HomeViewController
创建对象,然后你必须通过使用该对象来调用该方法。
但是在这种情况下,不需要使用HomeViewController
对象直接调用该方法。您可以使用NSNotification
使用NSNotification
:
为您的HomeViewController
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(HomeViewController.reloadTable), name:"ReloadHomeTable", object: nil)
在viewDidLoad
HomeViewController
方法中添加上述行
现在在HomeViewController.reloadTable()
课程中将NSNotificationCenter.defaultCenter().postNotificationName("ReloadHomeTable", object: nil)
替换为Task
答案 2 :(得分:0)
正如许多其他答案所述,您正在尝试访问静态引用上的非静态函数。
我建议使用闭包,考虑以下几点;
为.Success
和.Failure
创建一个闭包,这使您可以根据数据请求结果采取相应措施。 onError
闭包被定义为可选,这意味着您不必在'getTaskDetails`函数调用中实现onError
,在您认为需要错误信息的地方实现它。
func getTaskDetails(onCompletion: ([Task]) -> (), onError: ((NSError) -> ())? = nil) {
Alamofire.request(.GET, Data.weeklyEndpoint).validate().responseJSON {
response in
switch response.result {
case .Success(let data):
let json = JSON(data)
if let buildings = json.array {
for building in buildings {
if let startDate = building["start_date"].string{
print(startDate)
}
if let tasks = building["tasks"].array{
Tasks.sharedInstance.datas = tasks
onCompletion(tasks)
}
}
}
case .Failure(let error):
print("Request failed with error: \(error)")
onError?(error)
}
}
}
来自HomeViewController
:
// Call from wherever you want to reload data.
func loadTasks(){
// With error handling.
// Fetch the tasks and reload data.
Tasks.sharedInstance.getTaskDetails({
tasks in
self.displayTask.reloadData()
}, onError: {
error in
// Handle error, display a message or something.
print(error)
})
// Without error handling.
// Fetch the tasks and reload data.
Tasks.sharedInstance.getTaskDetails({
tasks in
self.displayTask.reloadData()
})
}
答案 3 :(得分:-1)
在HomeViewController中,您已将reloadTable()定义为实例方法而不是类函数。您应该通过将HomeViewController的实例设置为HomeViewController()来调用reloadTable()。替换
HomeViewController.showLeaderboard()
HomeViewController().showLeaderboard()
希望它有所帮助。快乐的编码。