【问题标题】:Check Switch status from App Delegate in another View in Objective-C在 Objective-C 的另一个视图中检查 App Delegate 的切换状态
【发布时间】:2019-05-26 02:51:30
【问题描述】:

我想在 Objective-C 中的 App Delegate 中检查另一个 UIView 中的 Switch 状态(是 ON 还是 OFF)。这是我的代码,但不起作用。我不知道我是否正确设置了 UIView 标头,我可以从 App Delegate 访问视图。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    PrivacyPolicy *privacyPolicy = [[PrivacyPolicy alloc]init];
    if ([[privacyPolicy switchAuto] isOn])
    {
        //do something
    }

    else
    {
        nil;
    }

我找到了这段代码,但是在 Swift 3 中,有人可以翻译成 Objective-C 吗?我认为该代码是我需要的。

if defaults.value(forKey: "switchON") != nil{
    let switchON: Bool = defaults.value(forKey: "switchON")  as! Bool
    if switchON == true{
        self.view.backgroundColor = UIColor.red()
    }
    else if switchON == false{
        self.view.backgroundColor = UIColor.green()
    }

【问题讨论】:

  • 很抱歉这样说,但这在很多层面上都是错误的。首先,您正在分配和初始化一个新的 PrivacyPolicy 视图,它就是这样做的:它创建一个新视图(它创建它,但它不显示它)并查看其 switchAuto 属性的状态,但它总是返回该属性的初始化状态,我认为这不是您需要的。其次,您在 didFinishLaunchingWithOptions 方法中执行此操作,该方法仅在应用启动时触发一次。你想达到什么目标,具体是什么时候?你确定你应该在 AppDelegate 中这样做吗?
  • 您提供的 swift 代码可能用于根据应用程序的 UserDefaults 中保存的值设置开关的值(我将在这里冒险假设“默认”对象被声明为 var defaults : NSUserDefaults = NSUserDefaults.standardUserDefaults())
  • 在您的代码中,您正试图访问您刚刚初始化的开关。您可能会考虑将 PrivacyPolicy 设置为单例。或者,如果 PrivacyPolicy 是您在 ViewController 上添加的 UIView,try to access that ViewController first
  • didFinishLaunchingWithOptions 用于测试目的,我想把它放在 applicationWillEnterForeground 中,我有一个检查时间的功能(是白天?还是晚上?)然后设置应用程序。一切正常,除了我无法从 AppDelegate 到达开关。
  • 即使您想将其用于测试,使用 didFinishLaunchingWithOptions 也不是一个好主意:如前所述,它只会在启动时被调用一次,并且再也不会被调用

标签: objective-c xcode switch-statement


【解决方案1】:

我建议你在 AppDelegate.h 中添加一个 BOOL 属性:

@property (nonatomic) BOOL isPrivacyPolicyOn

并在 PrivacyPolicy 的 UISwitch 更改值时设置它(您首先必须将 Switch 从 Interface Builder 连接到 PrivacyPolicy 类):

- (IBAction)switchChanged:(id)sender {
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    delegate.isPrivacyPolicyOn = [self.switchAuto isOn];
}

(记得在PrivacyPolicy中导入AppDelegate.h)

这样,无论你在 AppDelegate 中使用什么方法,你只需要检查它的 isPrivacyPolicyOn 值,而不是访问视图的属性(这不是一个好主意):

if (self.isPrivacyPolicyOn) {
    /* do stuff */
}

另一种方法:使用 NSUserDefaults,这样您就可以完全解开 AppDelegate 和 PrivacyPolicy(这总是一件好事)。

在 PrivacyPolicy 的开关 IBAction 中,您在 userdefaults 中设置一个值:

- (IBAction)switchChanged:(id)sender {
    NSNumber *switchValue = [NSNumber numberWithBool:[self.privacySwitch isOn]];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:switchValue forKey:@"privacySwitch"];
}

在你的 AppDelegate 的任何方法中:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSNumber *privacySwitchValue = [defaults objectForKey:@"privacySwitch"];
BOOL isPrivacyOn = [privacySwitchValue boolValue];

这样,用户设置的值将是非易失性的,您可以随时查看。在这种情况下,在 didFinishLaunchingWithOptions 中检查它会按预期工作。

【讨论】:

  • 请注意,我假设您的代码只是用来玩弄 UISwitches、BOOL 和后台运行的应用程序,因为这里有很多可能出错的地方(首先所有,当应用程序被杀死并重新启动时,该 BOOL 的值将被重新初始化 - 您应该设置一个 NSUserDefaults 键以使其以非易失性方式设置)
  • 非常感谢,它现在可以正常工作了!你帮了我很多!
  • 您实施了哪种解决方案?
  • 第二个使用 NSUserDefaults,完美!再次感谢。
  • 这是一个更好的解决方案,特别是因为两个实体之间没有链接。 AppDelegate 应该尽可能“不可知”,了解谁在设置什么以及何时设置
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多