স্টোরিবোর্ড লগইন স্ক্রিনের জন্য সেরা অনুশীলনগুলি, লগআউট করার পরে ডেটা সাফ করার জন্য পরিচালনা করে


290

আমি স্টোরিবোর্ড ব্যবহার করে একটি আইওএস অ্যাপ তৈরি করছি। রুট ভিউ কন্ট্রোলার একটি ট্যাব বার নিয়ামক। আমি লগইন / লগআউট প্রক্রিয়া তৈরি করছি, এবং এটি বেশিরভাগ ক্ষেত্রে ভাল কাজ করছে তবে আমি কয়েকটি সমস্যা পেয়েছি। এই সমস্ত সেট আপ করার জন্য আমার সেরা উপায়টি জানতে হবে।

আমি নিম্নলিখিতগুলি সম্পাদন করতে চাই:

  1. অ্যাপটি প্রথমবার চালু হওয়ার পরে লগইন স্ক্রিন দেখান Show যখন তারা লগইন করে, ট্যাব বার নিয়ন্ত্রকের প্রথম ট্যাবে যান।
  2. এর পরে যে কোনও সময় তারা অ্যাপ্লিকেশনটি চালু করার পরে, তারা লগ ইন করেছে কিনা তা পরীক্ষা করে দেখুন এবং সরাসরি ট্যাব বার কন্ট্রোলারের প্রথম ট্যাবে সরাসরি যান।
  3. যখন তারা ম্যানুয়ালি একটি লগআউট বোতামে ক্লিক করে, লগইন স্ক্রিনটি দেখায় এবং ভিউ কন্ট্রোলারগুলি থেকে সমস্ত ডেটা সাফ করে।

আমি এখন পর্যন্ত যা করেছি তা হ'ল ট্যাব বার নিয়ামককে রুট ভিউ নিয়ন্ত্রক সেট করে এবং আমার লগইন ভিউ নিয়ামককে একটি কাস্টম সিগু তৈরি করেছে। আমার ট্যাব বার নিয়ন্ত্রক শ্রেণীর ভিতরে, আমি তাদের ভিতরে লগ ইন করেছি কিনা তা যাচাই করিviewDidAppear পদ্ধতির এবং একটি সিগ সম্পাদন করে:[self performSegueWithIdentifier:@"pushLogin" sender:self];

লগআউট ক্রিয়াটি কখন সম্পাদন করা প্রয়োজন তার জন্য আমি একটি বিজ্ঞপ্তিও সেটআপ করি: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(logoutAccount) name:@"logoutAccount" object:nil];

লগআউট করার পরে, আমি চালাচ্ছি কীচেইন থেকে শংসাপত্রগুলি সাফ করি [self setSelectedIndex:0] আবার লগইন ভিউ নিয়ন্ত্রণকারীটি দেখানোর জন্য সিগ এবং সম্পাদন করি।

এটি সব ঠিকঠাক কাজ করে তবে আমি ভাবছি: এই যুক্তিটি অ্যাপডেলিগেটে থাকা উচিত? আমার দুটি বিষয়ও রয়েছে:

  • তারা প্রথমবার অ্যাপটি চালু করার সময় , ট্যাব বার নিয়ন্ত্রকটি সেগ সম্পাদনের আগে সংক্ষিপ্তসার দেখায়। আমি কোডটি সরানোর চেষ্টা করেছিviewWillAppear কিন্তু সেগুটি তাড়াতাড়ি কাজ করবে না।
  • যখন তারা লগআউট করে, সমস্ত ডেটা এখনও সমস্ত ভিউ কন্ট্রোলারের ভিতরে থাকে। যদি তারা কোনও নতুন অ্যাকাউন্টে লগইন করে তবে তা রিফ্রেশ না হওয়া পর্যন্ত পুরানো অ্যাকাউন্ট ডেটা প্রদর্শিত হবে। লগআউটে এটিকে সহজে সাফ করার জন্য আমার একটি উপায় দরকার।

আমি এটি পুনরায় কাজ করার জন্য উন্মুক্ত। আমি লগইন স্ক্রিনটিকে রুট ভিউ কন্ট্রোলার হিসাবে বিবেচনা করেছি, বা সবকিছু হ্যান্ডল করার জন্য অ্যাপডেলিগেটে একটি নেভিগেশন কন্ট্রোলার তৈরি করা বিবেচনা করেছি ... আমি ঠিক নিশ্চিত নই যে এই মুহুর্তে সর্বোত্তম পদ্ধতিটি কী।


আপনি কি মডেল হিসাবে লগইন দর্শন নিয়ন্ত্রক উপস্থাপন করেন?
ভোকিলাম

@TrevorGehman - আপনার স্টোরিবোর্ড মাংসখণ্ডের যোগ করতে পারেন
রোহান ট শাহ

আমি কী করে শেষ করেছি তার বিশদ সহ একটি উত্তর জমা দিয়েছি। এটি প্রদত্ত অন্যান্য উত্তরগুলির মতো, বিশেষত @ ভাব্যা কোঠারি।
ট্রেভর গেহম্যান

লগইন স্ক্রিন উপস্থাপনের জন্য, অ্যাথন্যাভিগেশন কার্যকর হতে পারে। এটি প্রয়োজন হলে লগইন স্ক্রিনের উপস্থাপনাটি সংগঠিত করে এবং স্বতঃ-লগইন সমর্থন করে।
কোডি

খুব প্রাথমিক সমস্যাগুলির মধ্যে একটি যা প্রায় সর্বদা সমাধান করা হয় তবে একই সাথে মনে হয় আরও ভাল করা যেতে পারে
amar

উত্তর:


310

আপনার স্টোরিবোর্ডটি দেখতে এমন হওয়া উচিত

আপনার ডিডফিনিশল্যাঞ্চিং উইথঅপশনগুলির অভ্যন্তরে আপনার অ্যাপডেলিগেট.এম এ

//authenticatedUser: check from NSUserDefaults User credential if its present then set your navigation flow accordingly

if (authenticatedUser) 
{
    self.window.rootViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateInitialViewController];        
}
else
{
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"LoginViewController"];
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];

    self.window.rootViewController = navigation;
}

SignUpViewController.m ফাইলটিতে In

- (IBAction)actionSignup:(id)sender
{
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];

    appDelegateTemp.window.rootViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateInitialViewController];
}

ফাইলটিতে MyTabThreeViewController.m

- (IBAction)actionLogout:(id)sender {

    // Delete User credential from NSUserDefaults and other data related to user

    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];

    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"LoginViewController"];

    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;

}

সুইফট 4 সংস্করণ

আপনার প্রাথমিক ভিউ কন্ট্রোলারকে তাববারকন্ট্রোলারে সাইন ইন করে ধরে নিয়ে অ্যাপের প্রতিনিধিদের মধ্যে ফিনিশল্যাঞ্চিং উইথঅ্যাপশনগুলি।

if Auth.auth().currentUser == nil {
        let rootController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "WelcomeNavigation")
        self.window?.rootViewController = rootController
    }

    return true

সাইন ইন ভিউ কন্ট্রোলার:

@IBAction func actionSignup(_ sender: Any) {
let appDelegateTemp = UIApplication.shared.delegate as? AppDelegate
appDelegateTemp?.window?.rootViewController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateInitialViewController()
}

MyTabThreeViewController

 //Remove user credentials
guard let appDel = UIApplication.shared.delegate as? AppDelegate else { return }
        let rootController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "WelcomeNavigation")
        appDel.window?.rootViewController = rootController

আপনি লগআউট করার পরে ব্যবহারকারীর কাছ থেকে বুল প্রমাণীকরণ মুছে ফেলতে ভুলে গেছেন
CodeLover

28
AppDelegateভিতরে ব্যবহার UIViewControllerএবং সেট window.rootViewControllerকরার জন্য -1 । আমি এটিকে "সেরা অনুশীলন" হিসাবে বিবেচনা করি না।
derpoliuk

2
দিতে চাই নি -1: একটি উত্তর পোস্ট ছাড়া stackoverflow.com/a/30664935/1226304
derpoliuk

1
আমি এটি আইওএস 8-এ দ্রুতগতিতে করার চেষ্টা করছি কিন্তু যখন অ্যাপটি চালু হয় এবং লগইন স্ক্রিনটি দেখায় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি: "ভারসাম্যহীন কলগুলি উপস্থিতি রূপান্তর শুরু / শেষ করতে"। আমি লক্ষ্য করেছি যে অ্যাপ্লিকেশনটি যখন লগইন স্ক্রিনটি লোড করে তবে ট্যাব বার নিয়ন্ত্রকের প্রথম ট্যাবটিও লোড হচ্ছে। ভিউডিডলোডে প্রিন্টলন () এর মাধ্যমে এটি নিশ্চিত করেছেন। পরামর্শ?
অ্যালেক্স লাকায়ো

1
লোটোখেলা! -2। -1 AppDelegateভিতরে UIViewControllerলগইন কী সংরক্ষণের জন্য -1 এর জন্য NSUserDefaults। এ জাতীয় তথ্যের জন্য এটি অত্যন্ত-অনিরাপদ!
স্কাইওয়ান্দার

97

এখানে সবকিছু শেষ করার জন্য আমি শেষ করেছি। এটির পাশাপাশি আপনাকে কেবলমাত্র বিবেচনা করতে হবে (ক) লগইন প্রক্রিয়া এবং (খ) আপনি যেখানে আপনার অ্যাপ্লিকেশন ডেটা সংরক্ষণ করছেন (এই ক্ষেত্রে আমি একটি সিঙ্গলটন ব্যবহার করেছি)।

স্টোরিবোর্ডটি লগইন ভিউ নিয়ন্ত্রণকারী এবং প্রধান ট্যাব নিয়ামক দেখাচ্ছে

আপনি দেখতে পাচ্ছেন, রুট ভিউ কন্ট্রোলারটি আমার মূল ট্যাব নিয়ামক । আমি এটি করেছি কারণ ব্যবহারকারী লগ ইন করার পরে, আমি অ্যাপটি সরাসরি প্রথম ট্যাবে লঞ্চ করতে চাই। (এটি কোনও "ঝাঁকুনি" এড়ায় যেখানে লগইন ভিউ অস্থায়ীভাবে প্রদর্শিত হয়))

AppDelegate.m

এই ফাইলে, আমি ব্যবহারকারীটি ইতিমধ্যে লগ ইন হয়েছে কিনা তা যাচাই করে নিই If আমি লগআউট প্রক্রিয়াটিও পরিচালনা করি, যেখানে আমি ডেটা সাফ করি এবং লগইন ভিউটি দেখাই।

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

    // Show login view if not logged in already
    if(![AppData isLoggedIn]) {
        [self showLoginScreen:NO];
    }

    return YES;
}

-(void) showLoginScreen:(BOOL)animated
{

    // Get login screen from storyboard and present it
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    LoginViewController *viewController = (LoginViewController *)[storyboard instantiateViewControllerWithIdentifier:@"loginScreen"];
    [self.window makeKeyAndVisible];
    [self.window.rootViewController presentViewController:viewController
                                             animated:animated
                                           completion:nil];
}

-(void) logout
{
    // Remove data from singleton (where all my app data is stored)
    [AppData clearData];

   // Reset view controller (this will quickly clear all the views)
   UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
   MainTabControllerViewController *viewController = (MainTabControllerViewController *)[storyboard instantiateViewControllerWithIdentifier:@"mainView"];
   [self.window setRootViewController:viewController];

   // Show login screen
   [self showLoginScreen:NO];

}

LoginViewController.m

এখানে, লগইন সফল হলে, আমি কেবল ভিউটি বাতিল করে একটি বিজ্ঞপ্তি প্রেরণ করি।

-(void) loginWasSuccessful
{

     // Send notification
     [[NSNotificationCenter defaultCenter] postNotificationName:@"loginSuccessful" object:self];

     // Dismiss login screen
     [self dismissViewControllerAnimated:YES completion:nil];

}

2
আপনি কি জন্য বিজ্ঞপ্তি ব্যবহার করবেন?
বিদ্রোহ

1
@ বিফার ঠিক বলেছেন। আমি একটি নতুন ডেটা টান ট্রিগার করতে বিজ্ঞপ্তিটি ব্যবহার করেছি। আপনি যা খুশি তা করতে এটি ব্যবহার করতে পারেন, তবে আমার ক্ষেত্রে, আমাকে লগইন সফল হয়েছে যে সম্পর্কে অবহিত করা দরকার, এবং নতুন তথ্য প্রয়োজন।
ট্রেভর গেহম্যান

24
আইওএস 8.1 এ (এবং সম্ভবত 8.0, পরীক্ষাও করেনি) এটি আর কার্যকরভাবে কাজ করে না। প্রাথমিক ভিউ কন্ট্রোলার একটি সংক্ষিপ্ত মুহুর্তের জন্য ঝলকান।
বিফার

7
এই পদ্ধতির একটি সুইফ্ট সংস্করণ আছে?
সানো

9
@Julian ইন iOS 8 এ, আমি দুই লাইন প্রতিস্থাপন [self.window makeKeyAndVisible]; [self.window.rootViewController presentViewController:viewController animated:animated completion:nil];সঙ্গে self.window.rootViewController = viewController;দপদপ করে ওঠার প্রতিরোধ। এনিমেট করতে যে এটি কেবল [UIView transitionWithView...];
একটিতে মুড়ে দিন

20

সম্পাদনা: লগআউট ক্রিয়া যুক্ত করুন।

এখানে চিত্র বর্ণনা লিখুন

1. প্রথমে অ্যাপের প্রতিনিধি ফাইল প্রস্তুত করুন

AppDelegate.h

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic) BOOL authenticated;

@end

AppDelegate.m

#import "AppDelegate.h"
#import "User.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    User *userObj = [[User alloc] init];
    self.authenticated = [userObj userAuthenticated];

    return YES;
}

২. ব্যবহারকারী নামের একটি শ্রেণি তৈরি করুন।

User.h

#import <Foundation/Foundation.h>

@interface User : NSObject

- (void)loginWithUsername:(NSString *)username andPassword:(NSString *)password;
- (void)logout;
- (BOOL)userAuthenticated;

@end

User.m

#import "User.h"

@implementation User

- (void)loginWithUsername:(NSString *)username andPassword:(NSString *)password{

    // Validate user here with your implementation
    // and notify the root controller
    [[NSNotificationCenter defaultCenter] postNotificationName:@"loginActionFinished" object:self userInfo:nil];
}

- (void)logout{
    // Here you can delete the account
}

- (BOOL)userAuthenticated {

    // This variable is only for testing
    // Here you have to implement a mechanism to manipulate this
    BOOL auth = NO;

    if (auth) {
        return YES;
    }

    return NO;
}

৩. নতুন কন্ট্রোলার রুটভিউ কনট্রোলার তৈরি করুন এবং প্রথম দৃশ্যের সাথে সংযুক্ত থাকুন যেখানে লগইন বোতামটি লাইভ থাকে। একটি স্টোরিবোর্ড আইডি যুক্ত করুন: "প্রাথমিক ভিউ" V

RootViewController.h

#import <UIKit/UIKit.h>
#import "LoginViewController.h"

@protocol LoginViewProtocol <NSObject>

- (void)dismissAndLoginView;

@end

@interface RootViewController : UIViewController

@property (nonatomic, weak) id <LoginViewProtocol> delegate;
@property (nonatomic, retain) LoginViewController *loginView;


@end

RootViewController.m

#import "RootViewController.h"

@interface RootViewController ()

@end

@implementation RootViewController

@synthesize loginView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)loginBtnPressed:(id)sender {

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(loginActionFinished:)
                                                 name:@"loginActionFinished"
                                               object:loginView];

}

#pragma mark - Dismissing Delegate Methods

-(void) loginActionFinished:(NSNotification*)notification {

    AppDelegate *authObj = (AppDelegate*)[[UIApplication sharedApplication] delegate];
    authObj.authenticated = YES;

    [self dismissLoginAndShowProfile];
}

- (void)dismissLoginAndShowProfile {
    [self dismissViewControllerAnimated:NO completion:^{
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        UITabBarController *tabView = [storyboard instantiateViewControllerWithIdentifier:@"profileView"];
        [self presentViewController:tabView animated:YES completion:nil];
    }];


}

@end

4। একটি নতুন নিয়ামক লগইনভিউ কনট্রোলার তৈরি করুন এবং লগইন দৃশ্যের সাথে সংযুক্ত।

LoginViewController.h

#import <UIKit/UIKit.h>
#import "User.h"

@interface LoginViewController : UIViewController

LoginViewController.m

#import "LoginViewController.h"
#import "AppDelegate.h"

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (IBAction)submitBtnPressed:(id)sender {
    User *userObj = [[User alloc] init];

    // Here you can get the data from login form
    // and proceed to authenticate process
    NSString *username = @"username retrieved through login form";
    NSString *password = @"password retrieved through login form";
    [userObj loginWithUsername:username andPassword:password];
}

@end

৫. শেষে একটি নতুন কন্ট্রোলার প্রোফাইল ভিউকন্ট্রোলার যুক্ত করুন এবং ট্যাবভিউ কনট্রোলারের মধ্যে প্রোফাইল ভিউয়ের সাথে সংযুক্ত।

ProfileViewController.h

#import <UIKit/UIKit.h>

@interface ProfileViewController : UIViewController

@end

ProfileViewController.m

#import "ProfileViewController.h"
#import "RootViewController.h"
#import "AppDelegate.h"
#import "User.h"

@interface ProfileViewController ()

@end

@implementation ProfileViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

}

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    if(![(AppDelegate*)[[UIApplication sharedApplication] delegate] authenticated]) {

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

        RootViewController *initView =  (RootViewController*)[storyboard instantiateViewControllerWithIdentifier:@"initialView"];
        [initView setModalPresentationStyle:UIModalPresentationFullScreen];
        [self presentViewController:initView animated:NO completion:nil];
    } else{
        // proceed with the profile view
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)logoutAction:(id)sender {

   User *userObj = [[User alloc] init];
   [userObj logout];

   AppDelegate *authObj = (AppDelegate*)[[UIApplication sharedApplication] delegate];
   authObj.authenticated = NO;

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

   RootViewController *initView =  (RootViewController*)[storyboard instantiateViewControllerWithIdentifier:@"initialView"];
   [initView setModalPresentationStyle:UIModalPresentationFullScreen];
   [self presentViewController:initView animated:NO completion:nil];

}

@end

লগইনএক্সেমাল অতিরিক্ত সাহায্যের জন্য একটি নমুনা প্রকল্প।


3
নমুনা প্রকল্প আমাকে লগইন এন লগআউট ধারণাটি বুঝতে সহায়তা করেছে .. অনেক ধন্যবাদ :)
ডেভ

16

AppDelegateভিতরে ভিউ কন্ট্রোলার ব্যবহার করে এবং সেটিং করার কারণে আমি ভবয়ের উত্তর পছন্দ করিনিrootViewController কোনও অ্যানিমেশন নেই। এবং ট্র্যাভরের উত্তর আইওএস 8-এ ফ্ল্যাশিং ভিউ কন্ট্রোলারের সমস্যা রয়েছে।

ইউপিডি 07/18/2015

কন্ট্রোলারগুলির ভিতরে অ্যাপডেলিগেট:

ভিউ কন্ট্রোলারের অভ্যন্তরে অ্যাপডেলিগেটের স্থিতি (বৈশিষ্ট্য) পরিবর্তন করা এনক্যাপসুলেশন বিরতি দেয়।

প্রতিটি আইওএস প্রকল্পে খুব সাধারণ পদার্থের স্তরক্রম:

অ্যাপ্লিকেশন (মালিকানাধীন windowএবং rootViewController)

ViewController (নিজস্ব view)

এটি ঠিক আছে যে উপরের বিষয়গুলি নীচের অংশে পরিবর্তিত হয়, কারণ তারা সেগুলি তৈরি করছে। তবে নীচের অংশের অবজেক্টগুলি যদি তাদের শীর্ষে অবজেক্টগুলি পরিবর্তন করে তবে এটি ঠিক নয় (আমি কিছু বেসিক প্রোগ্রামিং / ওওপি নীতি বর্ণনা করেছি: ডিআইপি (নির্ভরতা বিপরীতমুখী মূলনীতি: উচ্চ স্তরের মডিউল অবশ্যই নিম্ন স্তরের মডিউলের উপর নির্ভর করবে না, তবে তারা বিমূর্ততার উপর নির্ভর করবে) )।

যদি কোনও পদার্থ এই শ্রেণিবিন্যাসের যে কোনও অবজেক্টকে পরিবর্তন করে দেয়, তাড়াতাড়ি বা পরে কোডটিতে কোনও গণ্ডগোল হবে। এটি ছোট প্রকল্পগুলির ক্ষেত্রে ঠিক আছে তবে বিট প্রকল্পগুলিতে এই জগাখিচুড়িটি আবিষ্কার করার কোনও মজা নেই =]

ইউপিডি 07/18/2015

আমি মডেল কন্ট্রোলার অ্যানিমেশনগুলি প্রতিলিপি করেছি UINavigationController(tl; dr: প্রকল্পটি দেখুন )।

আমি ব্যাবহার করছি UINavigationController আমার অ্যাপ্লিকেশনে সমস্ত কন্ট্রোলার উপস্থাপন করতে । প্রাথমিকভাবে আমি প্লেইন পুশ / পপ অ্যানিমেশন সহ নেভিগেশন স্ট্যাকটিতে লগইন ভিউ কন্ট্রোলার প্রদর্শিত করেছি। আমি এটিকে ন্যূনতম পরিবর্তনগুলির সাথে মডেলে পরিবর্তন করার সিদ্ধান্ত নিয়েছি।

কিভাবে এটা কাজ করে:

  1. প্রারম্ভিক ভিউ কন্ট্রোলার হিসাবে প্রারম্ভিক দৃশ্যের নিয়ন্ত্রক (বা self.window.rootViewController) ইউআইএনএভিগেশন কন্ট্রোলার rootViewController। আমি প্রগ্রেভিউস কনট্রোলার দেখিয়ে চলেছি কারণ ডেটামোডেল সূচনা করতে কিছুটা সময় নিতে পারে কারণ এটি নিবন্ধের মতো মূল ডেটা স্ট্যাকটিকে ইনসাইট করে (আমি সত্যিই এই পদ্ধতির পছন্দ করি)।

  2. অ্যাপডেলিগেট লগইন স্থিতির আপডেট পাওয়ার জন্য দায়ী।

  3. ডাটামোডেল ব্যবহারকারী লগইন / লগআউট পরিচালনা করে এবং userLoggedInঅ্যাপডেলিগেট কেভিও এর মাধ্যমে এর সম্পত্তি পর্যবেক্ষণ করছে । তাত্ক্ষণিকভাবে এটি করার সর্বোত্তম পদ্ধতি নয় তবে এটি আমার পক্ষে কাজ করে। (কেনভিও খারাপ, আপনি এই বা এই নিবন্ধটি পরীক্ষা করতে পারেন (কেন বিজ্ঞপ্তি ব্যবহার করবেন না? অংশ))।

  4. ডিফল্ট পুশ অ্যানিমেশনটি কাস্টমাইজ করতে মোডালডিজিসআনিমেটর এবং মোডালপ্রেসাইশনএনিমেটার ব্যবহার করা হয়।

অ্যানিমেটারগুলি কীভাবে যুক্তি কাজ করে:

  1. অ্যাপডেলিগেট নিজেকে প্রতিনিধি হিসাবে সেট করে self.window.rootViewController(যা ইউআইএনএভিগেশন কন্ট্রোলার)।

  2. AppDelegate -[AppDelegate navigationController:animationControllerForOperation:fromViewController:toViewController:]প্রয়োজনে অ্যানিমেটারগুলির মধ্যে একটি ফেরত দেয় ।

  3. অ্যানিমেটারগুলি প্রয়োগ করে -transitionDuration:এবং -animateTransition:পদ্ধতিগুলি। -[ModalPresentAnimator animateTransition:]:

    - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
    {
        UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
        [[transitionContext containerView] addSubview:toViewController.view];
        CGRect frame = toViewController.view.frame;
        CGRect toFrame = frame;
        frame.origin.y = CGRectGetHeight(frame);
        toViewController.view.frame = frame;
        [UIView animateWithDuration:[self transitionDuration:transitionContext]
                         animations:^
         {
             toViewController.view.frame = toFrame;
         } completion:^(BOOL finished)
         {
             [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
         }];
    }

পরীক্ষা প্রকল্প এখানে


3
ব্যক্তিগতভাবে আমার সম্পর্কে ভিউ কন্ট্রোলারগুলির সম্পর্কে জানার কোনও সমস্যা নেই AppDelegate(আপনি কেন করেন তা বুঝতে আগ্রহী হব) - তবে অ্যানিমেশনের অভাব সম্পর্কে আপনার মন্তব্যটি খুব কার্যকর। : তা এই উত্তর দ্বারা সমাধান করা যেতে পারে stackoverflow.com/questions/8053832/...
HughHughTeotl

2
@ হুগহোটটিটল মন্তব্য এবং লিঙ্কটির জন্য আপনাকে ধন্যবাদ। আমি আমার উত্তর আপডেট।
derpoliuk

1
@डरপোলিউক আমার বেস ভিউ কন্ট্রোলার যদি কোনও ইউআইটিববারকন্ট্রোলার হয় তবে কী হবে? আমি এটি কোনও ইউআইএনএভিগেশন কন্ট্রোলারে ঠেলাতে পারি না।
জর্জিও

@ জর্জিও, এটি একটি আকর্ষণীয় প্রশ্ন, আমি UITabBarControllerখুব বেশিদিন ব্যবহার করিনি । আমি সম্ভবত ভিউ কন্ট্রোলারদের কারসাজির পরিবর্তে উইন্ডো পদ্ধতির সাথে শুরু করব ।
derpoliuk

11

ভবিষ্যতের যে কোনও দর্শকদের জন্য আমার সুইফটি সমাধানটি এখানে।

1) লগইন এবং লগআউট উভয় কার্য পরিচালনা করার জন্য একটি প্রোটোকল তৈরি করুন:

protocol LoginFlowHandler {
    func handleLogin(withWindow window: UIWindow?)
    func handleLogout(withWindow window: UIWindow?)
}

2) প্রোটোকল প্রসারিত করুন এবং লগ আউট করার জন্য এখানে কার্যকারিতা সরবরাহ করুন:

extension LoginFlowHandler {

    func handleLogin(withWindow window: UIWindow?) {

        if let _ = AppState.shared.currentUserId {
            //User has logged in before, cache and continue
            self.showMainApp(withWindow: window)
        } else {
            //No user information, show login flow
            self.showLogin(withWindow: window)
        }
    }

    func handleLogout(withWindow window: UIWindow?) {

        AppState.shared.signOut()

        showLogin(withWindow: window)
    }

    func showLogin(withWindow window: UIWindow?) {
        window?.subviews.forEach { $0.removeFromSuperview() }
        window?.rootViewController = nil
        window?.rootViewController = R.storyboard.login.instantiateInitialViewController()
        window?.makeKeyAndVisible()
    }

    func showMainApp(withWindow window: UIWindow?) {
        window?.rootViewController = nil
        window?.rootViewController = R.storyboard.mainTabBar.instantiateInitialViewController()
        window?.makeKeyAndVisible()
    }

}

3) তারপরে আমি আমার অ্যাপডেলিগেটটি লগইনফ্লোহ্যান্ডলার প্রোটোকলে সামঞ্জস্য করতে এবং handleLoginস্টার্টআপে কল করতে পারি:

class AppDelegate: UIResponder, UIApplicationDelegate, LoginFlowHandler {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        window = UIWindow.init(frame: UIScreen.main.bounds)

        initialiseServices()

        handleLogin(withWindow: window)

        return true
    }

}

এখান থেকে, আমার প্রোটোকল এক্সটেনশনটি লজিকটি পরিচালনা করবে বা ব্যবহারকারী লগ-ইন / আউট হয়েছে কিনা তা নির্ধারণ করবে এবং তারপরে উইন্ডোজ রুটভিউকন্ট্রোলারকে সেই অনুযায়ী পরিবর্তন করবে!


আমি বোকা হয়েছি কিনা তা নিশ্চিত নন তবে, অ্যাপডেলিগেট এটি মানায় না LoginFlowHandler। আমি কিছু অনুপস্থিত করছি? এছাড়াও, আমি অনুমান করছি যে এই কোডটি শুরুতে কেবল লগইন পরিচালনা করে। আমি কীভাবে একজন ভিউ কন্ট্রোলার থেকে লগ আউট পরিচালনা করব?
লুক

@ হালকা যেহেতু সমস্ত যুক্তি এক্সটেনশনে প্রয়োগ করা হয়েছে এটি অ্যাপডেলিগেটে এটি প্রয়োগ করার দরকার নেই। প্রোটোকল এক্সটেনশনগুলিতে এটাই দুর্দান্ত।
শানোগোগ

1
দুঃখিত @ সিরফানকাইনস্টাইন, এটি একজন কাস্টম ক্লাস যা আমি একজন ব্যবহারকারী তাদের অ্যাপ্লিকেশন ক্যাশে চেক করতে পারি যে কোনও ব্যবহারকারী আগে লগ ইন করেছেন কিনা তা যাচাই করতে পারে তার উদাহরণ দেখানোর জন্য তৈরি করেছিলাম। এই AppStateবাস্তবায়ন তাই আপনি কীভাবে আপনার ব্যবহারকারীর ডেটা ডিস্কে সংরক্ষণ করছেন তার উপর নির্ভর করবে।
হ্যারি ব্লুম

@ হারিব্লুম কীভাবে একজন handleLogoutকার্যকারিতা ব্যবহার করবেন ?
nithinisreddy

1
হাই @nithinisreddy - হ্যান্ডেললগআউট কার্যকারিতা কল করতে আপনার LoginFlowHandlerপ্রোটোকল থেকে যে ক্লাসটি কল করছেন সেগুলি অনুসরন করতে হবে । তারপরে আপনি হ্যান্ডললগআউট পদ্ধতিতে কল করতে সক্ষম হওয়ার সুযোগ পাবেন। অ্যাপডেলিগেট ক্লাসের জন্য আমি কীভাবে এটি করেছি তার উদাহরণের জন্য আমার পদক্ষেপ 3 দেখুন।
হ্যারি ব্লুম

8

অ্যাপের প্রতিনিধি থেকে এটি করার পরামর্শ দেওয়া হয় না। AppDelegate অ্যাপ্লিকেশন লাইফ চক্র পরিচালনা করে যা প্রবর্তন, স্থগিতকরণ, সমাপ্তি ইত্যাদির সাথে সম্পর্কিত। আমি আপনার প্রাথমিক ভিউ কন্ট্রোলার থেকে এটি করার পরামর্শ দিচ্ছি viewDidAppear। আপনি self.presentViewControllerএবং self.dismissViewControllerলগইন দর্শন নিয়ন্ত্রক থেকে পারেন । এটি প্রথমবারের জন্য চালু হচ্ছে কিনা তা দেখতে একটি boolকী সংরক্ষণ করুন NSUserDefaults


2
'ভিউডিডঅ্যাপিয়ার'-এ দৃশ্যটি (ব্যবহারকারীর কাছে দৃশ্যমান হওয়া) উচিত? এটি এখনও একটি ঝাঁকুনি তৈরি করবে।
মার্ক 13426

2
কোনও উত্তর নয়। এবং "এটি প্রথমবারের জন্য চালু হচ্ছে কিনা তা দেখার জন্য এনএসউসারডেফল্টগুলিতে একটি বুল কী সংরক্ষণ করুন that" এই জাতীয় ডেটার জন্য খুব বিপজ্জনক।
স্কাইওয়ান্দের

6

** লগইনভিউ নিয়ন্ত্রণকারী ** এবং ** ট্যাববারকন্ট্রোলার ** তৈরি করুন।

লগইনভিউকন্ট্রোলার এবং ট্যাববারকন্ট্রোলার তৈরি করার পরে , আমাদের একটি স্টোরিবোর্ড যুক্ত করতে হবে " লগইনভিউ কনট্রোলার " এবং " ট্যাববারকন্ট্রোলার হিসাবে যথাক্রমে " ।

তারপরে আমি কনস্ট্যান্ট স্ট্রাক্ট তৈরি করতে পছন্দ করি :

struct Constants {
    struct StoryboardID {
        static let signInViewController = "SignInViewController"
        static let mainTabBarController = "MainTabBarController"
    }

    struct kUserDefaults {
        static let isSignIn = "isSignIn"
    }
}

ইন LoginViewController যোগ IBAction :

@IBAction func tapSignInButton(_ sender: UIButton) {
    UserDefaults.standard.set(true, forKey: Constants.kUserDefaults.isSignIn)
    Switcher.updateRootViewController()
}

প্রোফাইলে ভিউকন্ট্রোলারে আইবিএ ક્શન যুক্ত করুন :

@IBAction func tapSignOutButton(_ sender: UIButton) {
    UserDefaults.standard.set(false, forKey: Constants.kUserDefaults.isSignIn)
    Switcher.updateRootViewController()
}

ইন AppDelegate মধ্যে কোডের লাইন যোগ didFinishLaunchingWithOptions :

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    Switcher.updateRootViewController()

    return true
}

অবশেষে সুইচার ক্লাস তৈরি করুন :

import UIKit

class Switcher {

    static func updateRootViewController() {

        let status = UserDefaults.standard.bool(forKey: Constants.kUserDefaults.isSignIn)
        var rootViewController : UIViewController?

        #if DEBUG
        print(status)
        #endif

        if (status == true) {
            let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
            let mainTabBarController = mainStoryBoard.instantiateViewController(withIdentifier: Constants.StoryboardID.mainTabBarController) as! MainTabBarController
            rootViewController = mainTabBarController
        } else {
            let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
            let signInViewController = mainStoryBoard.instantiateViewController(withIdentifier: Constants.StoryboardID.signInViewController) as! SignInViewController
            rootViewController = signInViewController
        }

        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.window?.rootViewController = rootViewController

    }

}

এটাই তো!


স্টোরিবোর্ডগুলিতে ভিউ কন্ট্রোলারটি প্রাথমিক হয় এমন কোনও পার্থক্য রয়েছে? আপনার যুক্ত ফটোতে আমি দেখতে পাচ্ছি যে আপনার কাছে বিকল্পটি "ইনিশিয়াল ভিউ কন্ট্রোলার" রয়েছে যা ট্যাব বার নিয়ামককে চেক করা আছে। AppDelegate- এ আপনি মূল রুট ভিউ কন্ট্রোলারটি স্যুইচ করেন যাতে আমি অনুমান করি যে এটি কোনও ব্যাপার না, তাই না?
শেডটিড

@ iAleksandr দয়া করে আইওএস 13 এর জন্য উত্তরটি আপডেট করুন S
নীতেশ

5

এক্সকোড 7 এ আপনার একাধিক স্টোরিবোর্ড থাকতে পারে। লগইন প্রবাহকে আলাদা স্টোরিবোর্ডে রাখতে পারলে আরও ভাল।

এটি নির্বাচিত ভিউকন্ট্রোলার> সম্পাদক> রিফ্যাক্টর টু স্টোরিবোর্ড ব্যবহার করে করা যেতে পারে

এবং রুটভিউ কনটোলার হিসাবে একটি ভিউ সেট করার জন্য এখানে সুইফ্ট সংস্করণ রয়েছে-

    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    appDelegate.window!.rootViewController = newRootViewController

    let rootViewController: UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("LoginViewController")

3

আমি প্রথম লঞ্চটি পরীক্ষা করতে এটি ব্যবহার করি:

- (NSInteger) checkForFirstLaunch
{
    NSInteger result = 0; //no first launch

    // Get current version ("Bundle Version") from the default Info.plist file
    NSString *currentVersion = (NSString*)[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
    NSArray *prevStartupVersions = [[NSUserDefaults standardUserDefaults] arrayForKey:@"prevStartupVersions"];
    if (prevStartupVersions == nil)
    {
        // Starting up for first time with NO pre-existing installs (e.g., fresh
        // install of some version)
        [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:currentVersion] forKey:@"prevStartupVersions"];
        result = 1; //first launch of the app
    } else {
        if (![prevStartupVersions containsObject:currentVersion])
        {
            // Starting up for first time with this version of the app. This
            // means a different version of the app was alread installed once
            // and started.
            NSMutableArray *updatedPrevStartVersions = [NSMutableArray arrayWithArray:prevStartupVersions];
            [updatedPrevStartVersions addObject:currentVersion];
            [[NSUserDefaults standardUserDefaults] setObject:updatedPrevStartVersions forKey:@"prevStartupVersions"];
            result = 2; //first launch of this version of the app
        }
    }

    // Save changes to disk
    [[NSUserDefaults standardUserDefaults] synchronize];

    return result;
}

(যদি ব্যবহারকারী অ্যাপটি মুছে ফেলে এবং এটি পুনরায় ইনস্টল করে তবে এটি প্রথম লঞ্চের মতো গণনা করা হয়)

অ্যাপডেলিগেটে আমি প্রথম লঞ্চটি পরীক্ষা করে দেখি এবং লগইন স্ক্রিনগুলি (লগইন এবং নিবন্ধন) দিয়ে একটি নেভিগেশন-কন্ট্রোলার তৈরি করি, যা আমি বর্তমান প্রধান উইন্ডোর উপরে রেখেছি:

[self.window makeKeyAndVisible];

if (firstLaunch == 1) {
    UINavigationController *_login = [[UINavigationController alloc] initWithRootViewController:loginController];
    [self.window.rootViewController presentViewController:_login animated:NO completion:nil];
}

এটি নিয়মিত দেখার নিয়ামকের শীর্ষে রয়েছে এটি আপনার বাকী অ্যাপ্লিকেশন থেকে স্বতন্ত্র এবং আপনার আর প্রয়োজন না হলে আপনি কেবলমাত্র ভিউ কন্ট্রোলারকে বরখাস্ত করতে পারেন। ব্যবহারকারী যদি নিজে বোতাম টিপেন তবে আপনি এইভাবে ভিউটি উপস্থাপন করতে পারেন।

বিটিডাব্লু: আমি আমার ব্যবহারকারীদের কাছ থেকে লগইন-ডেটা সংরক্ষণ করি:

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"com.youridentifier" accessGroup:nil];
[keychainItem setObject:password forKey:(__bridge id)(kSecValueData)];
[keychainItem setObject:email forKey:(__bridge id)(kSecAttrAccount)];

লগআউটের জন্য: আমি কোরডাটা (খুব ধীর) থেকে সরে এসেছি এবং এখন আমার ডেটা পরিচালনা করতে এনএসআরাই এবং এনএসডিকোরিয়াম ব্যবহার করেছি। লগআউট করার অর্থ কেবল সেই অ্যারে এবং অভিধানগুলি খালি করা। প্লাস আমি ভিউইলঅ্যাপিয়ারে আমার ডেটা সেট করা নিশ্চিত করি।

এটাই.


0

আমি এবং আপনি ডেটা সাফ করার জন্য যে সমাধানটি পেয়েছি ঠিক তেমন একই পরিস্থিতিতে আমি আমার ডেট কন্ট্রোলারগুলির তথ্য আঁকতে নির্ভর করে এমন সমস্ত কোরিডাটা উপাদান মুছে ফেলছে। তবে আমি এখনও এই পদ্ধতিরটিকে খুব খারাপ বলে মনে করেছি, আমি মনে করি স্টোরিবোর্ড ছাড়াই এবং এটিকে দেখার জন্য নিয়ামকগুলির মধ্যে রূপান্তরগুলি পরিচালনা করার জন্য কেবল কোড ব্যবহার না করে আরও একটি দুর্দান্ত উপায় সম্পন্ন করা যেতে পারে।

আমি গিথুব এ এই প্রকল্পটি পেয়েছি যা কেবল কোড অনুসারে এই সমস্ত কাজ করে এবং এটি বোঝা বেশ সহজ। তারা একটি ফেসবুকের মতো সাইড মেনু ব্যবহার করে এবং ব্যবহারকারী লগ-ইন থাকে কিনা তা নির্ভর করে কেন্দ্র ভিউ কন্ট্রোলার পরিবর্তন করে তারা কী করে। যখন ব্যবহারকারী লগ আউট করে appDelegateকোরেডাটা থেকে ডেটা সরিয়ে দেয় এবং আবার লগইন স্ক্রিনে মূল দৃশ্য নিয়ামককে সেট করে।


0

একটি অ্যাপে সমাধান করার জন্য আমার একই ধরণের সমস্যা ছিল এবং আমি নিম্নলিখিত পদ্ধতিটি ব্যবহার করেছি। নেভিগেশন পরিচালনা করার জন্য আমি বিজ্ঞপ্তি ব্যবহার করি নি।

অ্যাপটিতে আমার কাছে তিনটি স্টোরিবোর্ড রয়েছে।

  1. স্প্ল্যাশ স্ক্রিন স্টোরিবোর্ড - অ্যাপ্লিকেশন আরম্ভের জন্য এবং ব্যবহারকারী ইতিমধ্যে লগ ইন হয়েছে কিনা তা পরীক্ষা করার জন্য
  2. লগইন স্টোরিবোর্ড - ব্যবহারকারী লগইন প্রবাহ পরিচালনা করার জন্য
  3. ট্যাব বার স্টোরিবোর্ড - অ্যাপ্লিকেশন সামগ্রী প্রদর্শন করার জন্য

অ্যাপে আমার প্রাথমিক স্টোরিবোর্ডটি স্প্ল্যাশ স্ক্রিনের স্টোরিবোর্ড। আমার কাছে নিয়ামক ন্যাভিগেশনগুলি পরিচালনা করতে লগইন এবং ট্যাব বার স্টোরিবোর্ডের মূল হিসাবে নেভিগেশন নিয়ন্ত্রক রয়েছে।

আমি অ্যাপ্লিকেশন নেভিগেশন পরিচালনা করতে একটি নেভিগেটর ক্লাস তৈরি করেছি এবং এটি দেখে মনে হচ্ছে:

class Navigator: NSObject {

   static func moveTo(_ destinationViewController: UIViewController, from sourceViewController: UIViewController, transitionStyle: UIModalTransitionStyle? = .crossDissolve, completion: (() -> ())? = nil) {
       

       DispatchQueue.main.async {

           if var topController = UIApplication.shared.keyWindow?.rootViewController {

               while let presentedViewController = topController.presentedViewController {

                   topController = presentedViewController

               }

               
               destinationViewController.modalTransitionStyle = (transitionStyle ?? nil)!

               sourceViewController.present(destinationViewController, animated: true, completion: completion)

           }

       }

   }

}

আসুন সম্ভাব্য পরিস্থিতিতে দেখুন:

  • প্রথম অ্যাপ্লিকেশন লঞ্চ; স্প্ল্যাশ স্ক্রিনটি লোড হবে যেখানে আমি ব্যবহারকারীরা ইতিমধ্যে সাইন ইন আছে কিনা তা যাচাই করে নিই Then

যেহেতু মূল হিসাবে আমার নেভিগেশন কন্ট্রোলার রয়েছে তাই আমি নেভিগেশন নিয়ন্ত্রকটিকে প্রাথমিক দেখার নিয়ামক হিসাবে ইনস্ট্যান্ট করি।

let loginSB = UIStoryboard(name: "splash", bundle: nil)

let loginNav = loginSB.instantiateInitialViewcontroller() as! UINavigationController

Navigator.moveTo(loginNav, from: self)

এটি অ্যাপ্লিকেশন উইন্ডোটির মূল থেকে স্ল্যাপাশ স্টোরিবোর্ডটিকে সরিয়ে দেয় এবং এটি লগইন স্টোরিবোর্ডের সাথে প্রতিস্থাপন করে।

লগইন স্টোরিবোর্ড থেকে, যখন ব্যবহারকারী সফলভাবে লগইন হয়, তখন আমি ব্যবহারকারীর ডেটাটি ব্যবহারকারী ডিফল্টগুলিতে সংরক্ষণ করি এবং ব্যবহারকারীর বিবরণ অ্যাক্সেস করতে একটি ইউজারডাটা সিঙ্গলটন আরম্ভ করি। তারপরে ন্যাভিগেটর পদ্ধতিটি ব্যবহার করে ট্যাব বারের স্টোরিবোর্ডটি লোড করা হয়।

Let tabBarSB = UIStoryboard(name: "tabBar", bundle: nil)
let tabBarNav = tabBarSB.instantiateInitialViewcontroller() as! UINavigationController

Navigator.moveTo(tabBarNav, from: self)

এখন ব্যবহারকারী ট্যাব বারের সেটিংস স্ক্রীন থেকে সাইন আউট করে। আমি সমস্ত সংরক্ষিত ব্যবহারকারীর ডেটা সাফ করে লগইন স্ক্রিনে নেভিগেট করি।

let loginSB = UIStoryboard(name: "splash", bundle: nil)

let loginNav = loginSB.instantiateInitialViewcontroller() as! UINavigationController

Navigator.moveTo(loginNav, from: self)
  • ব্যবহারকারী লগ ইন এবং জোর করে অ্যাপ্লিকেশন হত্যা করে

ব্যবহারকারী যখন অ্যাপ্লিকেশনটি চালু করবেন তখন স্প্ল্যাশ স্ক্রীন লোড হবে। ব্যবহারকারী লগ ইন হয়েছে কিনা এবং আমি ব্যবহারকারী ডিফল্ট থেকে ব্যবহারকারী ডেটা অ্যাক্সেস করেছি কিনা তা আমি পরীক্ষা করে দেখি। তারপরে ইউজারডাটা সিঙ্গলটন আরম্ভ করুন এবং লগইন স্ক্রিনের পরিবর্তে ট্যাব বার দেখায়।


-1

ধন্যবাদ ভাওয়ার সমাধান solution দ্রুতগতির বিষয়ে দুটি উত্তর রয়েছে তবে সেগুলি খুব অক্ষত নয়। আমি এটি swift3 এ করেছি B নীচে মূল কোড।

AppDelegate.swift এ

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    // seclect the mainStoryBoard entry by whthere user is login.
    let userDefaults = UserDefaults.standard

    if let isLogin: Bool = userDefaults.value(forKey:Common.isLoginKey) as! Bool? {
        if (!isLogin) {
            self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LogIn")
        }
   }else {
        self.window?.rootViewController = mainStoryboard.instantiateViewController(withIdentifier: "LogIn")
   }

    return true
}

সাইনআপভিউকন্ট্রোলআর সুইফটে In

@IBAction func userLogin(_ sender: UIButton) {
    //handle your login work
    UserDefaults.standard.setValue(true, forKey: Common.isLoginKey)
    let delegateTemp = UIApplication.shared.delegate
    delegateTemp?.window!?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Main")
}

লগআউটএকশন ফাংশনে

@IBAction func logOutAction(_ sender: UIButton) {
    UserDefaults.standard.setValue(false, forKey: Common.isLoginKey)
    UIApplication.shared.delegate?.window!?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()
}

হাই এলি আপনি যে প্রশ্নের উত্তর দিয়েছেন ইতিমধ্যে তার বেশ কয়েকটি ভাল উত্তর রয়েছে। আপনি যখন এই জাতীয় প্রশ্নের উত্তর দেওয়ার সিদ্ধান্ত নেন তবে দয়া করে আপনার উত্তরটি ইতিমধ্যে পোস্ট করা ভাল উত্তরগুলির চেয়ে কেন ভাল তা নিশ্চিত করে নিশ্চিত করুন।
নোয়েল ওয়াইডার

হাই নোয়েল আমি দ্রুত উত্তর জন্য অন্যান্য উত্তর লক্ষ্য। তবে আমি বিবেচনা করেছি যে উত্তরগুলি খুব অক্ষত নয়। সুতরাং আমি swift3 সংস্করণ সম্পর্কে আমার উত্তর জমা দিন। এটি নতুন সুইফ্ট প্রোগ্রামারটির জন্য সহায়ক হবে you আপনাকে ধন্যবাদ! @ নোয়েল উইডমার।
ওয়াং ইয়াং

আপনি কি আপনার পোস্টের শীর্ষে সেই ব্যাখ্যাটি যুক্ত করতে পারেন? এইভাবে প্রত্যেকে তাত্ক্ষণিকভাবে আপনার উত্তরটির সুবিধা দেখতে পাবে। তাই ভাল সময় কাটান! :)
নোয়েল ওয়াইডার

1
আপনার পরামর্শের জন্য ট্যাঙ্কস I আমি ব্যাখ্যাটি যুক্ত করেছি again আবারও ধন্যবাদ @ @ নোয়েল উইদমার।
ওয়াং ইয়াং

লীগ সমাধান যা 'কমন' কীওয়ার্ডের ব্যবহারকে হাইলাইট করে না।
সামেরে

-3

এখানে চিত্র বর্ণনা লিখুন

অ্যাপ ডেলিগেট.এম এ

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
                                                     forBarMetrics:UIBarMetricsDefault];

NSString *identifier;
BOOL isSaved = [[NSUserDefaults standardUserDefaults] boolForKey:@"loginSaved"];
if (isSaved)
{
    //identifier=@"homeViewControllerId";
    UIWindow* mainWindow=[[[UIApplication sharedApplication] delegate] window];
    UITabBarController *tabBarVC =
    [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"TabBarVC"];
    mainWindow.rootViewController=tabBarVC;
}
else
{


    identifier=@"loginViewControllerId";
    UIStoryboard *    storyboardobj=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *screen = [storyboardobj instantiateViewControllerWithIdentifier:identifier];

    UINavigationController *navigationController=[[UINavigationController alloc] initWithRootViewController:screen];

    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];

}

return YES;

}

controller.m দেখুন দেখুন লোড হয়েছে

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.

UIBarButtonItem* barButton = [[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonItemStyleDone target:self action:@selector(logoutButtonClicked:)];
[self.navigationItem setLeftBarButtonItem:barButton];

}

লগআউট বোতাম ক্রিয়ায়

-(void)logoutButtonClicked:(id)sender{

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Do you want to logout?" preferredStyle:UIAlertControllerStyleAlert];

    [alertController addAction:[UIAlertAction actionWithTitle:@"Logout" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
           NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:NO forKey:@"loginSaved"];
           [[NSUserDefaults standardUserDefaults] synchronize];
      AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
    UIStoryboard *    storyboardobj=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *screen = [storyboardobj instantiateViewControllerWithIdentifier:@"loginViewControllerId"];
    [appDelegate.window setRootViewController:screen];
}]];


[alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
    [self dismissViewControllerAnimated:YES completion:nil];
}]];

dispatch_async(dispatch_get_main_queue(), ^ {
    [self presentViewController:alertController animated:YES completion:nil];
});}

কেন ভিউ কন্ট্রোলআরএম ফাইলটিতে কিছু কার্যকারিতা যুক্ত করার প্রয়োজন আছে ??
এশা

@ ইশা তিনি ট্যাববারে একটি "লগআউট" ট্যাববার বোতাম আইটেম যুক্ত করেছেন। আমি অনুমান করি যে চিত্রটি অনুপস্থিত এবং আপনি এটি দেখতে পারতেন।
হ্যালো ওয়ার্ল্ড

স্টোর লগইন কী NSUserDefaultsসেই ধরণের ডেটার জন্য খুব সুরক্ষিত!
স্কাইওয়ান্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.