2012-12-03 3 views
2

Xcode 4.2에서 iOS 5.1 응용 프로그램을 개발 중입니다. 다른 탭이있는 uitablcontroller가 있습니다. 내 문제는 탭을 클릭하면 몇 초 동안 응용 프로그램이 멈추고 모든 코드가 수행되지만 UIAlertView가 먼저로드되지 않습니다.iOS의 UITab 동결

나는 UIAlertView를 viewDidLoad에 선언했습니다. 는 여기에 코드입니다 :

- (void)viewDidLoad 
{ 



NSLog(@"##### VIEW DID LOAD 1 #####"); 


// Display Alert: Loading 

alertView = [[UIAlertView alloc] initWithTitle:@"Loading" 
             message:@"\n" 
             delegate:self 
          cancelButtonTitle:nil 
          otherButtonTitles:nil]; 

UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
spinner.center = CGPointMake(139.5, 75.5); // .5 so it doesn't blur 
[alertView addSubview:spinner]; 
[spinner startAnimating]; 
[alertView show]; 

[super viewDidLoad]; 


NSLog(@"##### VIEW DID LOAD 2 #####"); 


self.tableView.dataSource = self; 
self.tableView.delegate = self; 

[self callMainMethod]; 

} 

탭을 클릭하면, 내가 처음 NSLog 년대가 로그에 표시됩니다, 다음 주 메서드가 호출되지만 UIAlertview가 표시되지 않는 것을 볼 수 있습니다.

+0

정오표, Xcode 4.5 – mhmdshawqi

+0

사용자 정의 구현 전에 superview의'viewDidLoad'를 호출 해보십시오. – Abizern

+0

## Solution ## emrys57의 대답으로 문제가 해결되었습니다! 대답은 [self callMainMethod]를 viewDidAppear로 이동하는 것입니다. 테이블에 데이터를보기 위해 필 요한 함수를 호출 한 후 [self.tableview reloadData]를 넣어야했습니다. – mhmdshawqi

답변

1

viewDidLoad이 실행중인 경우 연결된 UIView의 frame에 크기가 0 일 수 있습니다. 나도 모르겠지만 UIAlertView은이 제로 크기의 프레임에 그 자체를 나타낼 수 있습니다. viewDidAppearUIAlertView을 표시하면 의미가 있습니까?

[self callMainMethod]이 많은 컴퓨팅 성능을 필요로하는 경우 디스플레이가 완료 될 때까지 디스플레이가 업데이트되지 않을 수 있습니다. 그것을 viewDidAppear으로 옮길 수 있습니다. 또한 UI 스레드의 기본 실행 루프, 디스플레이가 업데이트되는 스레드 및 viewDidLoad 메서드와 다른 모든 view... 메서드를 실행하는 스레드가 지연되기 때문에 모든 것을 완료하고 시작하기 전에 유휴 상태가 될 수 있습니다 무거운 처리. 실행 루프가 실제로 디스플레이를 업데이트하기 시작할 수있는 모든 처리를 완료 한 경우에만 해당됩니다. 이처럼 :

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 200000000), dispatch_get_main_queue(), ^{ 
    [self callMainMethod]; 
} 

그에 대한 내용은 해당 의혹이 맞다면, 당신은 다음 callMainMethod 실행되는 동안 만 모든 것이 잠시 동안 죽은 이동하십시오, 똑바로 터지는 UIAlertView을 얻어야한다 http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

에있다 .

나는 "여기까지의 모든 것을 가지고 디스플레이를 업데이트하는 것을 끝낸 후에 만이 블록을 보내라."라고 쓰고 싶었지만 그렇게하는 법을 모르겠습니다. 위의 디스패치 호출은 callMainMethod에 대한 호출을 200ms 지연해야합니다. 일반적으로 많습니다.

그럴 경우 "이 방법을 실행하는 동안 화면이 멈추는 것을 어떻게 막을 수 있습니까?"와 같은 다른 질문을 시작해야합니다.

+0

viewWillAppear 및 viewDidAppear에서 UIAlertView를 추가하려고 시도했지만 탭을 클릭하면 '고정되어'데이터 및 경고가 표시됩니다. 얼굴 응답에 감사드립니다. 도와 주셔서 감사합니다. =) – mhmdshawqi

+0

적어도 진행 상황입니다. 나는 대답을 업데이트했고, 당신은 그것을 시도 할 수 있었다. – emrys57

+0

그게 다야 !! 고마워! mainMethod를 ViewDidAppear로 이동하면 문제가 해결됩니다. 아주 상세하고 설명적인 답변을 해주셔서 감사합니다. – mhmdshawqi