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"を指しています。だから私はここで何がうまくいかないのか分からない。
あなたはコードが混乱しています。アクティブなタブを確認する前に、kCellIdentifier型のセルをデキューします。また、毎回イメージを読み込んでいるとも言えます。あなたの細胞を満たすためにネットワークからそれらのイメージを読み込んでいますか?その場合は、コンテンツをローカルにキャッシュする方法が必要です。スクロールしてからスクロールすると、イメージはローカルに保存されます。また、イメージのロードが非同期であることを確認する必要があります。イメージが読み込まれるのを待っている間に、プレースホルダイメージをセルにインストールすることができます。 –
@DuncanC、このページを開くと、デフォルトではtab1になるので、タイプ "kCellIdentifier"のセルをデキューします。私のコードで見てきたように、私は非同期に画像を読み込んでいます。 – Ranjit
@DuncanC、私のコードで見ることができます、私はすでにimageCacheを持っています – Ranjit