2016-05-19 3 views
0

私はUIScrollViewを持っています。私はUITableViewを持っています。私はUITableViewのスクロールを無効にしていますので、スクロールビューが最下位に達しているかどうかをチェックしたい場合は、より多くのテーブル機能をロードしてください。だから私はこのようなことをしました。scrollViewDidScroll即時に複数回コール

func scrollViewDidScroll(scrollView: UIScrollView) { 



     if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) { 
      //reach bottom 
      self.startRec+=10 
      self.jsonParser() 
     } 

     else if (scrollView.contentOffset.y < 0){ 
      //reach top 
     } 

     else if (scrollView.contentOffset.y >= 0 && scrollView.contentOffset.y < (scrollView.contentSize.height - scrollView.frame.size.height)){ 
      //not top and not bottom 
     } 
} 

しかし、私の問題は、それがその、私はそれをスクロールし、このjsonParser()を複数回呼び出すようです。どうすればこの問題を解決できますか?私を助けてください。 ありがとう

+0

スクロール中にscrollViewDidScrollメソッドが複数回呼び出され、メソッドjsonParserを1回だけ実行させる場合は、ブール値フラグを使用し、メソッドが最初に実行されるときにyesに設定する必要があります。 –

答えて

0

jsonParserがいつ実行されているかを追跡するために、インスタンス変数をクラスに追加することができます。すでに実行中の場合は、何もせずに戻ります。 jsonParserがまだ実行されていない場合にのみ、startRecをインクリメントする必要があります。次のようなものがあります。

func incrementAndParseJSON() { 
    if self.alreadyRunning == false { 
     self.alreadyRunning = true 
     self.startRec += 10 
     self.jsonParser() 
     // Presumably, jsonParser is asynchronous, so set self.alreadyRunning = false after it's done. 
    } 
} 
0

スクロールビューでテーブルビューをサブビューする理由はありますか?私は、テーブルビューはスクロールビューのサブクラスであり、tableViewを使用することの大きなメリットの1つはdequeueCellメソッドです。

あなたはちょうどあなたがあなたのビューコントローラでそれをしたいテーブルビューを配置し、その後

にfuncのtableView(_デリゲートの機能を使用して、アプリケーションのうち、より良いパフォーマンスを得ることができます:willDisplayCell:forRowAtIndexPath :)

をこのデリゲートメソッドの内部では、ビューに入ってくるセルはもちろん言って、あなたのデータソースの末尾3から5のインデックス

func tableView(_:willDisplayCell:forRowAtTndexPath:) { 
    if (indexPath.row == resultsArray.count - 3) { 
     //load your extra data 

     self.startRec+=10 
     self.jsonParser() 
    } 

ある場合は、wは何でもあなたにその番号3を変更することができ、あなたのjsonParserを呼び出すことができますishですが、jsonParser()は、テーブルがデータソースの終わりに近づくたびに呼び出され、デキューセルを使用するメリットがあります。あなたが参考のためにそれをしたい場合はここで

は、Appleのドキュメントへのリンクです:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/#//apple_ref/occ/intfm/UITableViewDelegate/tableView:willDisplayCell:forRowAtIndexPath

私は無限スクロールのために作成されたコレクションビューにこれと同じアプローチを使用していました。

-(void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.item == self.arrCollectionData.count - 5) { 
     [self.myWebService startWebServiceRequestWithURL:_currentURL]; 
    } 
} 
+0

私も同じ問題に直面していますが、これを試しましたが、最初のアイテムが画面に表示されていても最後のアイテムのwillDisplayCellメソッドが呼び出されます@JacobBoyd –

0

ユーザーは、開始ドラッグして、そのデバイスから自分の指を離すようUIScrollViewDelegateの方法が複数回呼び出されます。おそらく、既存のパーサーがあるかどうかを確認し、新しいパーサーを実行するのではなく、単純に戻り値があるかどうかを確認する必要があります。 jsonParser()の内部

func jsonParser() { 

    if /* JSON is in process */ { 
     return 
    } 

    // process then clean up 

} 

これを複数回発射からあなたのコードを防ぐことができます。あなたの状態を正しく管理してください。