2

ビューでモーダルにログインビューを呼び出していますが、ルートビューコントローラーでメソッドをロードしましたが、モーダルビューコントローラーを閉じると、それが再び表示されます! 助言がありますか?コードが聞こえます:

** .h **

//
//  FirstViewController.h
//  Voyager
//
//  Created by Peter Unger on 9/1/13.
//  Copyright (c) 2013 Penumbra Software. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <Parse/Parse.h>

@interface FirstViewController : UIViewController

@end

@interface DefaultSettingsViewController :
UIViewController <PFLogInViewControllerDelegate, PFSignUpViewControllerDelegate>

@end

** .m **

//
//  FirstViewController.m
//  Voyager
//
//  Created by Peter Unger on 9/1/13.
//  Copyright (c) 2013 Penumbra Software. All rights reserved.
//

#import "FirstViewController.h"
#import <Parse/Parse.h>

@interface FirstViewController ()

@end

@implementation FirstViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
       }

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    PFLogInViewController *login = [[PFLogInViewController alloc] init];
    login.fields = PFLogInFieldsUsernameAndPassword | PFLogInFieldsLogInButton | PFLogInFieldsSignUpButton;
    login.delegate = (id)self;
    login.signUpController.delegate = (id)self;
    [self presentViewController:login animated:YES completion:nil];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)logInViewController:(PFLogInViewController *)logInController didLogInUser:(PFUser *)user {
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)signUpViewController:(PFSignUpViewController *)signUpController didSignUpUser:(PFUser *)user {
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end
4

2 に答える 2

3

@Bergasms が既に言ったように、ループがあります。このviewDidAppearメソッドは、viewController が画面に表示されるたびに呼び出されます。したがって、提示されたviewControllerを辞任すると、最初のView Controllerが表示され、次に が呼び出され、viewDidAppear再び が提示されPFLogInViewController、ループが作成されます。

コードをviewDidLoadメソッドに移動すると、このメソッドは viewController が割り当てられたときにのみ呼び出されるため、モーダルは 1 回だけ呼び出されます。

また、ユーザーに最初の viewController を表示させたくない場合は、アニメーションを to に設定することができpresentViewController:animated:completion:ますNO


編集:

ある人は別の質問で、viewDidLoad 内で別のビュー コントローラーを呼び出すとエラーが発生する可能性があると述べました (これは一度行ったことがありますが、エラーの動作はまだ確認していません)。それがあなたの場合で、エラーが発生した場合は、コードを に入れる必要がありますviewDidAppear


それでも何らかの形で useが必要な場合は、が既に呼び出されているかどうかを制御するプロパティをviewDidAppear作成するだけです。こんな感じになりますBOOLPFLogInViewController

@property(nonatomic, assign) BOOL isLogged; 

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    if (!self.isLogged)
    {
        self.isLogged = YES;
        PFLogInViewController *login = [[PFLogInViewController alloc] init];
        login.fields = PFLogInFieldsUsernameAndPassword | PFLogInFieldsLogInButton | PFLogInFieldsSignUpButton;
        login.delegate = (id)self;
        login.signUpController.delegate = (id)self;
        [self presentViewController:login animated:YES completion:nil];
    }
}

このようにして、あなたのPFLogInViewController意志は一度呼び出されます。

于 2013-09-02T02:24:17.560 に答える
0

そこにループがあります。モーダル コントローラーが閉じられると、最初のビュー コントローラーで viewDidAppear メソッドが呼び出され、モーダル ビューが再び起動されます。このようなものをデバッグするのに役立つように、起動コードにコメントまたはブレーク ポイントを配置する必要があります。

@interface FirstViewController (){
BOOL has_shown_login_modal;
}
@end  


 - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    has_shown_login_modal = NO;
   }  


 - (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
   if(!has_shown_login_modal){
      PFLogInViewController *login = [[PFLogInViewController alloc] init];
     login.fields = PFLogInFieldsUsernameAndPassword | PFLogInFieldsLogInButton |        PFLogInFieldsSignUpButton;
     login.delegate = (id)self;
     login.signUpController.delegate = (id)self;
     [self presentViewController:login animated:YES completion:nil];
      has_shown_login_modal = YES;
   }
}
于 2013-09-02T01:23:12.333 に答える