2013-11-25 3 views
1

어떻게 스레드에서 다른 viewcontroller를 시작할 수 있습니까?NSThread presentview 컨트롤러 호출?

내 코드가 작동하지 않습니다

- (IBAction)btnGotoNextVC:(id)sender 
{ 
    [self.isLoading startAnimating]; 

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

    [NSThread detachNewThreadSelector:@selector(gotoSecondController:) 
          toTarget:self 
          withObject:[NSArray arrayWithObjects:@"hello there", nil]]; 
} 

내 스레드 :

- (void) gotoSecondController: (NSArray*) parameters 
{ 
    NSString* data1 = parameters[0]; 

    NSLog(@"%@", parameters[0]); 

    ViewController2 *VC2 = [self.storyboard instantiateViewControllerWithIdentifier:@"myView2"]; 
    VC2.global_myLabel = [NSString stringWithFormat:@"Hallo %@", data1]; 
    [self presentViewController:VC2 animated:YES completion:nil]; 
} 

그것은이 선으로 추락 한 것 :

[self presentViewController:VC2 animated:YES completion:nil]; 

오류는 다음과 같습니다

-[NSStringDrawingContext animationDidStart:]: unrecognized selector sent to instance 0x8f983c0 

무엇을 할 수 있습니까? 답변 주셔서 감사합니다!

답변

1

아니요, UI를 업데이트하는 모든 항목은 기본 스레드에서 실행해야합니다.

코드를 수정하려면 주 스레드에서 실행해야합니다. 메인 스레드에서 일부 코드 실행을 할 수 있습니다,

[self gotoSecondController:@[@"hello there"]]; 

그러나 이미 주 스레드에서없는 경우, 가장 쉬운 방법은 IBActions 항상 주 스레드에서 호출 변경할 수 없기 직접 메소드를 호출하는 것입니다 몇 가지 다른 방법으로 블록 :

__block MyViewController *blockSelf = self; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [blockSelf gotoSecondController:@[@"hello there"]]; 
}); 

또는

[self performSelectorOnMainThread:@selector(gotoSecondController:) withObject:@[@"hello there"] waitUntilDone:NO]; 
+0

이 답변에 감사드립니다 방법을 사용하여! 하지만 UITableView 있고 웹 페이지에서 소스 코드를 가져 와서 구문 분석하십시오. 페이지에서 소스 코드를 읽는 함수를 호출하면 UI가 멈 춥니 다. 이 문제를 어떻게 해결할 수 있습니까? 버튼을 클릭하고 웹 사이트 코드를 읽을 때 첫 번째 컨트롤러가 멈 춥니 다. 빠른 답변에 감사드립니다. – user3032152

+0

나는 그것이 무엇을 빨아 먹는가에 달려 있다고 생각한다 ... 메인 쓰레드의 HTML을 모두로드하거나 파싱하고 있는가? 그것은 일을 묶을 것입니다. 당신은 만들고 별도의 스레드에서 UIViewController에 데이터를 전달하고 주 스레드에 그것을 제시, 그게 당신을 위해 일하는 것입니까? 별도의 스레드에서 레이블 텍스트를 변경할 수 있는지 확실하지 않으므로 백그라운드 스레드에서 레이블 텍스트를 변경하고 기본 스레드에서 레이블을 업데이트해야합니다. – cjwirth