स्टोरीबोर्ड लॉगिन स्क्रीन के लिए सर्वोत्तम अभ्यास, लॉगआउट पर डेटा को साफ़ करना


290

मैं Storyboard का उपयोग करके एक iOS ऐप बना रहा हूं। रूट दृश्य नियंत्रक एक टैब बार नियंत्रक है। मैं लॉगिन / लॉगआउट प्रक्रिया बना रहा हूं, और यह ज्यादातर ठीक काम कर रहा है, लेकिन मुझे कुछ समस्याएं मिली हैं। मुझे यह सब सेट करने का सबसे अच्छा तरीका पता होना चाहिए।

मैं निम्नलिखित को पूरा करना चाहता हूं:

  1. एप्लिकेशन लॉन्च होने पर पहली बार एक लॉगिन स्क्रीन दिखाएं। जब वे लॉगिन करते हैं, तो टैब बार नियंत्रक के पहले टैब पर जाएं।
  2. किसी भी समय वे उसके बाद ऐप लॉन्च करते हैं, जांचें कि क्या वे लॉग इन हैं और रूट टैब बार कंट्रोलर के पहले टैब पर सीधे जाएं।
  3. जब वे मैन्युअल रूप से एक लॉगआउट बटन पर क्लिक करते हैं, तो लॉगिन स्क्रीन दिखाएं, और व्यू कंट्रोलर से सभी डेटा को साफ़ करें।

मैंने अब तक जो भी किया है वह टैब बार कंट्रोलर के रूट व्यू कंट्रोलर को सेट किया है, और मेरे लॉगिन व्यू कंट्रोलर को एक कस्टम सेगमेंट बनाया है। मेरे टैब बार नियंत्रक वर्ग के अंदर, मैं जांचता हूं कि क्या वे viewDidAppearविधि के अंदर लॉग इन हैं , और सेगमेंट करें:[self performSegueWithIdentifier:@"pushLogin" sender:self];

जब लॉगऑउट कार्रवाई करने की आवश्यकता हो तो मैं एक अधिसूचना भी सेट करता हूं: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(logoutAccount) name:@"logoutAccount" object:nil];

लॉगआउट होने पर, मैं किचेन से क्रेडेंशियल्स को साफ़ करता हूं, [self setSelectedIndex:0]फिर से लॉगिन व्यू कंट्रोलर को दिखाने के लिए सेग्यू करता हूं और चलाता हूं ।

यह सब ठीक काम करता है, लेकिन मैं सोच रहा हूं: क्या यह तर्क AppDelegate में होना चाहिए? मेरे पास भी दो मुद्दे हैं:

  • पहली बार जब वे ऐप लॉन्च करते हैं , तो टैब बार नियंत्रक सेग करने से पहले संक्षेप में दिखाता है। मैंने कोड को स्थानांतरित करने की कोशिश की है, viewWillAppearलेकिन वह सेगमेंट काम नहीं करेगा।
  • जब वे लॉगआउट करते हैं, तो सभी डेटा सभी व्यू कंट्रोलर्स के अंदर होता है। यदि वे एक नए खाते में प्रवेश करते हैं, तो पुराने खाते का डेटा अभी भी ताज़ा होने तक प्रदर्शित होता है। मुझे लॉगआउट पर इसे आसानी से साफ़ करने का एक तरीका चाहिए।

मैं इस के लिए खुला हूँ। मैंने लॉगिन स्क्रीन को रूट व्यू कंट्रोलर बनाने या सब कुछ संभालने के लिए AppDelegate में नेविगेशन कंट्रोलर बनाने पर विचार किया है ... मुझे यकीन नहीं है कि इस समय सबसे अच्छा तरीका क्या है।


क्या आप मोडल के रूप में लॉगिन व्यू कंट्रोलर प्रस्तुत करते हैं?
वोकिलम


मैंने जो कुछ किया, उसके विवरण के साथ मैंने एक उत्तर प्रस्तुत किया। यह उपलब्ध कराए गए कुछ अन्य उत्तरों के समान है, विशेष रूप से @भव्य कोठारी।
ट्रेवर गेहमान

लॉगिन स्क्रीन प्रस्तुत करने के लिए, प्रमाणीकरण की उपयोगिता हो सकती है। यदि आवश्यक हो तो यह एक लॉगिन स्क्रीन की प्रस्तुति का आयोजन करता है और ऑटो-लॉगिन का भी समर्थन करता है।
कोडी

बहुत ही बुनियादी समस्याओं में से एक है जो लगभग हमेशा हल हो जाती है लेकिन एक ही समय में ऐसा लगता है कि बेहतर किया जा सकता था
amar

जवाबों:


311

आपका स्टोरीबोर्ड इस तरह दिखना चाहिए

अपने appDelegate.m में अपने didFinishLaunchingWithOptions के अंदर

//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 फ़ाइल में

- (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 संस्करण

किया था अपने प्रारंभिक दृश्य नियंत्रक संभालने अनुप्रयोग प्रतिनिधि मेंFinishLaunchingWithOptions TabbarController में हस्ताक्षर किए हैं।

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

आप लॉगआउट के बाद userDefaults से बूल प्रमाणीकरण को हटाना भूल गए
कोडलेवर

28
-1 का उपयोग AppDelegateअंदर UIViewControllerऔर window.rootViewControllerवहाँ सेटिंग के लिए । मैं इसे "सर्वोत्तम अभ्यास" नहीं मानता।
derpoliuk

2
-1जवाब पोस्ट किए बिना नहीं देना चाहता था : stackoverflow.com/a/30664935/1226304
derpoliuk

1
Im IOS8 पर तेजी से ऐसा करने की कोशिश कर रहा है, लेकिन मुझे निम्न त्रुटि तब मिलती है जब ऐप फायर हो जाता है और लॉगिन स्क्रीन दिखाता है: "असंतुलित कॉल शुरू / अंत संक्रमण को शुरू करने के लिए"। मैंने देखा है कि जब ऐप लॉगिन स्क्रीन शो को लोड करता है, लेकिन टैब बार नियंत्रक पर पहला टैब भी लोड हो रहा है। व्यूडलोड में प्रिंट्लन () के माध्यम से इसकी पुष्टि की। सुझाव?
एलेक्स लैकायो

1
बिंगो! -2। -1 के AppDelegateअंदर UIViewController-1 के लिए लॉगिन लॉगिन कुंजी के लिए NSUserDefaults। यह उस तरह के डेटा के लिए बहुत असुरक्षित है!
स्काईविन्दर

97

यहाँ मैं सब कुछ पूरा करने के लिए क्या कर रहा हूँ। इसके अलावा आपको केवल एक चीज पर विचार करने की आवश्यकता है (एक) लॉगिन प्रक्रिया और (बी) जहां आप अपना ऐप डेटा संग्रहीत कर रहे हैं (इस मामले में, मैंने एक सिंगलटन का उपयोग किया है)।

स्टोरीबोर्ड लॉगिन दृश्य नियंत्रक और मुख्य टैब नियंत्रक दिखा रहा है

जैसा कि आप देख सकते हैं, रूट व्यू कंट्रोलर मेरा मेन टैब कंट्रोलर है । मैंने ऐसा इसलिए किया क्योंकि उपयोगकर्ता द्वारा लॉग इन करने के बाद, मैं चाहता हूं कि ऐप सीधे पहले टैब पर लॉन्च हो। (यह किसी भी "झिलमिलाहट" से बचा जाता है जहाँ लॉगिन दृश्य अस्थायी रूप से दिखता है।)

AppDelegate.m

इस फ़ाइल में, मैं जांचता हूं कि क्या उपयोगकर्ता पहले से लॉग इन है। यदि नहीं, तो मैं लॉगिन व्यू कंट्रोलर को धक्का देता हूं। मैं लॉगआउट प्रक्रिया को भी संभालता हूं, जहां मैं डेटा को साफ करता हूं और लॉगिन दृश्य दिखाता हूं।

- (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
@Beeher सही है। मैंने एक ताजा डेटा पुल को ट्रिगर करने के लिए अधिसूचना का उपयोग किया। आप इसका उपयोग कर सकते हैं जो आप चाहते हैं, लेकिन मेरे मामले में, मुझे यह सूचित करने की आवश्यकता है कि लॉगिन सफल था, और ताजा डेटा की आवश्यकता थी।
ट्रेवर गेहमन

24
IOS 8.1 (और शायद 8.0, परीक्षण नहीं किया गया है) में यह अब आसानी से काम नहीं करता है। प्रारंभिक दृश्य नियंत्रक संक्षिप्त क्षण के लिए चमकता है।
BFeher

7
क्या इस दृष्टिकोण का एक स्विफ्ट संस्करण है?
सीनो

9
@ जूलियन आईओएस 8 में, मैं झिलमिलाहट को रोकने के लिए दो लाइनों [self.window makeKeyAndVisible]; [self.window.rootViewController presentViewController:viewController animated:animated completion:nil];को प्रतिस्थापित करता हूं self.window.rootViewController = viewController;। चेतन करने के लिए बस में एक लपेट कि[UIView transitionWithView...];
BFeher

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;
}

2. यूजर नाम से एक क्लास बनाएं।

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;
}

3. एक नया नियंत्रक RootViewController बनाएं और पहले दृश्य के साथ जुड़ा हुआ है, जहां लॉगिन बटन लाइव है। एक स्टोरीबोर्ड आईडी भी जोड़ें: "initialView"।

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 बनाएं और लॉगिन दृश्य के साथ जुड़ा हुआ है।

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

5. अंत में एक नया कंट्रोलर ProfileViewController जोड़ें और tabViewController में प्रोफाइल व्यू के साथ जुड़ा।

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

LoginExample अतिरिक्त मदद के लिए एक नमूना परियोजना है।


3
नमूना परियोजना ने मुझे लॉगिन एन लॉगआउट की अवधारणा को समझने में बहुत मदद की .. बहुत धन्यवाद :)
डेव

16

मुझे AppDelegateव्यू कंट्रोलर के उपयोग के कारण भाव्या का उत्तर पसंद नहीं आया और सेटिंग rootViewControllerका कोई एनीमेशन नहीं है। और ट्रेवर के जवाब में iOS8 पर फ्लैशिंग व्यू कंट्रोलर के साथ समस्या है।

UPD 07/18/2015

AppDelegate अंदर नियंत्रकों को देखें:

व्यू कंट्रोलर के अंदर ऐपडेलगेट स्टेट (गुण) बदलने से एनकैप्सुलेशन टूट जाता है।

हर iOS प्रोजेक्ट में वस्तुओं का बहुत सरल पदानुक्रम:

AppDelegate (मालिक windowऔर rootViewController)

ViewController (मालिक view)

यह ठीक है कि शीर्ष से ऑब्जेक्ट्स नीचे की ओर ऑब्जेक्ट बदलते हैं, क्योंकि वे उन्हें बना रहे हैं। लेकिन यह ठीक नहीं है अगर नीचे की वस्तुएं उनके ऊपर की वस्तुओं को बदल देती हैं (मैंने कुछ बुनियादी प्रोग्रामिंग / ओओपी सिद्धांत का वर्णन किया: डीआईपी (निर्भरता उलटा सिद्धांत): उच्च स्तर के मॉड्यूल को निम्न स्तर के मॉड्यूल पर निर्भर नहीं होना चाहिए, लेकिन उन्हें अमूर्तता पर निर्भर होना चाहिए )।

यदि इस पदानुक्रम में कोई भी वस्तु किसी वस्तु को बदल देगी, तो जल्दी या बाद में कोड में गड़बड़ी होगी। यह छोटी परियोजनाओं पर ठीक हो सकता है लेकिन बिट परियोजनाओं पर इस गड़बड़ के माध्यम से खुदाई करने में कोई मजा नहीं है]]

UPD 07/18/2015

मैं मोडल कंट्रोलर एनिमेशन का उपयोग करके नकल करता हूं UINavigationController(tl; ड्र; प्रोजेक्ट की जांच करें )।

मैं UINavigationControllerअपने ऐप में सभी नियंत्रकों को प्रस्तुत करने के लिए उपयोग कर रहा हूं । प्रारंभ में मैंने सादा धक्का / पॉप एनीमेशन के साथ नेविगेशन स्टैक में लॉगिन दृश्य नियंत्रक प्रदर्शित किया। मैंने इसे कम से कम बदलाव के साथ मोडल में बदलने का फैसला किया।

यह काम किस प्रकार करता है:

  1. प्रारंभिक दृश्य नियंत्रक (या self.window.rootViewController) एक के रूप में ProgressViewController के साथ UINavigationController है rootViewController। मैं ProgressViewController दिखा रहा हूं क्योंकि DataModel को आरंभ करने में कुछ समय लग सकता है क्योंकि यह इस आलेख में कोर डेटा स्टैक की तरह है (मुझे वास्तव में यह दृष्टिकोण पसंद है)।

  2. AppDelegate लॉगिन स्थिति अपडेट प्राप्त करने के लिए जिम्मेदार है।

  3. DataModel उपयोगकर्ता लॉगिन / लॉगआउट को संभालता है और AppDelegate यह userLoggedInKVO के माध्यम से संपत्ति देख रहा है । यकीनन ऐसा करने का सबसे अच्छा तरीका नहीं है लेकिन यह मेरे लिए काम करता है। (केवीओ क्यों खराब है, आप इस या इस लेख में देख सकते हैं (Why Not Not Notifications? Part)।

  4. ModalDismissAnimator और ModalPresentAnimator का उपयोग डिफ़ॉल्ट पुश एनीमेशन को अनुकूलित करने के लिए किया जाता है।

एनिमेटर्स लॉजिक कैसे काम करता है:

  1. AppDelegate खुद को self.window.rootViewController(जो UINavigationController है) के एक प्रतिनिधि के रूप में सेट करता है ।

  2. -[AppDelegate navigationController:animationControllerForOperation:fromViewController:toViewController:]यदि आवश्यक हो तो AppDelegate एक एनिमेटरों को लौटाता है।

  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
@HughHughTeotl टिप्पणी के लिए और लिंक के लिए धन्यवाद। मैंने अपना उत्तर अपडेट कर दिया।
डेरोपोलुक

1
@derpoliuk क्या होगा यदि मेरा आधार दृश्य नियंत्रक UITabBarController है? मैं इसे UINavigationController में नहीं बढ़ा सकता।
जियोर्जियो

@ जिओर्जियो, यह एक दिलचस्प सवाल है, मैंने 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) तब मैं अपने AppDelegate को LoginFlowHandler प्रोटोकॉल के अनुरूप कर सकता हूं, और 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
    }

}

यहां से, मेरा प्रोटोकॉल एक्सटेंशन तर्क को निर्धारित करेगा या निर्धारित करेगा कि अगर उपयोगकर्ता लॉग इन / आउट किया गया है, और फिर उसके अनुसार विंडोज़ रूट व्यूक्रॉलर को बदलें!


यकीन नहीं है कि अगर मैं बेवकूफ हूं, लेकिन, AppDelegate के अनुरूप नहीं है LoginFlowHandler। क्या मैं कुछ भूल रहा हूँ? इसके अलावा, मुझे लगता है कि यह कोड केवल स्टार्ट अप में लॉग इन करता है। मैं एक व्यू कंट्रोलर से लॉग आउट कैसे प्रबंधित करूं?
ल्यूक

@ ल्यूक के बाद से सभी तर्क विस्तार में लागू किए गए हैं, AppDelegate में इसे लागू करने की कोई आवश्यकता नहीं है। प्रोटोकॉल एक्सटेंशन में यही बहुत अच्छा है।
शन्नोगा

1
क्षमा करें @sirFunkenstine, यह एक कस्टम वर्ग था जिसे मैंने एक उदाहरण दिखाने के लिए बनाया था कि कोई व्यक्ति अपने उपयोगकर्ता को पहले से लॉग इन किया है या नहीं यह जांचने के लिए उनके ऐप कैश की जांच कैसे करेगा। यह AppStateकार्यान्वयन इस बात पर निर्भर करेगा कि आप अपने उपयोगकर्ता डेटा को डिस्क पर कैसे सहेज रहे हैं।
हैरी ब्लूम

@HarryBloom कोई व्यक्ति handleLogoutकार्यक्षमता का उपयोग कैसे करेगा ?

1
हाय @nithinisreddy - हैंडललॉगआउट कार्यक्षमता को कॉल करने के लिए, आपको उस वर्ग के अनुरूप करने की आवश्यकता होगी जिसे आप LoginFlowHandlerप्रोटोकॉल से बुला रहे हैं । फिर आपको हैंडललॉगआउट विधि को कॉल करने में सक्षम होने की गुंजाइश मिलेगी। AppDelegate वर्ग के लिए मैंने जो किया, उसके एक उदाहरण के लिए मेरा चरण 3 देखें।
हैरी ब्लूम

8

एप्लिकेशन प्रतिनिधि से ऐसा करने की अनुशंसा नहीं की जाती है। AppDelegate ऐप जीवन चक्र का प्रबंधन करता है जो लॉन्चिंग, सस्पेंड करने, समाप्त करने और इसी तरह से संबंधित है। मेरा सुझाव है कि अपने प्रारंभिक दृश्य नियंत्रक से ऐसा करने में viewDidAppear। आप लॉगिन व्यू कंट्रोलर से self.presentViewControllerऔर कर सकते हैं self.dismissViewController। पहली बार लॉन्च हो रहा है या नहीं यह देखने के लिए एक boolकुंजी स्टोर करें NSUserDefaults


2
क्या 'viewDidAppear' में दृश्य प्रकट होना चाहिए (उपयोगकर्ता को दिखाई दे रहा है)? यह अभी भी एक झिलमिलाहट पैदा करेगा।
Mark13426

2
उत्तर नहीं। और "NSUserDefaults में एक बूल कुंजी संग्रहीत करें यह देखने के लिए कि क्या यह पहली बार लॉन्च हो रहा है।" उस तरह के डेटा के लिए बहुत खतरनाक है।
स्काईविन्दर

6

** LoginViewController ** और ** TabBarController ** बनाएं।

LoginViewController और TabBarController बनाने के बाद , हमें क्रमशः " loginViewController " और " tabBarController " के रूप में एक स्टोरीबोर्ड को जोड़ना होगा।

तब मैं लगातार संरचना बनाना पसंद करता हूं :

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()
}

में ProfileViewController जोड़ने IBAction :

@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 में यू मुख्य मेन व्यू कंट्रोलर को स्विच करता है तो मुझे लगता है कि यह कोई फर्क नहीं पड़ता, क्या यह?
ShadeToD

@iAleksandr iOS 13 के उत्तर को अपडेट करें। Coene of SceneDelegate वर्तमान उत्तर काम नहीं कर रहा है।
नितेश

5

Xcode 7 में आपके पास कई स्टोरीबोर्ड हो सकते हैं। बेहतर होगा कि आप लॉगिन प्रवाह को एक अलग स्टोरीबोर्ड में रख सकें।

यह SELECT VIEWCONTROLLER> Editor> Refactor to Storyboard का उपयोग करके किया जा सकता है

और यहां RootViewContoller के रूप में एक दृश्य स्थापित करने के लिए स्विफ्ट संस्करण है-

    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;
}

(यदि उपयोगकर्ता ऐप को हटा देता है और इसे फिर से इंस्टॉल करता है, तो यह पहले लॉन्च की तरह मायने रखता है)

AppDelegate में मैं पहले लॉन्च के लिए जाँच करता हूं और लॉगिन स्क्रीन (लॉगिन और रजिस्टर) के साथ एक नेविगेशन-नियंत्रक बनाता हूं, जिसे मैंने वर्तमान मुख्य विंडो के शीर्ष पर रखा है:

[self.window makeKeyAndVisible];

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

जैसा कि यह नियमित दृश्य नियंत्रक के शीर्ष पर है, यह आपके ऐप के बाकी हिस्सों से स्वतंत्र है और आप केवल दृश्य नियंत्रक को खारिज कर सकते हैं, अगर आपको अब और ज़रूरत नहीं है। और आप इस तरह से दृश्य भी प्रस्तुत कर सकते हैं, यदि उपयोगकर्ता मैन्युअल रूप से एक बटन दबाता है।

BTW: मैं इस तरह से अपने उपयोगकर्ताओं से लॉगिन-डेटा बचाता हूं:

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

लॉगआउट के लिए: मैंने कोरडेटा (बहुत धीमी गति से) से स्विच किया और अब अपने डेटा को प्रबंधित करने के लिए NSArrays और NSD शब्दकोशों का उपयोग करता हूं। लॉगआउट का अर्थ केवल उन सरणियों और शब्दकोशों को खाली करना है। इसके अलावा मैं अपने डेटा को viewWillAppear में सेट करना सुनिश्चित करता हूं।

बस।


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)

           }

       }

   }

}

आइए देखें संभावित परिदृश्य:

  • पहला ऐप लॉन्च; स्प्लैश स्क्रीन लोड की जाएगी जहां मैं जांचता हूं कि उपयोगकर्ता पहले से ही साइन इन है या नहीं। फिर लॉगिन स्क्रीन को नेविगेटर वर्ग का उपयोग करके लोड किया जाएगा;

चूंकि मेरे पास रूट के रूप में नेविगेशन नियंत्रक है, इसलिए मैं शुरुआती दृश्य नियंत्रक के रूप में नेविगेशन नियंत्रक को तुरंत हटा देता हूं।

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)
  • उपयोगकर्ता लॉग इन है और एप्लिकेशन को बलपूर्वक मारता है

जब उपयोगकर्ता ऐप लॉन्च करता है, तो स्प्लैश स्क्रीन लोड हो जाएगी। अगर उपयोगकर्ता लॉग इन करता है और उपयोगकर्ता डेटा को यूज़र डिफ़ाल्ट्स से एक्सेस करता है तो मैं जाँच करता हूँ। फिर UserData सिंगलटन को इनिशियलाइज़ करें और लॉगिन स्क्रीन के बजाय टैब बार दिखाएँ।


-1

धन्यवाद भाव्य का समाधान। स्विफ्ट के बारे में दो उत्तर दिए गए हैं, लेकिन वे बहुत बरकरार नहीं हैं। मेरे पास स्विफ्ट 3 में है। बेलो मुख्य कोड है।

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
}

SignUpViewController.swift में

@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")
}

LogOutAction फ़ंक्शन में

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

हाय एली। आपके द्वारा पहले से ही पूछे गए प्रश्न के कुछ अच्छे उत्तर हैं। जब आप इस तरह के प्रश्न का उत्तर देने का निर्णय लेते हैं, तो कृपया यह स्पष्ट करना सुनिश्चित करें कि आपका उत्तर पहले से पोस्ट किए गए बहुत अच्छे लोगों की तुलना में बेहतर क्यों है।
नोएल विडमर

हाय नोएल। मैंने तेजी के लिए अन्य उत्तरों पर ध्यान दिया। लेकिन मैंने माना कि उत्तर बहुत सटीक नहीं हैं। इसलिए मैं स्विफ्ट 3 संस्करण के बारे में अपना जवाब प्रस्तुत करता हूं। यह नए स्विफ्ट प्रोग्रामर के लिए मददगार होगा। धन्यवाद! @Noel Widmer
वांगयांग

क्या आप उस स्पष्टीकरण को अपनी पोस्ट के शीर्ष पर जोड़ सकते हैं? इस तरह हर कोई तुरंत आपके उत्तर का लाभ देख सकता है। एसओ पर एक अच्छा समय है! :)
नोएल विडमर

1
आपके सुझाव के लिए टैंक। मैंने स्पष्टीकरण जोड़ा है। फिर से धन्यवाद। @ नोएल विडमर।
वांगयांग

अस्पष्ट समाधान जो 'सामान्य' कीवर्ड के उपयोग को उजागर नहीं करता है।
सामरेय

-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;

}

नियंत्रक देखें । देखने में लोड था

- (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];
});}

फ़ाइल में कुछ कार्यक्षमता जोड़ने की आवश्यकता क्यों है ViewController.m ??
ईशा

@ ईशा ने उन्होंने टैबबार के लिए "लॉगआउट" टैबबार बटन आइटम जोड़ा। मुझे लगता है कि छवि गायब है और आप इसे देख सकते थे।
हेलोवर्ल्ड

स्टोर लॉगिन कुंजी NSUserDefaultsउस तरह के डेटा के लिए बहुत असुरक्षित है!
स्काईविंदर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.