我有五个开关。使用NSSUserDeafults
保存位置。
如果UISwitch
被切换.on
,则其他人会转到关闭位置。所有开关都尊重用户的位置选择并正确保存。
问题是UISwitch
位置只会在手动切换时保存,而不是在发件人调用.on = NO
时保存。这意味着如果所有开关在视图加载时的任何时刻都设置为on
,则它们将全部为.on
,直到另一个开关关闭并再次打开。
开关移动到关闭位置,但不保存(除非手动完成)
- (IBAction)plainToggled:(id)sender {
if (sender == _plainToggle) {
_curvesToggle.on = NO;
_cloudsToggle.on = NO;
_circlesToggle.on = NO;
_fadeToggle.on = NO;
BOOL mySwitchValuePlain = [ sender isOn ];
NSString *tmpStringPlain = mySwitchValuePlain ? @"1" : @"-1" ;
NSUserDefaults *myNSUDPlain = [NSUserDefaults standardUserDefaults];
[myNSUDPlain setBool:TRUE forKey:@"switchBOOLPlain"];
[ myNSUDPlain setObject:tmpStringPlain forKey: @"mySwitchValueKeyPlain" ];
[ myNSUDPlain synchronize ];
//save a key to read switch state in another view
NSUserDefaults *userDefaultsPlain = [NSUserDefaults standardUserDefaults];
[userDefaultsPlain setBool:self.plainToggle.on forKey:@"switchPlain"];
[userDefaultsPlain synchronize];
}
}
- (IBAction)curvesToggled:(id)sender {
if (sender == _curvesToggle) {
_cloudsToggle.on = NO;
_circlesToggle.on = NO;
_fadeToggle.on = NO;
_plainToggle.on = NO;
BOOL mySwitchValueCurves = [ sender isOn ];
NSString *tmpStringCurves = mySwitchValueCurves ? @"1" : @"-1" ;
NSUserDefaults *myNSUDCurves = [NSUserDefaults standardUserDefaults];
[myNSUDCurves setBool:TRUE forKey:@"switchBOOLCurves"];
[ myNSUDCurves setObject:tmpStringCurves forKey: @"mySwitchValueKeyCurves" ];
[ myNSUDCurves synchronize ];
//save a key to read switch state in another view
NSUserDefaults *userDefaultsCurves = [NSUserDefaults standardUserDefaults];
[userDefaultsCurves setBool:self.curvesToggle.on forKey:@"switchCurves"];
[userDefaultsCurves synchronize];
}
}
- (IBAction)cloudsToggled:(id)sender {
if (sender == _cloudsToggle) {
_curvesToggle.on = NO;
_circlesToggle.on = NO;
_fadeToggle.on = NO;
_plainToggle.on = NO;
BOOL mySwitchValueClouds = [ sender isOn ];
NSString *tmpStringClouds = mySwitchValueClouds ? @"1" : @"-1" ;
NSUserDefaults *myNSUDClouds = [NSUserDefaults standardUserDefaults];
[myNSUDClouds setBool:TRUE forKey:@"switchBOOLClouds"];
[ myNSUDClouds setObject:tmpStringClouds forKey: @"mySwitchValueKeyClouds" ];
[ myNSUDClouds synchronize ];
//save a key to read switch state in another view
NSUserDefaults *userDefaultsClouds = [NSUserDefaults standardUserDefaults];
[userDefaultsClouds setBool:self.cloudsToggle.on forKey:@"switchClouds"];
[userDefaultsClouds synchronize];
}
}
- (IBAction)circlesToggled:(id)sender {
if (sender == _circlesToggle) {
_curvesToggle.on = NO;
_cloudsToggle.on = NO;
_fadeToggle.on = NO;
_plainToggle.on = NO;
BOOL mySwitchValueCircles = [ sender isOn ];
NSString *tmpStringCircles = mySwitchValueCircles ? @"1" : @"-1" ;
NSUserDefaults *myNSUDCircles = [NSUserDefaults standardUserDefaults];
[myNSUDCircles setBool:TRUE forKey:@"switchBOOLCircles"];
[ myNSUDCircles setObject:tmpStringCircles forKey: @"mySwitchValueKeyCircles" ];
[ myNSUDCircles synchronize ];
//save a key to read switch state in another view
NSUserDefaults *userDefaultsCircles = [NSUserDefaults standardUserDefaults];
[userDefaultsCircles setBool:self.circlesToggle.on forKey:@"switchCircles"];
[userDefaultsCircles synchronize];
}
}
- (IBAction)fadeToggled:(id)sender {
if (sender == _fadeToggle) {
_curvesToggle.on = NO;
_cloudsToggle.on = NO;
_circlesToggle.on = NO;
_plainToggle.on = NO;
BOOL mySwitchValueFade = [ sender isOn ];
NSString *tmpStringFade = mySwitchValueFade ? @"1" : @"-1" ;
NSUserDefaults *myNSUDFade = [NSUserDefaults standardUserDefaults];
[myNSUDFade setBool:TRUE forKey:@"switchBOOLFade"];
[ myNSUDFade setObject:tmpStringFade forKey: @"mySwitchValueKeyFade" ];
[ myNSUDFade synchronize ];
//save a key to read switch state in another view
NSUserDefaults *userDefaultsFade = [NSUserDefaults standardUserDefaults];
[userDefaultsFade setBool:self.fadeToggle.on forKey:@"switchFade"];
[userDefaultsFade synchronize];
}
}
在viewDidLoad
//switch value for plain cert
NSUserDefaults *myNSUDPlain = [NSUserDefaults standardUserDefaults];
NSString *tmpStringPlain = [ myNSUDPlain stringForKey: @"switchPlain"];
BOOL mySwitchValuePlain = YES; // or DEFAULT_VALUE
if (tmpStringPlain != nil) {
mySwitchValuePlain = ( [ tmpStringPlain intValue ] == 1 );
}
[_plainToggle setOn: mySwitchValuePlain];
//switch value for curves cert
NSUserDefaults *myNSUDCurves = [NSUserDefaults standardUserDefaults];
NSString *tmpStringCurves = [ myNSUDCurves stringForKey: @"switchCurves"];
BOOL mySwitchValueCurves = NO; // or DEFAULT_VALUE
if (tmpStringCurves != nil) {
mySwitchValueCurves = ( [ tmpStringCurves intValue ] == 1 );
}
[_curvesToggle setOn: mySwitchValueCurves];
//switch value for clouds cert
NSUserDefaults *myNSUDClouds = [NSUserDefaults standardUserDefaults];
NSString *tmpStringClouds = [ myNSUDClouds stringForKey: @"switchClouds"];
BOOL mySwitchValueClouds = NO; // or DEFAULT_VALUE
if (tmpStringClouds != nil) {
mySwitchValueClouds = ( [ tmpStringClouds intValue ] == 1 );
}
[_cloudsToggle setOn: mySwitchValueClouds];
//switch value for circles cert
NSUserDefaults *myNSUDCircles = [NSUserDefaults standardUserDefaults];
NSString *tmpStringCircles = [ myNSUDCircles stringForKey: @"switchCircles"];
BOOL mySwitchValueCircles = NO; // or DEFAULT_VALUE
if (tmpStringCircles != nil) {
mySwitchValueCircles = ( [ tmpStringCircles intValue ] == 1 );
}
[_circlesToggle setOn: mySwitchValueCircles];
//switch value for fade cert
NSUserDefaults *myNSUDFade = [NSUserDefaults standardUserDefaults];
NSString *tmpStringFade = [ myNSUDFade stringForKey: @"switchFade"];
BOOL mySwitchValueFade = NO; // or DEFAULT_VALUE
if (tmpStringFade != nil) {
mySwitchValueFade = ( [ tmpStringFade intValue ] == 1 );
}
[_fadeToggle setOn: mySwitchValueFade];
}
答案 0 :(得分:1)
在代码处设置值时,不会调用事件UIControlEventValueChanged
的目标和选择器。此外,您没有保存其他开关的状态,因此您将在On
位置保存多个开关。最后,您可以合并动作方法,因为您已经在进行sender
识别。
答案 1 :(得分:0)
你应该遵循MVC范式。您不应该在UI控件中存储状态。相反,设置UI控件以匹配模型/数据的状态,并让UI控件更改模型/数据的状态。
实现此目的的一种简单方法是为每个具有当前状态的开关设置布尔变量或属性(是或否)。
可以从NSUserDefaults
轻松存储和检索这些变量/属性值。
在viewWillAppear
中,您可以根据变量设置UI控件的值。
然后,当用户更改开关的值时,请在IBAction
方法中设置变量/属性的值。
现在,您的初始视图显示正确。即使从不同的视图控制器更改了值,您的开关仍将显示正确的值。
答案 2 :(得分:0)
如果您有5个开关,但在任何给定时间只能打开一个,而其他所有开关都将关闭,为什么只有一个可以执行5个变量?在NSUserDefaults中存储int或w / e。在进行视图时,检查存储的int是什么,并将所有开关设置为关闭,但相应的除外。切换开关时,更改存储的值并以编程方式切换所有其他开关。 如果可以将所有开关设置为关闭(没有打开),则该值为0或-1值。
正如其他答案中所指出的,当您以编程方式设置值时,不会调用UIControlEventValueChanged。如果你坚持为你的开关设置5个不同的变量,当任何一个变换时,你必须以编程方式切换所有其他变量(你已经做过),并设置所有其他变量。
无论如何,UI元素应始终引用其状态的自变量,而不是自己控制其状态。无论如何,更改此功能将解决问题。