在解除父视图时隐藏登录 uiViewController

Hide LoginViewController or dismiss to parentView

这是在我的应用程序中调用特定操作的普通 LoginView

sourceViewVontroller

if ([password length] == 0) {

     loginViewController *seatView = [mainStory instantiateViewControllerWithIdentifier:@"loggingView"];



    [self presentViewController:login animated:YES completion:nil];

}

它会检查用户在调用此操作时是否尚未登录,因此会将他重定向到 loginViewController,然后

登录视图控制器

UIStoryboard *mainStory = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

DestinationViewController *Dest = [mainStory instantiateViewControllerWithIdentifier:@"destView"];


[self presentViewController:Dest animated:YES completion:nil];

它转到需要登录的 destinationView,现在我的问题是如何返回(关闭不是 presentmodalView)到 sourceViewController,或者简单地说,如何在成功时从队列中删除 loginViewController 并直接关闭到来源?

destinationViewController

// Tried to use presentView .. but i dont need to reload sourceView, just dismiss to it !

//[self presentViewController:srcView animated:YES completion:NULL];

//This is what am doing ..

[self dismissViewControllerAnimated:NO completion:nil];

或者让我知道是否有其他专业方法可以完成此登录流程

我为您推荐另一种方式:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

第一名

您将检查用户是否登录。如果登录,您将 rootView 设置为 destinationViewController。如果不设置 rootViewloginViewController

示例代码:

UIStoryboard *mainStory = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
if (logged) {

   DestinationViewController *Dest = [mainStory instantiateViewControllerWithIdentifier:@"destView"];
self.window.rootViewController = Dest;
} else {
   LoginViewController *seatView = [mainStory instantiateViewControllerWithIdentifier:@"loggingView"];
   self.window.rootViewController = seatView;
}

注销时,您只需调用 notificationdelegatewindowrootViewController 设置为 loginViewController

使用Unwind Segues

SourceViewController

中添加一个方法

对于Swift

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {

}

对于Objective-C

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue {

}

您可以通过两种方式返回 SourceViewController

  1. 使用 Storyboard 例如当 UIButton 动作触发时。
  2. 在代码中使用 performSegueWithIdentifier

故事板:

控制从 DestinationViewController 中的 UIButton 拖动到 SourceViewController

中的 Exit segue

代码中:

  1. 控制从 DestinationViewController 中的 UIButton 拖动到 SourceViewController
  2. 中的 Exit segue

  1. 需要返回时调用performSegueWithIdentifier:@"ExitToSourceViewController"SourceViewController

不要使用presentViewController来引入登录控制器。 完整过程: 在单例中 class。设置全局 属性.

@property (assign)BOOL isUserLoggedIn;

当用户登录或注销时,将此变量设置为 true 或 false。

在 LoginViewController 中设置枚举。

typedef enum {

    DestViewControllerOne =1,

    DestViewControllerTwo

} SignInType;

在这个枚举中,将所有视图控制器放在要进行登录检查的位置。 在登录视图控制器中设置 属性 以保存源控制器值 -

@property (nonatomic, assign) NSInteger signInType;

在登录控制器中设置委托以在成功登录后重定向 -

@protocol SignInProtocolDelegate <NSObject>
@optional

-(void) signInSuccess:(NSInteger) signInType;

@end

在登录控制器中使用该委托创建一个 属性 -

@property (nonatomic, assign) NSObject<SignInProtocolDelegate>* delegate;

现在,在进入所需的视图控制器之前,执行以下检查 -

if(![[TESingleton shareData] isUserLoggedIn]){

                [self funcNavigateToSignInWithAlert:YES withSignInType:proceedToDestViewControllerOne];

            }
            else
            {
                [self proceedToDestViewControllerOne];
            }

-(void)funcNavigateToSignInWithAlert:(BOOL)showAlert withSignInType:(NSInteger) signIntype
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:STORYBOARDNAME bundle:nil];
    LoginViewController *viewController = (LoginViewController *)[storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
    [viewController setSignInType:signIntype];
    [viewController setDelegate:self];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
    navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [[SlideNavigationController sharedInstance] presentViewController:navController animated:YES completion:nil];
}

这样,它会带来登录页面。

下一个 - 成功登录后,在登录控制器中执行此操作:

[self dismissViewControllerAnimated:YES completion:nil];

[[self delegate] signInSuccess:self.signInType];

在我们上面编写的源控制器中导入登录委托方法 -

-(void) signInSuccess:(NSInteger) signInType
{
    switch (signInType)
    {
        case DestViewControllerOne:
            [self performSelector:@selector(proceedToDestViewControllerOne) withObject:nil afterDelay:0.5];
            break;

        case DestViewControllerTwo:
            [self performSelector:@selector(proceedToDestViewControllerTwo) withObject:nil afterDelay:0.5];
            break;


        default:
            break;
    }
}

在源代码视图控制器中实现这些方法 -

-(void) proceedToDestViewControllerOne
{
    //Restricting navigation to signin
    //Addded by vikas Jul 8,2015
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:STORYBOARDNAME bundle:nil];

    DestViewcontrollerOne *objDestViewcontrollerOne = (DestViewcontrollerOne *)[storyboard instantiateViewControllerWithIdentifier:@"DestViewcontrollerOne"];

    [self.navigationController objDestViewcontrollerOne animated:YES];

}

这是完整的过程。