2

皆さん、

ナビゲーションロジックに問題があります。現在、私は単純な2つのタブ付きタブバーアプリケーションを持っています。しかし、私は前にログイン画面を表示したいと思います。つまり、それはUIViewになります。

現在、コードは次のとおりです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    UIViewController *viewController1 = [[roosterViewController alloc] initWithNibName:@"roosterViewController" bundle:nil];
    UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];

    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = @[viewController1, viewController2];
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];

    return YES;
}

したがって、これは単純なタブコントローラーをプッシュします。さて、ログイン画面が欲しいです。つまりUIView、タブバーコントローラーを押すだけの簡単なものになります。しかし、私はこれを行う方法の論理を見ることができないようです。

私はモーダルビューコントローラーを提示しようとしていますが、重要なのは、タブバーがバックグラウンドで読み込まれることです。タブバービューで機能するにはユーザー名/パスワード情報が必要なので、これは機能しません。

私のロジックは次のようになります。

デリゲート>loginViewControllerのロード>タブバーコントローラーのロード

ただし、「ログアウト」できる必要があります。したがって、タブバーコントローラを破棄して、ログイン画面を表示する必要があります。

これについて何か考えはありますか?

4

5 に答える 5

1

あなたはこのようなことをすることができます:

AppDelegateが準拠するプロトコルを作成できます。

@protocol Authenticator <NSObject>
@required
- (void)authenticateWithUsername:(NSString *)username andPassword:(NSString *)password;
- (bool)authenticated;
@optional
- (void)authenticationSuccess;
- (void)authenticationFailure;

..。

@interface AppDelegate : UIResponder <UIApplication, Authenticator>
@property (readonly, nonatomic, assign) bool loggedIn;

..。

@implementation AppDelegate
@synthesize loggedIn = _loggedIn;

- (void)authenticateWithUsername:(NSString *)username andPassword:(NSString *)password
{
   //if success
      _loggedIn = YES;
   //check if app responds to the optional authenticateSuccess method
   //call it if it does
   //else fail
      //do stuff
}

- (bool)authenticated
{
   if (_loggedIn != NULL) {
      return _loggedIn;
   }
   //do other stuff
}

..。

私は適切なobjective-cの規則と構文について少し曖昧なので、いくつかのエラーがあれば許してください。しかし、とにかくそれはうまくいく論理と擬似コードです。必要に応じて調整してください。

これがお役に立てば幸いです。

編集:

私の答えは少し未完成だったと思います。あなたの質問に対する答えは、ある種の認証構造に強く関連しているように私には思えました。アプリが認証に非常に密接に関連している場合は、認証構造を介したフローを制御してみませんか。それが私のポイントだったと思います。これらはすべてアプリデリゲートで便利かつ簡単に利用できるため、これらのメソッドを任意の場所で呼び出すことができます。たとえば、認証ロジックで表示するビューコントローラーを決定できます。

于 2012-12-17T18:45:53.760 に答える
1

前述のように、rootViewとしてログインし、ログインが成功した場合は他のタブバーボタンを有効にします。それ以外の場合は、このように有効にしないでください。最初にビューの読み込み時にブール値をfalseに設定し、成功した場合はタブバーボタンを有効にします。

login = TRUE;


UITabBarItem *reportit = [[[[self tabBarController]tabBar]items] objectAtIndex:2];
[reportit setEnabled:TRUE];

else {

UITabBarItem *reportit = [[[[self tabBarController]tabBar]items] objectAtIndex:2];
[reportit setEnabled:FALSE];

}

于 2012-12-17T23:56:06.487 に答える
0

ログイン画面をrootに設定することをお勧めします。ログインが成功したら、ウィンドウのルートをタブバーコントローラーに変更するだけで、アニメーションがうまくいきます。

于 2012-12-17T17:04:51.080 に答える
0

現在のタブバーと同じようにタブバーを設定することをお勧めしますが、makeKeyAndVisibleの直後に、アニメーションなしでログインビューコントローラーをインスタンス化して表示します。

このように、アプリが起動すると、ユーザーにはtabBarControllerは表示されず、モーダルに表示されるログイン画面のみが表示されます。ログインが完了したら、ログインビューコントローラを閉じるだけで、その下にタブバーコントローラが表示されます。

于 2012-12-17T17:30:50.437 に答える
0

Leviの答えを拡張すると、これはルートビューコントローラーを継続的に(アニメーションで)切り替える方法です。この拡張機能を追加するだけです。

extension UIViewController 
{
    func transitionToRootViewController(viewController:UIViewController)
    {
        UIView.transitionWithView(self.view.window,
            duration: 0.3,
            options: UIViewAnimationOptions.TransitionCrossDissolve,
            animations: {
                window.rootViewController = viewController
            },
            completion: nil
        )
    }
}

...UIViewControllerクラスに(メソッドtransitionToRootViewController ()すべてのView Controllerで使用できるようにします)、終了するView Controllerで呼び出し、入力するView Controllerを渡します(おそらく、別のストーリーボードからインスタンス化したものです...)パラメータとして。

(基本的な考え方はここから引用しました。コードを少し簡略化しました)

ただし、注意してください。このコードを使用して、選択したインデックス(タブ)にナビゲーションコントローラーが含まれているタブバーコントローラーを挿入しようとしました。トランジションアニメーション中、ナビゲーションコントローラーのナビゲーションバーはステータスバー(キャリア、時計、バッテリーレベル)を「アンダーラップ」し、トランジションアニメーションが完了した後、すぐにその場所に「ジャンプ」して、ひどく気を散らす(そして磨かれない)ようにします。効果。

ナビゲーションコントローラーに埋め込まれた子ビューコントローラーに次のコードを追加することで修正しました。

override func viewWillAppear(animated: Bool)
{
    super.viewWillAppear(animated)

    self.navigationController?.navigationBar.layer.removeAllAnimations()
    // ^ THIS
}

(この修正はこのフォーラムから取得されました。)

確認していませんが、ナビゲーションコントローラー(またはナビゲーションバーが接続されているプレーンバニラ)に移行するたびUIViewControllerに、タブバーコントローラーに埋め込まれているかどうかに関係なく、同じ問題が発生する可能性があります。

于 2015-08-13T01:13:53.363 に答える