2014-07-08 2 views
0

비행 예약의 NSArray를 사용하는 상당히 간단한 UITableView를 보유하고 있으며 예약 당 하나의 셀을 표시합니다. 최근에 고객이 일부 셀을 완전히 숨겨서 문제를 제기했습니다 (일부 경우에만이를 재현 할 수 있음). 그들을위한 공간이 있지만 거기에 틈이 있습니다.UITableView 셀이 무작위로 사라졌습니다.

표에는 머리글과 바닥 글이있어 갭을 볼 수 있습니다 (적은 요소 만있는 것은 아닙니다). 여기

예 스크린 샷 : 나는 응용 프로그램을 다시 시작하면 문제가 사라집니다 때문에 http://myflightsapp.com/images/missing-cells.png

정말, 간헐적입니다.

나는 아주 간단한 2 개의 라이너로 cellForRowAtIndexPath를 대체하여 텍스트 레이블이있는 완전히 표준 인 UITableViewCell을 반환하려고 시도했으며, 똑같은 문제를 표시하므로 문제가되는 Nib/Custom 클래스를 제외시켰다.

heightForRowAtIndexPath는 항상 상수를 반환하므로 실수로 높이가 0 인 행이 표시되지 않습니다.

테이블에는 섹션이 하나만 있습니다.

나는 numberOfSectionsInTableView 방법에 디버그를 넣었습니다 그것은 항상 내가 배운있는 내가 cellForRowAtIndexPath에서 디버그를 넣었습니다 (이 예에서는 2) 정확한 수

, 반환 것 : 1)의 경우를 테이블 뷰를 충분히 위로 드래그하여 (셀이 화면에서 사라짐) 문제가 표시되는 상황에서 테이블을 다시 스크롤 할 때 셀을 다시 그리기 위해 cellForRowAtIndexPath를 다시 호출하지 않습니다. , 문제가 없으면 (즉, 셀이 모두 표시됨) 각 셀에 대해 cellForRowAtIndexPath를 다시 호출합니다.

2) 어떤 셀에서도 '숨김'속성이 true가 아닙니다.

다른 곳에서 디버그 (예 : 임시 버튼)를 추가하면 표시되지 않는 셀에 대해 cellForRowAtIndexPath 메소드를 수동으로 호출 할 수 있으며 올바른 셀인 것으로 보이는 셀을 반환합니다.

제 질문은보고있는 문제를 일으키는 원인은 무엇입니까? 문제가있는 곳을보기 위해 디버그를 할 곳이 부족합니다.

큰 도움을 주시면 감사하겠습니다. 무엇이 누락 되었습니까?

답변

0

Apple Dev Technical Support의 도움을 받아 ... 해결했습니다. 그것을 가로 질러 온 다른 사람의 이익을 위해서, 실수로 메인 스레드 대신에 보조 스레드에서 테이블을 다시로드하는 메소드를 호출하고있었습니다. 해결하려면

, 나는 다음과 같은

[self performSelectorOnMainThread:@selector(refreshMethod) withObject:nil waitUntilDone:YES]; 

그리고 지금까지 너무 좋아를 사용했다.

0

아마도 문제의 원인은 재사용 할 셀이 충분하지 않다는 것입니다. 코드를 보지 않고 그냥 추측하고 있지만 여기에 일 때

표가 100 포인트 높고 각 셀이 10 포인트라고 가정 해 봅시다. 그러면 언제든지 테이블에는 현재 메모리에서 볼 수있는 10 (또는 11) 개의 셀과 아래의 뷰 10 개 및 아래의 뷰 10 개가 있습니다. 따라서 테이블에는 약 30 개의 셀이 생성되어 다시 반복됩니다.

일부 상황에서는 재사용하기에 충분한 셀이 생성되지 않은 것으로 보입니다.

"수정"하는 방법에 그냥 몇 가지 생각 당신을위한 상황 :

  1. 사용 [myTableView reloadData] 때 테이블보기 frame.size.height 이상으로 테이블 뷰가 contentOffset.y 변경됩니다. 이렇게하면보기에있는 셀을 다시 호출 할 수 있습니다. 많은 양의 데이터 또는 재 작성해야하는 많은 셀이있는 경우 강렬 할 수 있으므로이 방법을 사용하지 않는 것이 좋습니다.
  2. 실제로 몇 개의 셀이 생성되는지 찾습니다. 각 셀에 태그를 추가하고 셀이 표시 될 때마다 기록 할 수 있습니다. 이렇게하면 셀 재사용 방법에 대한 더 나은 시각을 얻을 수 있습니다.
  3. 필요한 셀 수에 따라 각 셀을 만들어 배열에로드 한 다음 cellForRowAtIndexPath에 대한 고유 한 셀을 반환 할 수 있습니다. 필요한 세포의 수에 따라, 이것이 최선의 선택일지도 모른다고 생각합니다.
+0

흥미로운 생각이지만, 매번 (셀을 대기열에서 제외 해제하지 않고 시도 할 때마다 새 셀을 생성하여 강제로) 레크리에이션을 시도했습니다. 또한 이것이 2 개의 세포에서 일어난다 고 나는 생각하지 않는다. – schofs

관련 문제