NSUSerdefaults和刷卡ios的应用

Posted

技术标签:

【中文标题】NSUSerdefaults和刷卡ios的应用【英文标题】:NSUSer defaults and swiping the application off ios 【发布时间】:2014-05-01 08:03:59 【问题描述】:

全部,

我只是找不到这个问题的答案。 View Controller 的设置只需要在启动时显示一次。因此,当您从 App Store 下载应用程序/试飞时。

我猜对了,所以它先运行它,没关系。 当您完成设置页面后,它会转到主页,当您将应用程序移至后台时,它会从停止的地方继续。没关系..但是...当您通过双击主页按钮并将应用程序向上推以删除(ios7)来滑动应用程序时,它会再次返回设置屏幕,但它应该从停止的地方继续。

所以在我的 App Delegate 中,我有:

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


    NSString *savedValue = [[NSUserDefaults standardUserDefaults]  stringForKey:@"SettingsShown"];
    NSLog(@"%@", savedValue);
    Reachability *reachability = [Reachability reachabilityWithHostname:@"www.outtonightapp.com"];
    [reachability startNotifier];

    NSUserDefaults *settingsscreen = [NSUserDefaults standardUserDefaults];
    [settingsscreen registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],@"firstTime", nil]];
     //BOOL firstTime = [settingsscreen boolForKey:@"firstTime"];
    BOOL firstTime = [settingsscreen boolForKey:@"SettingsShown"];

    if (!firstTime) 
    //if ( firstTime==YES) 
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"SettingsShown"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        self.window.rootViewController = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"SetUpNav"];
    

    else
    
        return YES;
    

在我不得不重新创建我的设置 VC 之前,这确实有效。任何建议都会很棒。

【问题讨论】:

为什么在 default 用户默认值中使用 "firstTime" 并在值中使用 "SettingsShown" Droppy,我放弃了这个......你能建议吗? 好吧,我不确定它是否会有所作为,但请查看您在 registerDefaults 行中使用的键。将其从 "firstTime" 更改为 "SettingsShown" 看看是否有帮助。 看起来你从来没有读过最后的状态......每次你的应用在关闭后重新启动时,都会发生相同的路由 【参考方案1】:

在类似的情况下,我使用了委托模式。

假设您有初始视图控制器 initialVC。特殊设置视图控制器 (SetUpNav) 仅在未设置默认值时才首次运行。然后您可以执行以下操作:

    您在 SetUpNavViewController.h 中定义 SetUpNavdelegate 协议和符合该协议的属性“initiator”
@protocol SetUpNavDeleagte;

@interface SetUpNavViewController : UIViewController
@property (strong,nonatomic) id <SetUpNavdelegate> initiator;
// the rest
@end
@protocol SetUpNavdelegate <NSObject>
-(void)setupFinished;
@end
    在 InitialVC 的 viewDidLoad 中,您可以: 通过确定“firstTime”BOOL 值检查您的默认设置是否正确

并在代码中触发 setUpNav 控制器

-(void)viewDidLoad

    // Check your defaults for consistency
    if (firstTime)
        UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main OR you SB name" bundle:nil];
        UIViewController *setUpNavVC = [loginStoryboard instantiateViewControllerWithIdentifier:@"SetUpNav"];
        setUpNavVC.initiator = self;
        YouAppDelegateClass *appDelegate = [[UIApplication sharedApplication] delegate];
        appDelegate.window.rootViewController = setUpVC;
        // Here you don't need animation as I assume it is the very first screen
    
    // ... the rest



-(void)setupFinished

    // Here You animately restoring your initial vc.
    YouAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    appDelegate.window.rootViewController = self; // This line is for device orientation sync
    [UIView transitionWithView:appDelegate.window
                      duration:FINISH_DURATION
                       options:UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionCurveEaseInOut
                    animations:^ appDelegate.window.rootViewController = self; 
                    completion:nil];
     // setUpNav controller will be dealloced by ARC

    在您完成所有默认作业后,在您的 setUpNavViewController 中为您的委托设置通知:
[self.initator setupFinished];

在可能的应用程序中,此设置工作实际上是一个单独的故事板,其中包含自己的工作流程。顺便说一句,使用这种方法,您不仅可以在第一次显示它,而且每当您的应用程序的用户默认设置未正确设置时(例如,如果您使用设置包)。您可以在导航堆栈或弹出窗口(iPad 外壳)中以模态方式显示它。这是一种更通用的方法。

总结:谁开始,谁就结束了。

【讨论】:

以上是关于NSUSerdefaults和刷卡ios的应用的主要内容,如果未能解决你的问题,请参考以下文章

NSUserDefaults 不在 iOS 8 中的应用程序和自定义键盘之间存储值

NSUserDefaults setObject:forKey 死锁?

iOS 8,9 上的 NSUserDefaults 有多安全?

为啥在 iOS 中使用 NSUserDefaults?

从 iOS 上的 React Native 应用程序访问 NSUserDefaults

Apple Watch、WatchKit 和 NSUserDefaults [重复]