2011-04-13 4 views
1

코딩하는 동안 문제가 하나 있습니다. 루프에 내 사용자 정의 버튼을 사용하여 뷰에 20 개의 이미지를 표시했습니다. 잠시 후 새로운 이미지로 버튼 이미지를 변경하고 있습니다. 그러나 여기서 일어나는 일은 오래된 이미지가 현재 이미지의 뒷면에 표시됩니다. 이 중objective-c에서 새 이미지가있는 uibutton의 오래된 이미지를 제거하려면 어떻게합니까

for(currentRow = 0; currentRow < 5; currentRow++) 
    { 
     for (currentColumn = 0 ; currentColumn < 4; currentColumn++) 
     { 
      if(indexValue<20) 
      { 
       printf("\n index value %d",indexValue); 
       A *aObject = [aList objectAtIndex:indexValue]; 

       MyCustomButton *myButton = [[MyCustomButton alloc] initWithIdValue:aObject.aName]; 
       CGRect imageFrame = CGRectMake(currentColumn * 80+5, currentRow * 80+5, 67, 67); 
       [myButton setImage:[UIImage imageNamed:aObject.aName] forState:UIControlStateNormal]; 
       [myButton setFrame:imageFrame]; 
       myButton.backgroundColor=[UIColor clearColor]; 
       [myButton addTarget:self action:@selector(aAction:) forControlEvents:UIControlEventTouchUpInside]; 
       [myView addSubview:myButton]; 
       [myButton release]; 
       myButton = nil; 
} 
} 
} 

도움 저를,

감사합니다, 마단 모한.

+1

코드를 붙여 넣는다면, 우리는 그 시간을 아무렇지도 않게 수정하게 될 것이라고 확신합니다. –

+0

코드 없이는 무슨 일이 일어 났는지 알기가 매우 어렵습니다. 당신이 새로운 UIImageViews를 할당하는 것 같아요. 예전의 이미지를 변경하는 것이 아닙니다. – MCannon

+0

질문을 편집하고 초기에 UIButton 이미지를 업데이트 할 루프를 추가하십시오. –

답변

1

이미 언급 한대로 : 이미지를 변경하고 싶을 때마다 새 버튼을 추가하지 마십시오. 내가 택할 수있는 방법은 뷰의 viewDidLoad에 필요한 모든 버튼을 만들고 거기에 추가하는 것입니다.

- (void)viewDidLoad 
{ 
    for(int i = 0; i < columnCount; i++) 
    { 
     for(int j = 0; j < rowCount; j++) 
     { 

      MyCustomButton *myButton = [[MyCustomButton alloc] initWithIdValue:aObject.aName]; 
      CGRect imageFrame = CGRectMake(currentColumn * 80+5, currentRow * 80+5, 67, 67); 
      forState:UIControlStateNormal]; 
      [myButton setFrame:imageFrame]; 
      myButton.backgroundColor=[UIColor clearColor]; 
      [myButton addTarget:self action:@selector(aAction:) forControlEvents:UIControlEventTouchUpInside]; 
      [myView addSubview:myButton]; 
      [myButton release]; 
      myButton = nil; 
     } 
    } 
} 

그런 다음 당신은 그냥 다음 줄과 루프의 이미지를 변경할 수 있습니다 (의사 코드) :이 같은 예를 들어 (의사 코드)

  myButton = buttonMatrix[row][column]; 
      [myButton setImage:[UIImage imageNamed:aObject.aName] forState:UIControlStateNormal]; 

이 훨씬 적습니다 메모리 컴 소비는 항상 오래된 단추를 풀지 않고 새 단추를 만드는 것보다.

+0

@Madan Mohan 여기에 작성한 코드는 복사하여 프로젝트에 붙여 넣는 것이 아닙니다. 그러면 작동하지 않습니다. 방금 작성한 코드를 사용하여 의사 코드로이 코드를 작성했습니다. 이렇게하면 실수를 다시하지 않게됩니다. :) – Maverick1st

0

당신은 문제를 해결하려면 다음 두 가지 옵션이 있습니다 :

1) 루프에서 만든 버튼의 포인터를 저장을 setImage를 이미지를 업데이트 할 때, 버튼 포인터를 사용을 호출 : forState : 다시,이 대체 할 새 이미지와 버튼에서 오래 된 이미지. 그리고 단추의 초기화/삭제 시간을 저장합니다.

2) 버튼 포인터를 단계 1)로 저장하고 [button removeFromSuperView]를 호출하여 수퍼 뷰에서 버튼을 제거한 다음 새 버튼을 다시 만들고 수퍼 뷰에 다시 삽입합니다. 이전 단추가 삭제되고 새 단추가 초기화되므로이 작업의 성능 (시간)이 오래 걸리고 새 단추를 만든 후 단추의 위쪽에 다른 하위보기가 추가 된 경우이 방법은 권장되지 않습니다 , 상단에있는 모든 뷰를 맨 위에 다시 표시해야합니다. 따라서 새 버튼을 다시 만들어야하는 특별한 이유가 없으면 1 단계)를 따르십시오. 간단하고 빠릅니다.

관련 문제