Ios 解雇后重新出现的模态视图
我正在根视图控制器中的view Dod load方法中以模态方式调用登录视图,但是当我丢失模态视图控制器时,它只是重新出现!有什么建议吗? 听取守则: **h**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
//
// 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];
}
}