Objective c 在应用程序启动时使用复选框设置布尔值?

Objective c 在应用程序启动时使用复选框设置布尔值?,objective-c,cocoa,checkbox,interface-builder,boolean,Objective C,Cocoa,Checkbox,Interface Builder,Boolean,对ObjectiveC和Cocoa来说还是很新鲜的。希望这个问题的答案是直截了当的,但不是显而易见的 我有一个简单的应用程序,它使用两个文本字段设置两个字符串,在第三个文本字段中搜索字符串,结果显示在标签中。对于本练习,我使用的是NSString的-rangeOfString方法。为了让事情变得更有趣,我决定添加一个复选框来进行区分大小写的搜索 这一切都很好,除了一件事:当应用程序启动时,复选框的状态和它“控制”的BOOL不同步。在IB中,复选框状态设置为on。复选框操作的目标是一个方法-(iA

对ObjectiveC和Cocoa来说还是很新鲜的。希望这个问题的答案是直截了当的,但不是显而易见的

我有一个简单的应用程序,它使用两个文本字段设置两个字符串,在第三个文本字段中搜索字符串,结果显示在标签中。对于本练习,我使用的是
NSString
-rangeOfString
方法。为了让事情变得更有趣,我决定添加一个复选框来进行区分大小写的搜索

这一切都很好,除了一件事:当应用程序启动时,复选框的状态和它“控制”的BOOL不同步。在IB中,复选框状态设置为on。复选框操作的目标是一个方法
-(iAction)checkboxChange
,该方法评估复选框状态并相应地设置BOOL。BOOL的值为NO

目前我在
-awakeFromNib
中有一行代码,将BOOL设置为YES。我想要的是一种让复选框在应用程序加载时发送其操作的方法,这样BOOL设置与复选框状态一致。我想我可以在AppDelegate中使用
-applicationdFinishLoading
,但我不知道如何引用那里的复选框。我还认为我可以在该方法中设置BOOL的值,但即使我导入了定义BOOL的.h文件,XCode仍会抱怨标识符未定义

如果相关的话,我所有的代码都在一个名为AppController的类中,我根本不使用默认的AppDelegate


感谢您的阅读和建议/答案

NSUserDefaults
是在应用程序启动过程中保持首选项状态的最佳朋友。确保在进行更改后调用
synchronize
方法将其持久化到磁盘。在某些情况下,您可能希望延迟同步,直到应用程序即将进入后台状态

示例代码:

#define USER_DEFAULT_CASE_SENSITIVE @"USER_DEFAULT_CASE_SENSITIVE"

-(IBAction)checkboxChange {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:self.caseSensitive.on forKey:USER_DEFAULT_CASE_SENSITIVE];
    [defaults synchronize];
}
要在应用程序再次启动时还原它,请执行以下操作:

- (void)viewDidLoad {
    [super viewDidLoad];
    // other code

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    self.caseSensitive.on = [defaults boolForKey:USER_DEFAULT_CASE_SENSITIVE]
}

NSUserDefaults
是在应用程序启动过程中保持首选项状态的最佳朋友。确保在进行更改后调用
synchronize
方法将其持久化到磁盘。在某些情况下,您可能希望延迟同步,直到应用程序即将进入后台状态

示例代码:

#define USER_DEFAULT_CASE_SENSITIVE @"USER_DEFAULT_CASE_SENSITIVE"

-(IBAction)checkboxChange {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:self.caseSensitive.on forKey:USER_DEFAULT_CASE_SENSITIVE];
    [defaults synchronize];
}
要在应用程序再次启动时还原它,请执行以下操作:

- (void)viewDidLoad {
    [super viewDidLoad];
    // other code

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    self.caseSensitive.on = [defaults boolForKey:USER_DEFAULT_CASE_SENSITIVE]
}

谢谢你的回答,韦恩。我在代码中加入了这个,但无法让它工作。我又翻了一遍,似乎
-viewDidLoad
在UIKit中,而不是AppKit中?所以我用
-loadView
替换了它,但仍然存在问题。我在该方法上设置了一个断点,发现它从未被调用。因此,我将加载默认值的代码移到了
-applicationdifinishlaunching
,这与设置BOOL值的目的一样。不幸的是,BOOL和复选框的值仍然可能不同步。哦除非我给…加上一个简短的if..else。。。不如何将复选框的状态设置为匹配?我认为NSButton只能是一个出口或一个操作,但它可以清楚地处理这两个问题。我修改了我的代码,所有内容都是同步的:
-(void)applicationdFinishLaunching:(NSNotification*)通知{NSUserDefaults*默认值=[NSUserDefaults standardUserDefaults];self.isSearchCaseSensitive=[defaults boolforky:USER\u DEFAULT\u CASE\u SENSITIVE];if(isSearchCaseSensitive){[caseSensitiveCBState设置状态:nsState];}其他{[caseSensitiveCBState设置状态:NSOffState];}
谢谢Wayne。我会好好利用
NSUserDefaults
!这太难看了。我想我也需要学习正确的标记。;)谢谢你的回答Wayne。我在我的代码中加入了这一点,但没能让它起作用。我又翻了一番,似乎
-viewDidLoad
在UIKit中,但不是AppKit?所以我用
-loadView替换了它
仍然存在问题。我在该方法上设置了一个断点,发现它从未被调用。因此,我将加载默认值的代码移动到了
-applicationdFinishLaunching
,这与设置BOOL值的目的一样。不幸的是,BOOL值和复选框仍然可能不同步。哦……除非我添加了一个简短的if。。否则…否…如何将复选框的状态设置为匹配?我以为NSButton只能是一个出口或一个操作,但它可以清楚地处理这两者。我修改了代码,并且所有内容都同步:
-(void)applicationdFinishLaunching:(NSNotification*)aNotification{NSUserDefaults*defaults=[NSUserDefaults standardUserDefaults];self.isSearchCaseSensitive=[defaults boolForKey:USER_DEFAULT_CASE_SENSITIVE];if(isSearchCaseSensitive){[caseSensitiveCBState setState:nsState];}else{[caseSensitiveCBState setState:NSOffState];}
谢谢韦恩。我会好好利用
NSUserDefaults
!那太难看了。我想我也需要学习正确的标签。)