3

私のアプリケーションには次のコードがあります。アプリケーションの起動時に最初のビットが実行され、モーダル ビューでログイン画面が表示されます。その前に rootController をウィンドウに追加しました。

モーダル ビューでは、ユーザーはログオンして利用規約を表示できます。ユーザーが同意すると、loadMainApp 関数が呼び出されます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    rootController.delegate = self;
    [window addSubview:rootController.view];

    LoginViewController *_loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:[NSBundle mainBundle]];
    self.loginViewController = _loginViewController;
    [_loginViewController release];


    UINavigationController *navi = [[[UINavigationController alloc]initWithRootViewController:loginViewController]autorelease];

    navi.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [loginViewController release];
    [rootController presentModalViewController:navi animated:YES];

    [self.window makeKeyAndVisible];
    return YES;
}

この次のビットは、ユーザーが利用規約に同意したときに呼び出されます。

-(void)loadMainApp:(UIView *)fromView{

    [fromView removeFromSuperview];
    [window addSubview:rootController.view];
    rootController.selectedIndex = 2;
    rootController.delegate = self;

}

ここから、モーダル ビューであるピープル ピッカーを使用できるようにしたいので、次のコードで試します。

 ABPeoplePickerNavigationController *picker =
        [[ABPeoplePickerNavigationController alloc]init];
        picker.peoplePickerDelegate = self;

        [rootController presentModalViewController:picker animated:YES];
        [picker release];

rootController からモーダル ビューを表示しようとすると、何も表示されません。

これは、applicationDidFinishLaunching の次のコードが実行された後に発生するようです。

LoginViewController *_loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:[NSBundle mainBundle]];
        self.loginViewController = _loginViewController;
        [_loginViewController release];


        UINavigationController *navi = [[[UINavigationController alloc]initWithRootViewController:loginViewController]autorelease];

        navi.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [loginViewController release];
        [rootController presentModalViewController:navi animated:YES];

        [self.window makeKeyAndVisible];
        return YES;

ログイン画面をまったく表示せず、代わりに rootController を追加するだけの場合

rootController.delegate = self;
        [window addSubview:rootController.view];

applicationDidFinishLaunching 関数では、ピープル ピッカーを表示すると、すべて正常に動作します。

ここで私が壊している基本的なものはありますか、それとも私が間違っている可能性があることを誰かが見つけることができますか?

4

2 に答える 2

2

メソッドを使用して、最初のモーダル ビュー コントローラーを正しく閉じていますdismissModalViewControllerAnimated:か? モーダル ビュー コントローラーのビューをそのスーパービューから削除するだけの場合、UIKit によって多くの事務処理が取り消されたままになっている可能性があります。

于 2011-05-12T18:01:19.733 に答える
1

あなたが本当にすべきことはこのようなものです:

  1. rootViewControllerをnavigationControllerに追加します。次に、navigationControllerをウィンドウに追加します。

  2. rootViewControllerのviewDidLoadメソッドで、loginViewControllerのデリゲートをrootViewControllerに設定し、LoginViewControllerのインスタンスをモーダルとして表示します。

  3. 利用規約への同意が完了したら、[delegateloginViewControllerFinished];を実行します。

  4. rootViewControllerで、loginViewControllerFinishedメソッドを処理します。これには、[self dismissModalViewControllerAnimated:YES]への呼び出しが含まれている必要があります。ログインモーダルビューを閉じます。次に、モーダルビューとしてABPeoplePickerNavigationControllerを起動する必要があります。


AppDelegateの場合:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Make sure rootViewController is initiated by this point.

    UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:rootViewController] autorelease];

    [window addSubview:rootController.view];
    [self.window makeKeyAndVisible];
    return YES;
}

RootViewControllerの場合:

- (void)viewDidLoad {
  [super viewDidLoad];

  LoginViewController *loginViewController = [[[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil] autorelease];
  loginViewController.delegate = self;

  loginViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
  [self presentModalViewController:loginViewController animated:YES];
}

- (void)loginViewControllerFinished {
  [self dismissModalViewControllerAnimated:YES];

  // Here we are closing one modal. And showing another after that.
  ABPeoplePickerNavigationController *peoplePicker = [[[ABPeoplePickerNavigationController alloc] init] autorelease];
  peoplePicker.peoplePickerDelegate = self;
  [self presentModalViewController:peoplePicker animated:YES];
}

LoginViewControllerの場合:

// Make sure LoginViewController has delegate property in header.
// @property (nonatomic, assign) id delegate;
// And put this in implementation (.m) file. @synthesize delegate.
// Don't put release for delegate, since it's not retained. It's only 'assigned'.

- (void)done {
  // Call this when you want to close loginViewController.
  [delegate loginViewControllerFinished];
}

お役に立てれば。

于 2011-05-12T18:24:14.670 に答える