0

この質問に従って、ログイン シーケンスのデリゲートをセットアップしようとしています

私のアプリケーションには、メイン ビュー (MESHomeViewController) があります。次のようなログイン構造もあります。

  1. MESLoginNavController
  2. MESWelcomeViewControllerのルートView Controllerで
  3. スタックにプッシュできる MESLoginViewController と MESSignupViewControllers もあります。

私の目的は、ユーザーがログインしたときにのみ呼び出されるデリゲート メソッドを用意することです。ビューはさまざまな機会にリロード/表示されることが多いため、viewDidLoad を使用できないため、デリゲートを使用しています。ユーザーがいつ完了したかを確認する必要があります。ログインする。

ユーザーは、Welcome コントローラー (Facebook 経由) または login コントローラー (通常の方法経由) および Signup (signup ;) 経由でログインできます。

これは私が以下に実装しようとしたものです: MESHomeViewController.h

#import "MESWelcomeViewController.h"

@interface MESHomeViewController : UIViewController <LoginViewControllerDelegate>

@end

MESHomeViewController.mで、ユーザーがログインしているかどうかを確認します。次の手順が完了していない場合:

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

MESWelcomeViewController.hには、次のものがあります。

@protocol LoginViewControllerDelegate;

@interface MESWelcomeViewController : UIViewController <NSURLConnectionDataDelegate>

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

@end



@protocol LoginViewControllerDelegate <NSObject>

- (void)didLoginUser;

@end

カスタムメソッドを介してユーザーが完全にログインしたら。ユーザーがログインすると、MESWelcomeViewController.m

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

ただし、デリゲート メソッドは呼び出されていません。welcomeViewController の self.delegate が Null のようです。上記のセットアップに基づいて、デリゲートをログイン ナビ コントローラーとして設定する必要があると考えていますが、現在ナビにプッシュされているビュー コントローラーからデリゲート メソッドを呼び出す方法がわかりません。

4

2 に答える 2

0

ViewControllerコンテナによって解放されるか、プロパティを設定するのが早delegateすぎます。

これを最初のView Controllerに追加することをお勧めします:

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

最初のオプションを除外するだけです。

loginNavVC2 番目のオプションを確認するには、 を設定した直後に印刷しdelegate、 でないことを確認しnilます。

于 2013-05-10T13:21:32.167 に答える
0

確認のために、プライマリ ビューである MESHomeViewController があります。ここから、MESWelcomeViewController をスタックにプッシュします。MESWelcomeViewController はいくつかのログイン処理を実行でき、完了すると [self.delegate didLoginUser] を呼び出します。

この場合、MESWelcomeViewController を初期化するときにデリゲートを設定する必要があります。これは、いくつかの方法で簡単に行うことができます。IDを受け取るMESWelcomeViewControllerのinit関数を持つことができます

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

または、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 の initialize または 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]
于 2013-05-10T15:05:25.210 に答える