2011-10-26 5 views
3

이것은 실제 문제가 아니며 단지 설명 만하면됩니다. UIButton (각 단추에 태그가 있음)에 하위 뷰를 추가하려고합니다. 4 또는 5 개의 하위 뷰가있을 수 있습니다. 그래서, 일부 파단 (이 경우 특히 4, 5)를 제거하고자 할 때 : 5하지 더 있기 때문에,태그가있는 하위보기를 안전하게 제거하십시오.

int cnt=[[(UIView *)[self.scrollView viewWithTag:index] subviews] count]; 
    if (cnt==4) { 
     [[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:3] removeFromSuperview]; 
    } 
    if (cnt==5) { 
     [[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:3] removeFromSuperview]; 
    //[[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:4] removeFromSuperview]; <-- this crash 
     [[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:3] removeFromSuperview]; 

    } 

주석으로 라인은 물론, 실행 할 수 없습니다 만, 4 파단 . 그래서 동일한 인덱스에서 두 번 가리키는보기를 제거해야합니다. 안전하게 제거 할 수 있는지 알고 싶습니다. 마지막보기가 배열 [[self.scrollView viewWithTag:index] subviews]의 한 위치 아래로 이동했는지 확인하고 싶습니다.

희망적입니다. 감사

답변

4

는 차라리 이런 식으로 뭔가를 사용하십시오 : 목록에서 개체를 제거 할 때

for(int i=cnt-1;i>=3;i--) 
{ 
    [[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:i] removeFromSuperview]; 
} 

보통, 가장 안전한 방법은 말에서 시작하는 것입니다. 이런 식으로 그들이 재조직 되더라도 그것은 중요하지 않습니다.

8

당신이이 일의 다음 안전한 방법으로 제거 할 뷰의 태그를 알고있는 경우는 다음과 같습니다 여기

[[parentView viewWithTag:tag] removeFromSuperview]; 

당신이 자신을 제거하기 위해 아이 뷰를 묻는 것이 아니라 부모보기를 요구하고있다 잘못되었을 수도있는 일부 주문에 따라 아동을 퇴치하는 것.

+0

또한 특정 태그가있는보기가 없으면 그냥 nil을 반환하고 원하는 모든 메서드를 호출 할 수 있습니다. – jrturton

+0

응답 주셔서 감사합니다, 나는 이것을 알고 있지만 하위 subviews 태그가 없습니다, 난 그냥 4 또는 5 subviews있을 수 있습니다. – Mat

+0

일부 예상 된 순서에 따라 자녀보기에 액세스하는 것은 내게 정말로 허약합니다. 그들에게 태그를 붙이거나 그들을 식별하는 다른 방법이 있어야합니다 (예 : 인스턴스 변수 또는 사전에서 참조를 유지하는 것). –

관련 문제