0

완료 : - 내 응용 프로그램에서 How do I set up a simple delegate to communicate between two view controllers?내가 설정에 로그인 시퀀스에 대한 대리자를이 질문을 따르도록 노력하고

내가 메인보기 (MESHomeViewController)가 있습니다.

  1. MESLoginNavController
  2. 을 MESWelcomeViewController
  3. 의 루트 뷰 컨트롤러 스택으로 푸시 할 수도 MESLoginViewController 및 MESSignupViewControllers가있다 : 다음 는 또한 로그인 구조를 갖는다.

내 목표는 오직 호출되는 대리자 메서드를 가질 때 뷰가 종종/다시로드 다른 경우에 표시됩니다으로 내가 볼 필요가 그래서 내가있는 viewDidLoad를 사용할 수있다. 내가 대리자를 사용하고 사용자가 로그인 사용자가 로그인을 완료하면

사용자는 환영 컨트롤러 (페이스 북을 통한) 또는 로그인 컨트롤러 (정상적인 방법을 통한) 및 가입 (등록을 통한)을 통해 로그인 할 수 있습니다. MESHomeViewController.h

#import "MESWelcomeViewController.h" 

@interface MESHomeViewController : UIViewController <LoginViewControllerDelegate> 

@end 

을 사용자가 로그인하면 내가 확인 MESHomeViewController.m, 그들은 다음 완료되지 않은 경우 :

내가 아래에 구현하기 위해 노력했다 것입니다 : 나는 다음과 같은 한 MESWelcomeViewController.h에서

NSLog(@"not logged in"); 
MESWelcomeViewController *loginNavVC = [self.storyboard instantiateViewControllerWithIdentifier:@"WelcomeVC"]; 
    loginNavVC.delegate = self; 
[self presentModalViewController:loginNavVC animated:NO]; 

:

@protocol LoginViewControllerDelegate; 

@interface MESWelcomeViewController : UIViewController <NSURLConnectionDataDelegate> 

@property (nonatomic, weak) id<LoginViewControllerDelegate> delegate; 

@end 



@protocol LoginViewControllerDelegate <NSObject> 

- (void)didLoginUser; 

@end 

일단 사용자가 사용자 정의 방법을 통해 완전히 로그인하면. 그러나 사용자가

NSLog(@"%@",self.delegate); 
    if ([self.delegate respondsToSelector:@selector(didLoginUser)]) { 
     [self.delegate didLoginUser]; 
    } 

기록 MESWelcomeViewController.m되면 위임 방법 그것은 self.delegate가 welcomeViewController 대한 NULL이 나타나고 호출되는 것은 아니다. 아마도 위의 설정을 기반으로 로그인 탐색 컨트롤러로 대리자를 설정해야한다고 생각하지만 현재 nav에 푸시 된보기 컨트롤러에서 대리자 메서드를 호출하는 방법을 모르겠습니다.

답변

0

그래서 확인하려면 MESHomeViewController가 기본보기입니다. 여기에서 MESWelcomeViewController를 스택에 푸시합니다. MESWelcomeViewController는 몇 가지 로그인 작업을 수행 할 수 있으며 완료되면 [self.대리인 didLoginUser].

이 경우 MESWelcomeViewController를 초기화 할 때 대리인을 설정해야합니다. 여러 가지 방법으로 쉽게이 작업을 수행 할 수 있습니다. 당신은 MESWelcomeViewController를 생성 한 후,

-(id) init:(id<LoginViewControllerDelegate>)myDelegate { 
    self = [super init]; 
    if (self){ 
     self.delegate = myDelegate; 
     etc... 
    } 
} 

또는 ID를 취하는 MESWelcomeViewController에 대한 초기화 기능을 가지고 있지만, 밀어 전에, 위임 속성

을 설정할 수
MESWelcomeViewController *welcomeView = [[MESWelcomeViewController alloc] init]; 
[welcomeView setDelegate:self]; 
// push view stuff 

편집 :

내가 제공 한 init 함수는 자동으로 호출되지 않으므로 기본 이니셜 라이저 대신 명시 적으로 호출해야합니다. 스토리 보드를 사용하는 경우 대리자 속성을 설정하는 대안을 사용해야합니다. 나는 스토리 보드를 이전에 사용한 적이 있지만, 당신은 아마 이런 식으로 뭔가를 할 수 있어야한다 :

MESWelcomeViewController *welcomeView = [self.storyboard instantiateViewControllerWithIdentifier:@"WelcomeVC"]; 
[welcomeView setDelegate:self]; 
[self presentModalViewController:welcomeView animated:NO]; 

편집 2 : 가장 좋은 대안 대신 알림을 사용하는 것입니다. 듣고 자하는 모든 것은 관찰자를 NSNotificationCenter에 추가하고 이벤트가 발생하면 알림을 게시합니다.

예 :

이 MESHomeViewController의 초기화 나있는 viewDidLoad에 넣어

다음

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didLoginUser) name:@"LoginCompleteNotification" object:nil]; 

당신이 로그인을 완료 할 때마다 그런 다음, 다음을 수행 : 마지막으로

[[NSNotificationCenter defaultCenter] postNotificationName:@"LoginCompleteNotification" object:nil]; 

것은, 그 확인 너는 듣고 있던 무엇이든을 Dealloc에서 듣지 않는다.

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"LoginCompleteNotification object:nil] 
+0

감사합니다, 귀하의 초기화를 사용하려고했지만 NSLog (로그인 완료 블록 내에서) self.delegate 때 나는 여전히 (null)을 얻고 있습니까? 로그인은 다음과 같이 푸시됩니다. '[self presentModalViewController : [self.storyboard instantiateViewControllerWithIdentifier : @ "WelcomeVC"] animated : NO]; ''이 명령은 스토리 보드에서 LoginNavController (시작 컨트롤러를 루트로 사용)를 가리키는 식별자를 푸시합니다. 이 방식으로 모달을 표현하는 동안 두 번째 점을 구현하는 방법을 잘 모르겠습니다. – StuartM

+0

사실 초기화 기능을 호출하지 않는 MESWelcomeViewController에 해당 init 함수를 추가하면 사실 은요? 맞습니까? – StuartM

+0

내가 제공 한 init 함수는 자동으로 호출되지 않으므로 기본 이니셜 라이저 대신 명시 적으로 호출해야합니다. 스토리 보드를 사용하는 경우 대리자 속성을 설정하는 대안을 사용해야합니다.이전에는 스토리 보드를 사용한 적이 없지만 다음과 같이 할 수 있습니다. MESWelcomeViewController * welcomeView = [self.storyboard instantiateViewControllerWithIdentifier : @ "WelcomeVC"]; [welcomeView setDelegate : self]; [self presentModalViewController : welcomeView animated : 아니요]; – Doc

0

ViewController이 컨테이너에서 해제되거나 delegate 속성을 너무 빨리 설정하고 있습니다.

나는 첫 번째보기 컨트롤러에이 추가 좋을 것 :

- (void) dealloc 
{ 
    NSLog(@"deallocing"); 
} 

단지 첫 번째 옵션을 배제 할 수 있습니다.

두 번째 옵션을 확인하려면 delegate을 설정 한 직후에 loginNavVC을 인쇄하고 nil이 아닌지 확인하십시오.

+0

deallocated가 아닌지 확인하기 위해 dealloc에 ​​다음을 추가했습니다. NSLog (@ "% s", __FUNCTION__); (홈 뷰 컨트롤러의 경우). 나는 또한 로그를 추가했다 'NSLog (@ "% @", loginNavVC.delegate);' MESHomeViewController를 반환합니다. 그러나 일단 로그인 한 self.delegate Log는 여전히 null입니까? – StuartM

+0

이 줄은 "MESWelcomeViewController * loginNavVC = [self.storyboard instantiateViewControllerWithIdentifier : @"WelcomeVC "];"라고 생각하기 때문에 실제로 WelcomeVC 인 LoginNavController를 가리 킵니다. 루트보기 컨트롤러로 환영받습니다. 그래서 그것은 실제 welcome view 컨트롤러 대신에 loginNavController delegate를 설정하는 것과 같지만 어떻게해야하는지 확신 할 수 없다. – StuartM