从每个 Viewcontroller 打开 viewController 个文件

Open viewController file from every Viewcontroller

我正在开发与 Flipkart 非常相似的电子商务应用程序。

现在我无需登录即可访问我的应用程序。我的意思是最初我可以跳过登录。但是当我要购买任何物品时,应该会提示用户登录。

现在客户的要求是应用程序的每个页面都应该有登录按钮,所以用户应该从每个页面导航到登录页面,成功登录后他应该 return 从 he/she 进入登录页面。

知道如何实现这种功能吗?

我会创建 MYBaseViewController 并在所有其他控制器中继承它。我将创建一个将登录按钮添加到导航栏右侧项目的函数和一个处理登录的函数。这样,您就可以将所有内容保存在一个地方。

您可以在 UIViewController 类别中执行相同的操作,并在适当的控制器中调用方法,但我个人认为,如果这是针对每个 UIViewController 的解决方案,它就不那么漂亮了。

如果有人有更好的主意,我很乐意听听。

Step 1 : Create Base class

BaseViewController.h

#import <UIKit/UIKit.h>

@interface BaseViewController : UIViewController
-(void)takeMeToLogin;
@end

BaseViewController.m

#import "BaseViewController.h"

@interface BaseViewController () {
    UIView *myTabBar;

    UIButton *loginButton;
}

@end

@implementation BaseViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
    loginButton.tag = 5566778897;
    [loginButton addTarget:self action:@selector(takeMeToLogin) forControlEvents:UIControlEventTouchUpInside];
    [loginButton setBackgroundImage:[UIImage imageNamed:@"login.png"] forState:UIControlStateNormal];
    loginButton.frame = CGRectMake(x,y, width, height);
    [self.view addSubview:backButton];
}

-(void) takeMeToLogin {
    // code here to go to Login screen
}

Step 2: Use BaseViewController as your base class.

现在,无论何时创建任何 class,您都会拥有如下内容。

@interface YourViewController : BaseViewController

默认情况下,您将有 @interface YourViewController : UIViewController

如果您还需要什么,请告诉我


编辑 1

关于您的评论, Fahim 的解决方案也有效,但它有一个限制,我必须创建登录导航栏上的按钮。我无法将登录按钮放在屏幕的任何位置。我会说,你可以将它添加到任何你想要的地方方法如下。

YourViewController.m下面有。

UIButton *buttonThatYouWantToMove = (UIButton *)[self.view viewWithTag:5566778897];
[self.view addSubview:buttonThatYouWantToMove]; // if this don't work use insertSubview:aboveSubview:
buttonThatYouWantToMove.frame = CGRectMake(x,y,width,height); // this is very important

完成!!!

如果您需要进一步解释,请告诉我。

Fahim 的解决方案也有效,但它有一个限制,我必须在导航栏上创建登录按钮。我无法将登录按钮放在屏幕的任何位置。

我的方法不同。

  1. 我已经创建了登录名ViewController。
  2. 在登录ViewController 文件中创建协议。
  3. 在每个 viewcontroller 中放置按钮以打开登录viewcontroller 文件
  4. 模态打开登录视图控制器

最重要的是在我的 Stroryboard 文件中,我将登录 viewcontroller 文件嵌入到 NavigationController 中,并且我的 NavigationController 以模态方式附加到每个 ViewController.

在LoginViewController.h

@class LoginViewController;
@protocol LoginViewControllerDelegate <NSObject>

- (void)LoginViewControllerViewDidCancel:(LoginViewController *)controller;
- (void)LoginViewControllerViewDidDone:(LoginViewController *)controller;

@end

@interface LoginViewController : UIViewController
@property (nonatomic, weak)id <LoginViewControllerDelegate> delegate;

@end

在LoginViewController.m

- (IBAction)didCancel:(UIBarButtonItem *)sender {
    [self.delegate LoginViewControllerViewDidCancel:self];
}
- (IBAction)didDone:(id)sender {
    [self.delegate LoginViewControllerViewDidDone:self];
}

现在 FirstViewController、SecondViewController 等的相同代码

FirstViewController.m

#import "LoginViewController.h"
@interface FirstViewController ()<LoginViewControllerDelegate>

#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"LoginView"]) {
        UINavigationController *navigationController = segue.destinationViewController;
        LoginViewController *loginViewController = [navigationController viewControllers][0];
        loginViewController.delegate = self;
    }
    if ([segue.identifier isEqualToString:@"Thirdpage"]) {

    }
}

#pragma loginViewController delegate
-(void) LoginViewControllerViewDidCancel:(LoginViewController *)controller{

    //Your Logic
    [self dismissViewControllerAnimated:YES completion:nil];
}

-(void) LoginViewControllerViewDidDone:(LoginViewController *)controller{
    //Your Logic
    [self dismissViewControllerAnimated:YES completion:nil];
}

它对我很有用..