2014-07-11 2 views
0

편집VC를 수동으로로드하기 위해 Segue를 트리거 할 수 없습니다. self.navigationController는 Nil입니까?

좀 더이 명확하게되었다 주위에 파고 후 그 나는 사파리에서 내가 SEGUE하지 않는다는 예외가에/빠른 애플리케이션 스위치 다음 뷰 컨트롤러 클래스에서 SEGUE를 호출하려고하면 있다. 그것은 확실히, 화면에로드 된 VC에서, 그리고 철자를 검사하고 100 % 맞습니다.

심지어 더 이상하게 만드는 것은 IBAction에서 정확히 동일한 메서드를 호출하면 잘 작동한다는 것입니다. 여기

내가 사용하고있는 코드입니다 :

-(void)goToPhotoPage{ 

    [self performSegueWithIdentifier:@"twitterAuthComplete" sender:self]; 

} 

응용 프로그램의 이력서는 내가 다른 아무것도하지 않고 더불어있는 UIButton에 부착이 IBAction를에서 호출 그러나 경우에 예외를 얻을 때 나는이를 호출하는 경우 segue는 예상대로 작동하고 예외도 없습니다.

- (IBAction)twitterToPhoto:(id)sender 
{ 
    [self goToPhotoPage]; 
} 

rrrrgrghrhhgrgrg!



나는 페이스 북/트위터에 사용자의 사진을 업로드 아이 패드 응용 프로그램 작업입니다

원래의 질문. 응용 프로그램이 난을 재 각성 할 때

내가 트위터 OAuth를 할 사파리로 이동해야하는 과정의 일환으로 앱이 후 특정 URL을 통해 다시 점프 얻을

는 토큰 등의 이유로 그러나

입니다 segue를 트리거하거나 VC를 수동으로로드 할 수 없습니다.

내 AppDelegae에서 업로드 블록이 완료되어 VC에서 메서드를 호출하여 회 전자를 닫고 성공보기로 전환 할 때 호출됩니다.

예상대로 회 전자가 멈 춥니 다. 그러나 어떤 시도를해도 문제가 발생하지는 않습니다.

모든 것이 연결되고, segue에 ID가 있으며 콘솔에 오류 또는 예외가 표시되지 않습니다. 아무 일도 일어나지 않습니다. 이 시점 이후에 segue가 작동하도록 코드를 생성 할 수있는 유일한 방법은 사용자 트리거를 사용하여 하나의 UIButton에 연결 한 다음 다시 완료하는 것입니다.A의

- (void)triggerSuccess 
{  
    [self segueToSuccess]; 
} 

- (void)segueToSuccess 
{  
    [self hideMessage]; 
    UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"done"]; 
    [self.navigationController pushViewController:controller animated:YES]; 
} 

:

- (void)triggerSuccess 
{  
    [self segueToSuccess]; 
} 

- (void)segueToSuccess 
{  
    [self hideMessage]; 
    [self.navigationController performSegueWithIdentifier:@"approveSegue" sender:self];  
} 

뿐만 아니라 : 나는 다음 시도 한 VC에

- (void)postToTwitter:(NSString*)postText image:(UIImage*)image 
{  
    NSData *data = UIImageJPEGRepresentation(image, 0.5); 

    [_twitter postStatusUpdate:postText 
       mediaDataArray:@[data] 
      possiblySensitive:nil 
      inReplyToStatusID:nil 
         latitude:nil 
        longitude:nil 
         placeID:nil 
      displayCoordinates:nil 
      uploadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { 

      } successBlock:^(NSDictionary *status) { 

       ViewController * vc = [[ViewController alloc]init]; 
       [vc triggerSuccess]; 

      } errorBlock:^(NSError *error) { 

       ViewController * vc = [[ViewController alloc]init]; 
       [vc uploadFail:error]; 

      }]; 
} 

: 여기

내 AppDelegate에있는 콜백 코드입니다 순수한 절망의 순간 나는 심지어 시험했다 :

- (void)triggerSuccess 
{  
    [self segueToSuccess]; 
} 

- (void)segueToSuccess 
{  
    [self hideMessage]; 
    //[self.navigationController performSegueWithIdentifier:@"approveSegue" sender:self]; 
    [self dismissViewControllerAnimated:NO completion:nil]; 
    [self.navigationController popToRootViewControllerAnimated:NO]; 
    [self performSelector:@selector(segueToSuccessPart2) withObject:nil afterDelay:0.25]; 
} 

- (void)segueToSuccessPart2 
{  
    UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"done"]; 
    [self.navigationController pushViewController:controller animated:YES]; 
} 

분명히 뭔가를 놓쳤습니다. 그리고 응용 프로그램을 백그라운드로 이동하고 VC가 메모리에서 "언로드"되고 재 - instatiating이 필요하다고 생각합니다. 그걸로 시작하자.

나는 창문 밖으로 컴퓨터를 던져 버릴 테니 어떤 도움이라도 대단히 감사하겠습니다. .

[self dismissViewControllerAnimated:NO completion:nil]; 
[self.navigationController popToRootViewControllerAnimated:NO]; 

self.navigationController는 무기 호입니다 :

감사

가레스

를 해결 좀 더 일을 한 후 편집 한

은 VC에서이 통화 중에 나타납니다. . .

내가보고있는 문제의 원인 일 가능성이 높습니다. 킬린에 의해 제안

편집

2 그래서 나는 내가 탐색 컨트롤러를 유지 있는지 확인하려합니다.

나는 AppDelegte에서 다음을 수행 한 :

@property (nonatomic, strong) UINavigationController *navController; 

@synthesize navController; 

하지만 아래의 코드를 사용하여 VC에서이 액세스하려고 할 때, 그것은 여전히 ​​전무입니다. . 나는 또한 탐색 컨트롤러를 의미 AppDelegate에,이를 추가 한 3

AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate]; 
UINavigationController *navController = appDelegate.navController; 

[self dismissViewControllerAnimated:NO completion:nil]; 
[navController popToRootViewControllerAnimated:NO]; 

편집은 더 이상 무기 호입니다. 그러나 여전히 아무 일도 일어나지 않습니다. . .

답변

0

당신은 모두 기각하고 뷰 컨트롤러와

마다의 ViewController 팝업 또는 기각해야 하나 함께 팝업 할 수없는이가 자신의 NavigationController는 AppDelegate에 추가 한 네비게이션 컨트롤러를 기본으로 가리 킵니다.

그래서, 당신은 또한 당신이 AppDelegate에

에 네비게이션 컨트롤러를 초기화 여부 또한 확인 self.navigationController (편집 3)

하여 액세스 할 수 있습니다

self.navController = [[UINavigationController alloc] initWithRootViewController:firstVC]; 
2

프로그래밍 방식으로 생성 된 View Controller를 사용하여 스토리 보드에서 segue를 수행하려고하는 중입니다.

-performSegueWithIdentifier: sender:을 완전히 잘못 사용했습니다. 이 메서드에서 "보낸 사람"은 단추 또는 다른 컨트롤이 segue를 초기화하지만 밀어 넣을보기 컨트롤러는 아닙니다.

일반적으로 스토리 보드로 단절이 생성됩니다. 하지만 실제로 수동으로 생성해야하는 경우에는 다음을 호출하십시오.

-[UIStoryboardSegue initWithIdentifier:source:destination:] 

소스 및 대상은보기 컨트롤러입니다. https://developer.apple.com/library/ios/recipes/xcode_help-interface_builder/articles-storyboard/StoryboardSegue.html 또는 (사용자 정의는 segues에 대해)이 :

이 읽기 ​​

+0

안녕 킬린, 당신의 빠른 응답 주셔서 감사합니다. 명확히하기 위해, 나는 수동으로 VC에서 목적지 VC까지의 스토리 보드에 segue를 생성하고 식별자를 부여했습니다. 흥미롭게도 나는 좀 더 많은 문제 해결을했고, rootVC에 pop하려고 할 때 self.navigationController는 nil 인 것처럼 보입니다. 나는이 문제의 근원이라고 생각합니다. –

+0

아마 네, AppDelegate의 내비게이션 컨트롤러 나 다른 곳의 네비게이션 컨트롤러에 대한 강력한 참조를 보유하고 있습니까? – kelin

+0

아니요 표준 상용구 이외의 탐색 컨트롤러를 고정하는 데 아무 것도 추가하지 않았습니다. –

관련 문제