Ios 解雇后重新出现的模态视图

Ios 解雇后重新出现的模态视图,ios,modal-dialog,Ios,Modal Dialog,我正在根视图控制器中的view Dod load方法中以模态方式调用登录视图,但是当我丢失模态视图控制器时,它只是重新出现!有什么建议吗? 听取守则: **h** // // FirstViewController.h // Voyager // // Created by Peter Unger on 9/1/13. // Copyright (c) 2013 Penumbra Software. All rights reserved. // #import <UIKit/U

我正在根视图控制器中的view Dod load方法中以模态方式调用登录视图,但是当我丢失模态视图控制器时,它只是重新出现!有什么建议吗? 听取守则:

**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
//
//FirstViewController.h
//旅行者号
//
//由Peter Unger于2013年9月1日创作。
//版权所有(c)2013半影软件。版权所有。
//
#进口
#进口
@界面FirstViewController:UIViewController
@结束
@接口默认设置可视控制器:
UIViewController
@结束
**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
//
//FirstViewController.m
//旅行者号
//
//由Peter Unger于2013年9月1日创作。
//版权所有(c)2013半影软件。版权所有。
//
#导入“FirstViewController.h”
#进口
@接口FirstViewController()
@结束
@FirstViewController的实现
-(无效)viewDidLoad
{
[超级视图下载];
//加载视图后,通常从nib执行任何其他设置。
}
-(无效)视图显示:(BOOL)动画
{
[超级视图显示:动画];
PFLogInViewController*login=[[PFLogInViewController alloc]init];
login.fields=pfloginfieldsUsernamedPassword | PFLogInFieldsLogInButton | pfloginfieldsignupbutton;
login.delegate=(id)self;
login.signUpController.delegate=(id)self;
[自我呈现视图控制器:登录动画:是完成:无];
}
-(无效)未收到记忆警告
{
[超级记忆警告];
//处置所有可以重新创建的资源。
}
-(无效)logInViewController:(PFLogInViewController*)logInController didLogInUser:(PFUser*)用户{
[自我解除视图控制器激活:是完成:无];
}
-(void)signUpViewController:(PFSignUpViewController*)signUpController didSignUpUser:(PFUser*)用户{
[自我解除视图控制器激活:是完成:无];
}
@结束

您在那里有一个循环。当模态控制器被解除时,将在第一个视图控制器上调用ViewDidAspect方法,这将再次启动模态视图。您应该在启动代码中添加注释或断点,以帮助调试类似的事情

@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;
   }
}

正如@Bergasms已经说过的,你有一个循环。每当您的viewController出现在屏幕中时,都会调用
viewdideappease
方法。因此,当您退出显示的viewController时,第一个视图控制器应该出现,然后调用
ViewDidDisplay
,它将再次显示
PFLogInViewController
,创建一个循环

如果将代码移动到
viewdiload
方法,您的模式将只调用一次,因为只有在分配了viewController时才会调用此方法

如果希望用户看不到第一个viewController,则可能需要将
presentViewController:animated:completion:
中的动画设置为
NO


编辑:

一个人在另一个问题中说,如果在viewDidLoad中调用另一个视图控制器,可能会出现错误(虽然我已经这样做过一次,但还没有检查错误的行为)。如果这是您的情况,并且出现错误,则必须让
视图中的代码显示出来


如果您仍然希望使用
viewdide
,只需创建一个
BOOL
属性,控制是否已调用
PFLogInViewController
。会是这样的

@property(nonatomic, assign) BOOL isLogged; 


这样,您的
PFLogInViewController
将被调用一次。

那么您建议我在哪里调用模态视图控制器?您可以在那里调用它,但我假设您只想在视图第一次出现时调用它。有很多方法可以解决这个问题。最简单的方法是使用布尔标志。我会为你更新我的答案。注意,虽然这是最简单的,但如果代码变得更复杂,您可能需要重新构建代码。有太多的布尔标志会显著增加应用程序的状态空间。谢谢你,这很有意义,我只有一个问题,那就是:
bool has\u show\u login\u model我得到了错误:无法在@interface或@protocol内声明变量关于如何修复此问题的任何建议?不确定是否已修复,但要在顶部声明实例变量,需要将它们放入{},我将更新答案。Peter Unger,如果你回过头来看,这个答案很好地解决了这个问题。
- (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];
    }
}