2016-07-30 4 views
0

UITableViewにUITableViewを追加しました.UITableViewの高さ制約のIBOutletを作成しました。これは、UITableviewのコンテンツサイズの設定に役立ちます。異なるカスタムUITableViewCells問題を持つ単一のUITableView

私は3つのタブがあり、私は異なるデータソースでデータをリロードするためにタブを切り替えます。また、私はタブが変更されたときに別のカスタムセルを持っています。あなたは、各タブは画像と異なるカスタムセルを有する見ることができるように ので、タブの変更は、私がここに

reloadDataを呼び出して、私のcellForRow機能は

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     // Configure the cell... 

     var cell:UITableViewCell! 

     let event:Event! 


     if(tableView == self.dataTableView) 
     { 

       let eventCell:EventTableViewCell = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier, forIndexPath: indexPath) as! EventTableViewCell 

       eventCell.delegate = self 


        event = sectionsArray[indexPath.section].EventItems[indexPath.row] 




       eventCell.eventTitleLabel?.text = "\(event.title)" 
       eventCell.eventImageView?.image = UIImage(named: "def.png") 


       if let img = imageCache[event.imgUrl] { 
        eventCell.eventImageView?.image = img 
       } 
       else { 
        print("calling image of \(indexPath.row) \(event.imgUrl)") 
        //  let escapedString = event.imgUrl.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet()) 
        let session = NSURLSession.sharedSession() 
        do { 
         let encodedImageUrl = CommonEHUtils.urlEncodeString(event.imgUrl) 
         let urlObj = NSURL(string:encodedImageUrl) 
         if urlObj != nil { 
          let task = session.dataTaskWithURL(urlObj!, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 
           guard let realResponse = response as? NSHTTPURLResponse where 
            realResponse.statusCode == 200 else { 
             print("Not a 200 response, url = " + event.imgUrl) 
             return 
           } 
           if error == nil { 
            // Convert the downloaded data in to a UIImage object 
            let image = UIImage(data: data!) 


            // Store the image in to our cache 
            self.imageCache[event.imgUrl] = image 
            // Update the cell 
            dispatch_async(dispatch_get_main_queue(), { 
             if let cellToUpdate:EventTableViewCell = tableView.cellForRowAtIndexPath(indexPath) as? EventTableViewCell { 
              cellToUpdate.eventImageView?.image = image 
             } 
            }) 
           } 
          }) 
          task.resume() 
         } 
        } catch { 
         print("Cant fetch image \(event.imgUrl)") 
        } 
       } 


       cell = eventCell 
      } 
      else if(secodTabClicked) 
      { 
       let Cell2:cell2TableViewCell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier1, forIndexPath: indexPath) as! cell2TableViewCell 

       //Image loading again takes place here     

       cell = Cell2 

      } 
else if(thirdTabClicked) 
      { 
       let Cell3:cell3TableViewCell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier2, forIndexPath: indexPath) as! cell3TableViewCell 

       //Image loading again takes place here     

       cell = Cell3 

      } 


     return cell 

    } 

です。

以下は、私はそれは私がタブを切り替えると、かなりのタイムラグがそのときにデータを再ロードするのに時間がかかる) に直面していた問題です。私がこのページを開くと、最初のタブがデフォルトで選択されているので、スクロールするとすべてがスムーズに機能します。しかし、私はタブを切り替えると、私は再びデータをリロードした後にスクロールすると、スクロールジャークになり、すぐに私はメモリの警告の問題が発生します。

私はこれまで何をしましたか?

1)画像取り込みコードにコメントして、それが不安定なスクロールを引き起こしているかどうかを確認しましたが、そうではありません。

2)時間プロファイラを使用して、何がより時間がかかるかを確認し、 "dequeueReusableCellWithIdentifier"を指しています。だから私はここで何がうまくいかないのか分からない。

+0

あなたはコードが混乱しています。アクティブなタブを確認する前に、kCellIdentifier型のセルをデキューします。また、毎回イメージを読み込んでいるとも言えます。あなたの細胞を満たすためにネットワークからそれらのイメージを読み込んでいますか?その場合は、コンテンツをローカルにキャッシュする方法が必要です。スクロールしてからスクロールすると、イメージはローカルに保存されます。また、イメージのロードが非同期であることを確認する必要があります。イメージが読み込まれるのを待っている間に、プレースホルダイメージをセルにインストールすることができます。 –

+0

@DuncanC、このページを開くと、デフォルトではtab1になるので、タイプ "kCellIdentifier"のセルをデキューします。私のコードで見てきたように、私は非同期に画像を読み込んでいます。 – Ranjit

+0

@DuncanC、私のコードで見ることができます、私はすでにimageCacheを持っています – Ranjit

答えて

0

secodTabClickedthirdTabClickedの場合、コード設定がセルに対して「対称」に見えません。 firstTabClickedが表示されず、クリックしたタブを確認するために使用している条件がsecodTabClickedthirdTabClickedと重なっているように見えます。つまり、おそらくトップブランチに入っており、cell2TableViewCellまたはcell3TableViewCellが予想される場合はEventTableViewCellを返します。

コードをリファクタリングして、3つのセルタイプすべてに対してタイプ選択を「対称」にすると、この問題が解決されます。

別の解決策は、異なるタブ用に別々のデータソースを作成し、xyzTabClickedフラグを設定する代わりにデータソースを切り替えることです。 1つの大きな関数の代わりに小さな関数で終わることになり、コードの管理が容易になります。

+0

お返事ありがとうございます。私はすでに3つの異なる識別子を使用しています。申し訳ありませんが、私はコードで言及しませんでした。私は自分のコードを更新しました – Ranjit

+0

@Ranjitこれは何か他のものでなければなりません。私は答えの可能性を解決策につなげる可能性のある方向に置き換えました。 3つの小さな関数が1つの大きな関数より優れているので、私は別のデータソースオプションも探求します。 – dasblinkenlight

+0

ちょっと、このページを開くと、3つの異なるタイプのデータを3つの異なる配列に格納するWebサービスが呼び出されます。ユーザーがタブを切り替えると、別の配列からデータをロードするだけです。実際にはすべてが動作しますが、非常に遅く、また私はメモリの警告を受け取ります – Ranjit

関連する問題