2012-11-20 2 views
0

이것은 분명히 아무것도 아니지만 immediatly 나타나지 않는 UIView에 문제가 있습니다. 여기 UIView가 직접 나타나지 않습니다.

코드입니다 :

SettingViewController.m

- (IBAction)reloadParametersDB:(id)sender { 
    LoadingView* loadingView = [LoadingView loadLoadingIntoView:self.view]; 
    [dbService fillParametersTables]; 
    [loadingView removeLoading]; 
} 

LoadingView.m

+(LoadingView *)loadLoadingIntoView:(UIView *)superView{ 
    LoadingView *loadingView = [[LoadingView alloc] initWithFrame:superView.bounds]; 
    if (loadingView == nil) return nil; 
    loadingView.backgroundColor = [UIColor blackColor]; 
    [superView addSubview:loadingView]; 
    return loadingView; 
} 
내가 문제를 실제로 내가보고 있어요 loadLoadingIntoView에 뭔가를 인쇄하고있을 때 때문에 작동

fillParametersTables가 완료된 후에 addSubview가 효과적이라는 것입니다 ...

아무도 그것을하는 방법을 알고 있습니까?

감사합니다.

+0

은 어쩌면 당신은 테이블을 채울 수 백그라운드 스레드에서 모든 매개 변수가 아직 추가되었는지 여부에 관계없이 즉시 서브 뷰에 추가됩니다. 그냥 질문입니다.'self'를 사용하지 않고'loadLoadingIntoView' 메쏘드에'LoadingView'의 새로운 인스턴스를 생성 할 이유가 있습니까? – sooper

+0

그래, 실제로는, 그리고 채우기 테이블이 조금 길기 때문에, 나는 단지 사용자가 기다려야한다는 것을 알 수 있도록 현재 뷰의 상단에 로딩 뷰를 표시하고 싶습니다. 그리고 애플리케이션은 고정되어 있지 않습니다. 무슨 뜻인지 알 겠어? ... – EdRbt

답변

1

디스플레이를 업데이트하려면 이벤트 루프로 돌아 가야합니다. 한 가지 방법은로드보기를 자체 메서드에 설정 한 다음 performSelector:withObject:afterDelay:을 사용하여 선을 배치하는 것입니다.

예 :

- (void)doTableLoading:(id)loadingView { 
    [dbService fillParametersTables]; 
    [(LoadingView *)loadingView removeLoading]; 
} 

- (IBAction)reloadParametersDB:(id)sender { 
    LoadingView* loadingView = [LoadingView loadLoadingIntoView:self.view]; 
    [self performSelector:@selector(doTableLoading:) withObject:loadingView afterDelay:0.1f] 
} 

(.이 코드는 HTML 폼 내부에 작성되었으며 심지어 컴파일하지 않을 수 있습니다 ...하지만이 전략의 아이디어를 줄 것이다)

+0

대단히 고마워요! 그것은 효과가있다! :) – EdRbt

관련 문제