如何从另一个ViewController调用函数

时间:2016-05-18 06:28:15

标签: ios function swift2

我试图从我的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() { }


}

4 个答案:

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

Basics

Closures

答案 3 :(得分:-1)

在HomeViewController中,您已将reloadTable()定义为实例方法而不是类函数。您应该通过将HomeViewController的实例设置为HomeViewController()来调用reloadTable()。替换

HomeViewController.showLeaderboard()
HomeViewController().showLeaderboard()

希望它有所帮助。快乐的编码。