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
직면하고있는 문제입니다. 아이폰 4s에서는 악화됩니다2)이 페이지를 열면 기본적으로 첫 번째 탭이 선택되므로 스크롤 할 때 모든 것이 부드럽게 작동합니다. 하지만 탭을 전환하면 데이터를 다시로드 한 다음 다시 스크롤 할 때 스크롤이 갑자기 나타나고 즉시 메모리 경고 문제가 발생합니다.
지금까지 내가 한 것은 무엇입니까?
1) 나는 이미지 가져 오기 코드에 주석을 달고, 그 코드가 불규칙 스크롤을 일으키고 있는지 아닌지 확인했다.
2) 시간 프로파일 러를 사용하여 시간이 많이 걸리는지 확인하고 "dequeueReusableCellWithIdentifier"를 가리 킵니다. 그래서 나는 여기서 무엇이 잘못되고 있는지 모릅니다.
코드가 뒤죽박죽로 보입니다. 활성화 된 탭을 확인하기 전에 kCellIdentifier 유형의 셀을 dequeue합니다. 매번 이미지를로드한다고합니다. 세포를 채우기 위해 네트워크에서 이미지를로드하고 있습니까? 그렇다면 내용을 로컬에 캐시하는 방법이 필요하므로 멀리 스크롤 한 다음 뒤로 스크롤하면 이미지가 로컬에 저장됩니다. 또한 이미지로드가 비동기인지 확인해야합니다. 이미지로드를 기다리는 동안 자리 표시 자 이미지를 셀에 설치하려고 할 수 있습니다. –
@DuncanC,이 페이지를 열면 기본적으로 tab1이 될 것이므로 "kCellIdentifier"유형의 셀을 큐에서 제거합니다. 내 코드에서 볼 수 있듯이 이미지를 비동기 적으로로드하고 있습니다. – Ranjit
@DuncanC, 내 코드에서 볼 수 있습니다. 이미 imageCache를 가지고 있습니다. – Ranjit