2016-07-30 2 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

직면하고있는 문제입니다. 아이폰 4s에서는 악화됩니다

2)이 페이지를 열면 기본적으로 첫 번째 탭이 선택되므로 스크롤 할 때 모든 것이 부드럽게 작동합니다. 하지만 탭을 전환하면 데이터를 다시로드 한 다음 다시 스크롤 할 때 스크롤이 갑자기 나타나고 즉시 메모리 경고 문제가 발생합니다.

지금까지 내가 한 것은 무엇입니까?

1) 나는 이미지 가져 오기 코드에 주석을 달고, 그 코드가 불규칙 스크롤을 일으키고 있는지 아닌지 확인했다.

2) 시간 프로파일 러를 사용하여 시간이 많이 걸리는지 확인하고 "dequeueReusableCellWithIdentifier"를 가리 킵니다. 그래서 나는 여기서 무엇이 잘못되고 있는지 모릅니다.

+0

코드가 뒤죽박죽로 보입니다. 활성화 된 탭을 확인하기 전에 kCellIdentifier 유형의 셀을 dequeue합니다. 매번 이미지를로드한다고합니다. 세포를 채우기 위해 네트워크에서 이미지를로드하고 있습니까? 그렇다면 내용을 로컬에 캐시하는 방법이 필요하므로 멀리 스크롤 한 다음 뒤로 스크롤하면 이미지가 로컬에 저장됩니다. 또한 이미지로드가 비동기인지 확인해야합니다. 이미지로드를 기다리는 동안 자리 표시 자 이미지를 셀에 설치하려고 할 수 있습니다. –

+0

@DuncanC,이 페이지를 열면 기본적으로 tab1이 될 것이므로 "kCellIdentifier"유형의 셀을 큐에서 제거합니다. 내 코드에서 볼 수 있듯이 이미지를 비동기 적으로로드하고 있습니다. – Ranjit

+0

@DuncanC, 내 코드에서 볼 수 있습니다. 이미 imageCache를 가지고 있습니다. – Ranjit

답변

0

secodTabClickedthirdTabClicked 일 때 코드 설정에서 셀이 "대칭"으로 보이지 않습니다. firstTabClicked이 보이지 않으며 어떤 탭을 클릭했는지 확인하기 위해 사용하고있는 조건이 secodTabClickedthirdTabClicked과 겹치는 것으로 보입니다. 즉, 아마도 최상위 지점에 들어서고 을 cell2TableViewCell 또는 cell3TableViewCell으로 예상 할 때 반환하십시오.

코드를 리팩토링하여 세 셀 유형 모두에 대해 유형 선택을 "대칭"으로 지정하면이 문제가 해결됩니다.

다른 솔루션은 다른 탭에 대해 별도의 데이터 소스를 만들고, xyzTabClicked 플래그를 설정하는 대신 데이터 소스를 전환하는 것일 수 있습니다. 하나의 커다란 함수 대신에 작은 함수로 끝나기 때문에 코드를 더 쉽게 관리 할 수 ​​있습니다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 이미 세 가지 다른 식별자를 사용하고 있습니다. 코드에서 언급하지 않았습니다.나는 내 코드를 업데이트했다 – Ranjit

+0

@Ranjit 그때는 뭔가 다른 것이 틀림 없다. 나는 해답을 해결책으로 이끌 수있는 방향을 바꾸었다. 3 개의 작은 함수가 하나의 큰 함수보다 낫기 때문에 나는 다른 데이터 소스 옵션을 탐색 할 것입니다. – dasblinkenlight

+0

이 페이지를 열면 세 가지 다른 유형의 데이터를 제공하는 webservice를 호출합니다.이 데이터는 세 가지 배열로 저장됩니다. 이제 사용자가 탭을 전환하면 다른 배열의 데이터 만로드합니다. 실제로 모든 것은 작동하지만, 매우 느리고 또한 메모리 경고가 나타납니다 – Ranjit

관련 문제