3

最初のView Controllerがどのように選択され、どのように動的に変化するかを理解する上で、鶏卵の問題が少しあります。

典型的なログイン ベースのアプリケーション (Facebook など) では、ログイン用の最初のビュー コントローラーがあります。ログインすると、次にアプリケーションに入ると別のビューが最初に表示されます。

最初のビューを選択し、それを選択するためにいくつかのロジックを適用できる場所 (main.m?) またはアプリ デリゲートが 1 つ表示されません。私が見たのは、とにかく最初のビューがどのように使用されるかであり、そのビュー内で、ログインウィンドウを呼び出すかどうかにかかわらず、いくつかのロジックが実行されます。これを行うための唯一の練習ですか?ユーザーがログインする必要がある場合に備えて、メイン ビューがログイン ビューを生成する前に一瞬点滅したくありません。必要に応じてログイン ビューに直接移動したり、ユーザーが既にログインしている場合は最初に「ログイン済み」ビューに移動したりできませんか?

4

2 に答える 2

2

アプリ デリゲートには、メイン アプリケーション ウィンドウとなるウィンドウ var があります。

self.window.rootViewController = anyViewController;
[self.window makeKeyAndVisible];

あなたがする必要があるのは、 のインスタンスが何であるかを決定することですanyViewController。通常、スプラッシュ画像を提示することで「点滅」を回避します。スプラッシュ画像は、ルート ビュー コントローラーでキー ウィンドウが表示されるまで表示されます。今あなたができることは次のようなものです:

main.m

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
    }
}

MyAppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    UserInfo * appUserInfo = [[DataManager sharedManager] applicationUserInfo];
    UIViewController *anyViewController = [[ControllersManager sharedManager] launchViewControllerForUser:userInfo];

    self.window.rootViewController = anyViewController;
    [self.window makeKeyAndVisible];
    return YES;
}

すべてのナビゲーション操作に使用するシングルトン コントローラーのマネージャーはどこControllersManagerにありますか。メソッドlaunchViewControllerForUser:は次のようになります。

-(UIViewController*) launchViewControllerForUser:(UserInfo*) aUserInfo {
   if (aUserInfo) {
       return [[MainMenuViewController new] autorelease];
   } else {
       return [[LoginViewController new] autorelease];
   }
}

そして、オブジェクトDataManagerにラップされた以前に保存されたアプリケーション ユーザーの読み取りなど、すべてのデータ操作に使用するシングルトン クラスです。UserInfo


メインウィンドウ用のnibファイルを持っている場合があります.そのようなテクニックを使いたい場合は、行をカスタマイズする必要があります.

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

同じパターンで:

    self.window = [[WindowManager sharedManager] keyLaunchApplicationWindow];

また、このメソッド内でルート ナビゲーション コントローラーを割り当てることもできます。したがって、実際にこの 2 つのアプローチを組み合わせることができます。

主なアイデアは、オーケストレーション マネージャーがすべてを整理できるように準備することです。

于 2012-09-10T20:21:36.837 に答える
0

これはさまざまな方法で実行できますが、最も簡単な方法は、ユーザーがログインする必要があるかどうかの記録を保持し、必要な場合は、標準のルート ビュー コントローラーの上にログイン ビュー コントローラーをモーダル ビュー コントローラーとして提示することです。

- (void)appDidFinishLaunchingWithOptions:(NSDictionary *)options
{
    //window setup

    UIViewController *normalRootViewController = [[UIViewController alloc] init];
    self.window.rootViewController = normalRootViewController;

    [self.window makeKeyAndVisible];

    if (shouldDisplayLoginViewController)
    {
        UIViewController *loginViewController = [[UIViewController alloc] init];
        [self.window.rootViewController presentModalViewController:loginViewController animated:NO];
    }
}

ログインView Controllerを削除して通常のView Controllerを表示したい場合は、モーダルView Controllerと同じように閉じてください

于 2012-09-10T23:28:02.083 に答える