2016-05-18 10 views
3

私のTaskViewからHomeViewController内の関数reloadTableを呼び出そうとしています。しかし、私はスローされ続ける他のViewControllerから関数を呼び出す方法

タイプ 'HomeViewController'のインスタンスメンバー 'reloadTable'の使用。代わりに 'HomeViewController'タイプの値を使用することを意味しましたか?

これは私のHomeViewControllerコードです:構造体として

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

多くの他の回答状態では、静的参照で非静的関数にアクセスしようとしています。

私はクロージャの使用を提案しますが、以下を考慮してください。 .Success.Failureのクロージャを作成すると、データ要求の結果に応じて処理することができます。 onErrorクロージャはオプションとして定義されています。つまり、'getTaskDetails`関数呼び出しでonErrorを実装する必要はなく、エラー情報が必要な場所に実装してください。あなたのHomeViewControllerから

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

// 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

+0

こんにちは@Laffenなぜあなたはコンプリートを入れましたか:([タスク]) - >()?私はどのように動作しているのか分かりません – noobdev

+0

私はあなたが 'Closures'リンクを見てみることをお勧めします、ドキュメントはどのように/どのように、なぜ詳細に説明します。関数上でクロージャをインクルードしたい 'onCompletion'を定義します。その関数内から 'onCompletion'を呼び出します。要求されたデータが返されます。 'getTaskDetails'を呼び出すと、' onCompletion'の本体を定義します。これは、定義されている関数の中から呼び出されたときに何をすべきかをクロージャに指示する場所です。これは少し毛深い... – Laffen

0

メイククラスタスク(静的としての機能をgetTaskDetailsを作成し、機能のgetTaskDetailsを呼び出そう、:これは私のタスククラスは

import UIKit 
import Alamofire 
import SwiftyJSON 

class HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
func reloadTable() { 
    self.displayTask.reloadData() 
} 
} 

です)をHomeViewControllerに挿入します。この関数の結果では、realoadTable()を使用します。

-1

HomeViewControllerでは、クラスメソッドではなくインスタンスメソッドとしてreloadTable()を定義しました。HomeViewControllerのインスタンスをHomeViewController()として作成する必要があります。交換してください

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

希望します。ハッピーコーディング。

+0

は、それが動作しますよろしいですか? – raki

+0

論理的に試したことはありません。 Btw私は個人的にこのような場合に通知パターンを好む。 – luckyShubhra

+0

View ControllerにはHomeViewControllerのインスタンスが1つありますが、HomeViewController()を呼び出すと別のインスタンスが作成され、viewCotrollerのインスタンスとは異なります。 – raki

0

この場合、reloadTable()はインスタンスメソッドです。クラス名で呼び出すことはできません。HomeViewControllerのオブジェクトを作成し、そのオブジェクトを使ってそのメソッドを呼び出さなければなりません。

しかし、この状況では、HomeViewControllerオブジェクトを使用して直接メソッドを呼び出す必要はありません。

HomeViewController

のご viewDidLoad方法では、上記の行を追加します。あなたの HomeViewController

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(HomeViewController.reloadTable), name:"ReloadHomeTable", object: nil)

の通知オブザーバを追加します。あなたはNSNotification使用NSNotification

を使用して別の方法でこれを行うことができます

あなたののHomeViewController.reloadTable()によるNSNotificationCenter.defaultCenter().postNotificationName("ReloadHomeTable", object: nil)このラインを交換してくださいクラス

+0

オブザーバーを削除することを忘れないでください。 – Laffen

+0

しかし、私はどこにオブザーバーを削除するのだろうか? viewDidUnloadは現在利用できません。しかし、ビューが消えてもデータを更新する必要があることがあります。 – raki

+0

ビューコントローラをスタックから削除する場合は、そのビューのオブザーバを削除する必要があります。 'dismissViewController(_ :)'のようなものです。 – Laffen

関連する問題