在解除父视图时隐藏登录 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
。如果不设置 rootView
为 loginViewController
示例代码:
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;
}
注销时,您只需调用 notification
或 delegate
将 window
的 rootViewController
设置为 loginViewController
。
使用Unwind Segues
在SourceViewController
中添加一个方法
对于Swift
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}
对于Objective-C
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue {
}
您可以通过两种方式返回 SourceViewController
。
- 使用
Storyboard
例如当 UIButton
动作触发时。
- 在代码中使用
performSegueWithIdentifier
。
故事板:
控制从 DestinationViewController
中的 UIButton
拖动到 SourceViewController
中的 Exit
segue
代码中:
- 控制从
DestinationViewController
中的 UIButton
拖动到 SourceViewController
中的 Exit
segue
- 需要返回时调用
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];
}
这是完整的过程。
这是在我的应用程序中调用特定操作的普通 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
。如果不设置 rootView
为 loginViewController
示例代码:
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;
}
注销时,您只需调用 notification
或 delegate
将 window
的 rootViewController
设置为 loginViewController
。
使用Unwind Segues
在SourceViewController
对于Swift
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}
对于Objective-C
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue {
}
您可以通过两种方式返回 SourceViewController
。
- 使用
Storyboard
例如当UIButton
动作触发时。 - 在代码中使用
performSegueWithIdentifier
。
故事板:
控制从 DestinationViewController
中的 UIButton
拖动到 SourceViewController
Exit
segue
代码中:
- 控制从
DestinationViewController
中的UIButton
拖动到SourceViewController
中的
Exit
segue
- 需要返回时调用
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];
}
这是完整的过程。