2013-06-14 2 views
0

내 앱에 사용자가 선택한 테마 옵션을 추가했습니다. 각 관련 요소 (주로 UIView)는 NSUserDefaults BOOL의 상태에 따라 모양이 조건 적으로 변경됩니다.iOS에서 사용자가 선택한 테마 - 전체 UI에서 setNeedsDisplay가 가능합니까?

#define을 사용하여 상태를 설정하고 빌드하고 실행하면이 기능이 잘 작동합니다. 그러나 사용자가 전환을 전환 할 때 UI를 "새로 고침"해야합니다.

이론에서 나는 생각한다 나는 self.window에서 setNeedsDisplay를 캐스케이드해야한다. 이것을 달성하는 현명한 방법이 있습니까? 아래 링크에서 @ mattmook의 솔루션을 사용하여 subViews를 사용하여 작업 해 보았습니다. 그러나 충분히 멀리 진행되지는 않습니다. 내가하려고하는 것을 달성하는 최선의 방법이라고 확신하지 않습니다.

iPhone Programming setNeedsDisplay not working

사람 중 하나는 이것이 최선의 방법임을 확인하거나 간단한 무언가를 제안 할 수 있습니다?

감사합니다. Steve

답변

2

관심있는 의견을 수신 대기로 설정합니다. 데이터가 변경되면 알림을 보내고 모든보기가 스스로 업데이트되도록하십시오.

일반적으로 이러한 기능을 분산화하는 것이 좋습니다.

+0

내가가는 경우 동의하다. 전체 뷰 계층 구조를 탐색하려고 할 때 변경하지 않아도되는 UIView를 반복하는 데 너무 많은 시간을 소비 할 것입니다. 이것은 NSNotification이 해결하도록 고안된 문제입니다. –

0

실제로 색 변경을 적용하는 방법에 따라 다릅니다. 사용하고있는 각 UIView 객체를 서브 클래스로 만들었는지 확인하여 자신이 색을 페리에서 가져오고 그 자체를 그리기 전에 적절하게 변경했는지 확인 했습니까? 이와 같은의 drawRect 덮어 쓰기로 :

- (void) drawRect:... { 

    if (somehowFetchTheUserDefaultsBoolValueHere) { 
    self.tint = [UIColor redColor]; // details here may vary depedning on the actual superclass 
    } else { 
    self.tint = [UIColor greenColor]; 
    } 

    [super drawRect:...]; 
} 

을 (. 그냥 원리를 보여주는 그 코딩의 스마트 한 가지 사실이 있습니다.)

당신이 다음 setNeedsDisplay 현재 뷰 컨트롤러의 self.view 할 것에 있음을했다면.

대체 방법 : 다른 방법으로 색조를 수행하는 경우 현재 제시된 모든 색조를 나타내는 코드를 실행해야합니다. 그것은 대부분의 경우 뷰 컨트롤러가 위에 있습니다. 다른 모든보기 컨트롤러의 경우 viewWillAppear 메서드에 색 코드를 배치 할 수 있습니다. 잘 작동합니다. 그 자신을 단지 신중히 했는가.

그러나 모든 뷰를 서브 클래스로 만드는 것은 앱의 전체 크기에 따라 일회성 노력을 의미하기 때문에 더 효율적일 수 있습니다. 또한 다른 앱에서도 재사용 할 수 있습니다.

0

내가 각보기에 setNeedsDisplay 충돌 확인 (또는의 drawRect 또는 무엇이든 새로 고침보기와 같은 사용자 정의 메소드와 같이 일반적으로 명명 된 메소드를 호출) 나는 그것을 할 것 재귀

-(UIView *)redrawView:(UIView *)theView 
{ 
    if([[theView subviews] count] = 0) 
    { 
     [self setNeedsDisplay]; 
     return theView; 
    } 

    for(UIView *subview in theView.subviews) 
    { 
     UIView *result = [self redrawView:subview]; 
     if(result) return result; 
    } 
    return nil; 
} 
관련 문제