2016-05-28 12 views
0

私はテーブルビューコントローラを持ち、セルの上にはセグメント化されたコントロールがあります。セグメント化されたコントロールには3つのオプションがあります。過去の投稿、現在の投稿、および今後の投稿。セグメント化されたコントロールで選択されているインデックスに応じて、特定のデータをテーブルビューに読み込む方法を理解しようとしています。テーブルビューに読み込むデータの選択Swift

たとえば、過去の投稿を選択すると、過去の投稿データがParse Serverからテーブルビューに読み込まれます。または[将来の投稿]を選択すると、[Parse Server]から[将来の投稿日付]をテーブルビューに読み込みます。

"選択された"データをロードする方法は全くわかりません。インデックスが変更された場合は、別のデータを削除して読み込みます。どんな助けでも大歓迎です!

また、Parse Serverからデータを取得する方法も知っています。私は、自分のデータがどこから来ているのかを説明するだけです。

+0

過去の記事は、その後、選択した場合に可能なアプローチである?? –

+0

Parse Serverに保存された5つの「過去の投稿」があるとします。 「過去の投稿」が選択されている場合、過去の投稿データとともに5つのセルが読み込まれます。それは理にかなっていますか? – m1234

答えて

0

フェッチと解析を実行し、変更された場合に関連付けられた識別子を含むクロージャを返すコントローラを作成するときに、このアプローチを使用できます。これらの線に沿って何か。 Rob's answerからの助けを借りて

UPDATE

は、私は完全性について私の答えに少しコンテキストを入れたかったです。

typealias PostsCompletionClosure = (requestIdentifier : String, posts : [Post])->Void 

class PostController { 

    func fetchPastPosts(requestIdentifier : String, 
         completion : PostsCompletionClosure, 
         queue : dispatch_queue_t?) { 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 

      let queryParams = ["status" : "past"] 

      self.performQuery(queryParams, completion: { (requestID, posts) in 
       dispatch_async(queue != nil ? queue : dispatch_get_main_queue()) { 
        completion(requestIdentifier : requestIdentifier, posts : posts) 
       } 
      }) 
     } 
    } 

    func fetchCurrentPosts(requestIdentifier : String, 
          completion : PostsCompletionClosure, 
          queue : dispatch_queue_t?) { 
     // Same as Above 
    } 

    func fetchFuturePosts(requestIdentifier : String, 
          completion : PostsCompletionClosure, 
          queue : dispatch_queue_t?) { { 
     // Same as Above 
    } 

    private func performQuery(queryParams: [String : String], 
           completion : PostsCompletionClosure) { 

     let query = PFQuery(className: "Posts") 

     for {key, value) in queryParams { 
      query.whereKey(key, equalTo: value) 
     } 

     query.findObjectsInBackgroundWithBlock { objects, error in 
      guard let error == nil else { 
       // Handle Error 
       return 
      } 

      if let results = objects as? [Post] { 
       dispatch_get_main_queue()) { 
        completion(requestIdentifier : requestIdentifier, posts : posts) 
      } 
      }) 
    } 
} 
あなたも、セグメントの要求のためのポストの要求キューを作成し、あなたが新しいものを開始しようとしている場合は、すべて前の操作を取り消し、これさえも最初の場所であなたのデータをリロードすることに機会を与えることはできません

。ここで


全体のtableViewまたは選択したセルの過去の記事を読み込み、のViewControllerを実装する方法:)

class ViewController: UIViewController, UITableViewDataSource { 

    @IBOutlet weak var tableView: UITableView! 
    @IBOutlet var segnmentControl: UISegmentedControl! 

    var posts: [Post]? 
    var activeRequestId: String = "" 

    // This should prolly be injected or a singleton 
    let postsController = PostController() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     didSelectSelegment(segnmentControl) 
    } 

    @IBAction func didSelectSelegment(sender: UISegmentedControl) { 
     posts = nil 
     tableView.reloadData() 

     activeRequestId = "\(sender.selectedSegmentIndex)" 

     switch sender.selectedSegmentIndex { 
     case 0: 
      self.postsController.fetchPastPosts(activeRequestId, completion: { (requestIdentifier, posts) in 
       self.reloadDataWith(requestIdentifier, posts : [Post]) 
      }) 
     case 1: 
      self.postsController.fetchCurrentPosts(activeRequestId, completion: { (requestIdentifier, posts) in 
       self.reloadDataWith(requestIdentifier, posts : [Post]) 
      }) 
     case 2: 
      self.postsController.fetchFuturePosts(activeRequestId, completion: { (requestIdentifier, posts) in 
       self.reloadDataWith(requestIdentifier, posts : [Post]) 
      }) 
     default: 
      fatalError("unexpected segment index") 
     } 
    } 

    func reloadDataWith(requestIdentifier : String, 
         posts : [Post]) { 

     if self.requestIdentifier == requestIdentifier { 
      self.posts = posts 
      self.tableView.reloadData() 
     } 
    }       
} 
+0

私は、複雑なクエリロジックからビューコントローラを分離するというアイデアが気に入っています。ただし、 'posts'パラメータをオプションにして(そして' NSError? 'も渡して)、パース失敗をビューコントローラが正常に識別できるようにしたいかもしれません。 – Rob

+0

@Robはあなたのコンテンツをマージし、ほとんどの人のために始めるための良いテンプレートをセットアップしました:) – AntonTheDev

+0

@Anton私は本当にあなたが思いついたものが好きです。私はこれを実装する上で取り組んでおり、私が持っているかもしれない疑問を持ってあなたに戻ってきます。 – m1234

0

基本的な考え方は、セグメント化されたコントロールが変更されると、モデルにデータを入力してからテーブルの再読み込みをトリガーすることになります。例えば、何かのように:今

class ViewController: UIViewController, UITableViewDataSource { 

    @IBOutlet weak var tableView: UITableView! 

    var posts: [Post]? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func didChangeValueForSegmentedControl(sender: UISegmentedControl) { 
     // first empty the table 

     posts = nil 
     tableView.reloadData() 

     // prepare new query 

     let query = PFQuery(className: "Posts") 

     switch sender.selectedSegmentIndex { 
     case 0: 
      query.whereKey("status", equalTo: "past") 
     case 1: 
      query.whereKey("status", equalTo: "current") 
     case 2: 
      query.whereKey("status", equalTo: "future") 
     default: 
      fatalError("unexpected segment index") 
     } 

     // now perform query 

     query.findObjectsInBackgroundWithBlock { objects, error in 
      guard error == nil else { 
       // report error 
       return 
      } 

      guard let searchResults = objects as? [Post] else { 
       // handle situation where results were not an array of `Post` objects 
       return 
      } 

      self.posts = searchResults 
      self.tableView.reloadData() 
     } 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return posts?.count ?? 0 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! PostCell 

     let post = posts![indexPath.row] 

     // configure `cell` using `post` 

     return cell 
    } 
} 

、それらwhereKey条項は確かに右ではありません、それはあなたのオブジェクトモデルを設定したかによって変わるだろうが、これは基本的な考え方を示しています。セグメント化されたコントロールが選択されたことに基づいてPFQueryを開始し、それに応じて結果を更新します。

ここでは、テーブルビューを定義してビューコントローラをデータソースとして指定したこと、テーブルビューのコンセントを接続したこと、フックしたこと分割されたコントロールのIBActionvalueChangedにしてください;カスタムセルタイプのセルプロトタイプを定義したことなど)がありますが、これはソリューションの重要な部分を示しています。

+0

サンプルコードを自分のソリューションにマージして、私のソリューションにスレッディングピースを追加することの1つの頂点です。 – AntonTheDev

+0

@AntonDoudarev - 正しく帰属されている限りは間違いありません。クエリの複雑さによっては、以下のような別のコントローラにクエリロジックを保存することもできますが、ロブ氏の回答のようにテーブルビューを更新することもできます。あなたのために働くものは何でも。聞いてくれてありがとう、tho。 – Rob

+0

もちろん:)本当にありがとう!私は十分なサンプルを持っているためにParseを使用していません – AntonTheDev

関連する問題