2016-05-06 4 views
0

私はcompanys製品の拡張版であるアプリを作った。ユーザーは、当社の製品と同じユーザー名とパスワードでログインします(サーバー側で処理されます)。目的C:NSObjectクラスからルートに戻す

基本的に、ユーザーは、アプリに「stuff」と入力してからサーバーに送信します。サーバーへの各呼び出しは、ユーザー名とパスワードが正しいかどうかをチェックします。 (コアデータに格納されています&キーチェーン)

回答が無効な場合(例えば上司がパスワードを変更した場合など)、ユーザーはアプリから削除する必要がありますと、ルートビューとのつながり。 < - これは私が立ち往生した場所です。

私はサーバーからの応答を処理するNSObjectクラスXYZUploader.mを持っています。 無効なパスワードを返信するたびに、私はrootにセグをしたい。

Overview

XYZUploaderは、上記見つけることができるのViewControllerありません。これは、(とりわけ)レスポンスを処理する単なるNSObjectクラスです。だから簡単:

[self.navigationController popToRootViewControllerAnimated:YES]; 

は動作しません。

私はXYZiPad_Loginに(?委任)XYZUploaderリンクしたい
Property 'navigationController' not found on object of type 'XYZUploader' 

(根、上記の最初のViewController):私はエラーを取得します。だから私は、時間にどのようなviewcontrollerユーザーが起こっているかにかかわらず、ルートに戻るように関数を呼び出すことができます

どうすればよいですか?

答えて

0

登録通知、ログアウト方法はrootviewcontrllerの移行を処理する必要があります

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

XYZUploader.mの投稿通知

dispatch_async(dispatch_get_main_queue(), ^{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"InvalidCredentialsNotification" object:nil]; 
}); 
+0

これは素晴らしい作品です。自分のXYZiPad_Loginの中にログアウト機能のコールバックを取得します。しかし、どうすればそれを自分自身に戻すことができますか(それが理にかなっていれば) –

+0

segueはどういう意味ですか?あなたの質問の私の理解は、ログイン画面を表示した後、適切な資格情報を入力し、ログアウトする前に既存のビューに移動する必要がログインボタンをタップします。これはあなたの質問ですか?説明してください? – Jeyamahesan

+0

簡単に言えば:XYZUploader.m内のInvalidCredentialsNotificationを呼び出すと、ルートVCが表示されます。 –

1

私が正しく理解していれば、アプリケーションの任意の場所で、ネットワークエラーが返ってくる可能性があります。この場合、rootViewControllerを表示します。

あなたは説明した方法でダウンローダーをviewControllerに直接リンクさせたくありません。ダウンローダは、認証エラーが発生し、ユーザがもはや許可されていないことを(例えば、NSNotification、代理人、KVOを介して)知らせたい。次に、viewController階層を制御しているオブジェクトは、viewController階層を再編成できます。あなたのviewControllerは、appDelegateでこれを行うには十分に単純だと思われますが、あなたのアプリが今後の成長に向かうと思われる場合は、適切なVC階層が設定されていることを確認する専用のオブジェクトを作成することを検討してください。

1

viewControllerに、ナビゲーションコントローラのルートビューコントローラにポップするよう通知する方法が必要です。

ここで、各リクエストにはユーザーのユーザー名とパスワードも含まれているため、これを通知したい状況はどのような要求でも発生する可能性があります。

私の提案は、あなたのアプリケーションでそれを聞いている人にメッセージをブロードキャストできるようにするクラスNSNotificationCenterを使用することです。

たとえば、この通知を「XYZLogOut」とします。あなたのViewControllerの-viewWillAppear方法で

、この通知のためのオブザーバーとして登録:

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

-viewWillDisappear:方法にオブザーバーとしてのViewControllerを削除することを確認してください:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

注ことその通知がブロードキャストされたときに呼び出される同じセレクタ名を持つメソッドを作成する必要があります。ログアウトが発生する必要があるときに

-(void)shouldLogOut 
{ 
    [self.navigationController popToRootViewControllerAnimated:YES]; 
} 

最後に、XYZUploaderクラスでは、この通知を呼び出す必要があります:rootviewcontrllerで

[[NSNotificationCenter defaultCenter] postNotificationName:@"XYZLogOut" object:nil userInfo:nil]; 
+0

私が正しく理解したら、shouldLogOut関数を保持し、XYZiPad_LoginクラスのviewWillAppearとviewWillDisappearコードを追加するNSNotificationCenterのサブクラスでクラスXYZLogOutを作成する必要がありますか? –

関連する問題