2016-09-07 9 views
0

テーブルビューがスムーズにスクロールしません。私はリンゴからこのコメントを見ました。 Perfect smooth scrollingコードをwillDisplayHeaderViewに移動してTableViewのスクロールを改善します

から

But very important thing is still there: tableView:cellForRowAtIndexPath: method, which should be implemented in the dataSource of UITableView, called for each cell and should work fast. So you must return reused cell instance as quickly as possible.

Don’t perform data binding at this point, because there’s no cell on screen yet. For this you can use tableView:willDisplayCell:forRowAtIndexPath: method which can be implemented in the delegate of UITableView. The method called exactly before showing cell in UITableView’s bounds.

だから私は(私はカスタムセクションを持っているので、私はセクションを使用してというよりも、この具体例の行い、注意してください)willDisplayHeaderViewにviewForHeaderInSectionにすべての私のコードを実装しようとしています。しかし、私は「致命的なエラー:オプションの値アンラップしながら、予想外にnilを見つけ、」取得しています以下は

let cell = tableView.headerViewForSection(section) as! TableSectionHeader 

はオリジナル(注

をクラッシュした私の元と試みたコードですでエラーが、このコードでは、と正常に動作します私が改善しようとしているいくつかのマイナーなスクロール遅れの問題)

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    if let cell = tableView.dequeueReusableHeaderFooterViewWithIdentifier("TableSectionHeader") as? TableSectionHeader { 

     // Cancel request of current cell if there is a request going on to prevent requesnt info from background from previous use of same cell 
     cell.AlamoFireRequest?.cancel() 

     var image: UIImage? 
     if let url = post.imageUrl { 
      image = DiscoverVC.imageCache.objectForKey(url) as? UIImage 
     } 

     cell.configureCell(post) // This is data binding part 
     cell.delegate = self 

     return cell 

    } else { 
     return TableSectionHeader() 
    } 
} 

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { 

} 

試み

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    if let cell = tableView.dequeueReusableHeaderFooterViewWithIdentifier("TableSectionHeader") as? TableSectionHeader { 
     return cell 

    } else { 
     return TableSectionHeader() 
    } 
} 

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { 

    let cell = tableView.headerViewForSection(section) as! TableSectionHeader 

    // Cancel request of current cell if there is a request going on to prevent requesnt info from background from previous use of same cell 
    cell.AlamoFireRequest?.cancel() 

    var image: UIImage? 
    if let url = post.imageUrl { 
     image = DiscoverVC.imageCache.objectForKey(url) as? UIImage 
    } 

    cell.configureCell(post) // This is data binding part 
    cell.delegate = self 
} 

-----更新マイケルの答えに対処するための------

回答の単語の制限は、ここでは、あるとして、あなたが正しいマイケル

からの回答を受けている、私は更新されています私は自分の質問からスニペットを得た。私の間違い

私は問題が非常にうまくいく可能性があることに同意します。しかし、これは私が現時点で行っていることです。私のテーブルビューはOKをスクロールしますが、画像があるときに少し遅くなります。だから、私は何らかの措置をとって、何らかの潜在的な原因を撃退しています

私が具体的に使用しなかった理由は、ここに表示されるセルがTableSectionHeaderであることを期待していたためです。私はそれだけでそれを追加しようとしたと私はいつも失敗したキャストを取得します。

なぜ私がUITableViewHeaderFooterViewをサブクラス化するのは、私のheaderviewがfunc configureCell()を持つXibファイルであり、cell.configureCellを呼び出すことができるからです。 (そして他の多くの機能)

マイヘッダは任意とすることができるタイトル、日付、firebase

  • 画像からダウンロード時間を表示する

    1. ラベルのようないくつかの項目を含む
    2. 画像記述
    3. btn、コメントbtn、more、btnのように

    これらの機能はすべて私のTableSectionHeader.swi UITableViewHeaderFooterViewから継承したftft

    "あなたはヘッダー内に状態を格納しようとしているように疑わしいと思っています - あなたはtableViewの外に状態を保存するべきですか?"

    Alamofireのリクエストを取り消す理由は、セルがデキューされるためです。したがって、ユーザーが本当に速くスクロールすると、セルは多くのalamofire要求を取得します。だから、私はまずそれをキャンセルし、ダウンロード要求を再オープンします(内部のセル。私がキャッシュに何も持っていない場合はconfigureCell)

    印刷セクションがどのように識別されるかわかりません。私は、ここではすべてをwillDisplayHeaderViewコードに入れていることは、私が思うに、間違っていると思っています(ほとんどの場所で、代わりにviewForHeaderInSectionに配置します)。または単に構文だけです。

  • 答えて

    0

    メソッドのヘッダービューが表示されたら、それをキャストするだけです。これを試してみてください:

    func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { 
    
        guard let cell = view as? TableSectionHeader else { return } 
    
        cell.AlamoFireRequest?.cancel() 
    
        ... 
    } 
    
    +0

    私はちょうどそれを試して、キャストは何らかの理由でいつも失敗しますか? – user172902

    0

    私はそのコメントは、Appleから来ているとは思わない、と私はあなたの問題は、おそらく(例えば、バックグラウンドで実行する必要があるタスクをメインキューを遮断する。)他の場所であると思います。 TableSectionHeaderの内容を投稿すると、これがより明確になることがあります。

    let cell = tableView.headerViewForSection(section) as! TableSectionHeader 
    

    あなたはTableSectionHeaderとしてキャストを強制しているので、これは、それは間違いなく1ではありません。

    にかかわらず、あなたが次の行ではnil値の例外を取得しているのを押します。 if letまたはguard letに変更すると、別のコードパスが表示されます。

    viewForHeaderInSectionで作成しているものは、常にそのタイプのものであるとはっきりと思っているので、あなたは気づいていないことが起きています(どうしてUITableViewHeaderFooterViewをサブクラス化していますか?セクション番号を印刷して両方のセクションで表示することで、実際に何が起こっているかを知ることができます。ヘッダーに状態を格納しようとしているように、疑わしいように見えます.stateViewの外側に状態を格納する必要があります。

    また、Alamofireリクエストをキャンセルする必要はありません。これはパフォーマンス上の問題の原因ではないため、イメージを取得するだけで別のリクエストが発生する必要があります。それ以外の場合、ユーザーがスクロールしている間は、要求がキャンセルされ続けるため、画像は表示されません。彼らは画面だけを離れて、他の場所をスクロールする前にそれらの画像が読み込まれるのを待つ必要があります。

    +0

    こんにちはマイケル、ここからのご質問からの私の返答をご覧ください。 – user172902

    関連する問題