如何启用 UISwitch 同时禁用其他两个
How to enable an UISwitch while disabling other two simultaneously
我的视图控制器中有 3 个 UISwitch,每个都标识用户必须选择的性别(“女性、男性、无性别”)。
我想实现的行为是,当用户点击切换到 select 性别时,必须同时禁用其他两个。
一旦切换 selected,“创建配置文件”按钮就会被激活。 (screenshots attached)
我无法实现 if 条件(或者 switch 条件)来做到这一点。
请帮忙
这是我实现的代码:
- (IBAction)checkGenderSwitch:(id)sender {
if ([self.femaleGenderSwitch isOn] && (![self.maleGenderSwitch isOn] && ![self.noGenderSwitch isOn])) {
[self enableCreateProfileButton];
} else if ([self.maleGenderSwitch isOn] && (![self.femaleGenderSwitch isOn] && ![self.noGenderSwitch isOn])) {
[self enableCreateProfileButton];
} else if ([self.noGenderSwitch isOn] && (![self.femaleGenderSwitch isOn] && ![self.maleGenderSwitch isOn])) {
[self enableCreateProfileButton];
}else{
[self disableCreateProfileButton];
}
}
谢谢。
让我们重新表述您的需求:
每次更改开关值时,您都会执行(伪代码):
if (male isOn && female isOff && noGender isOff) { enableButton }
else if (male isOff && female isOn && noGender isOff) { enableButton}
else if (male isOff && female isOff && noGender isOn)) { enableButton }
else { disableButton }
可以翻译成:
if (onlyMale isOn) { enableButton }
else if (onlyFemale isOn) { enableButton}
else if (onlyNoGender isOn) { enableButton }
else { disableButton }
only... isOn
?把它们放到一个NSArray
中,数一数isOn
的个数怎么样?那应该可以解决问题吗? only... isOn
用于 count = 0 where isOn == true
。
然后可以编码:
NSArray *switches = @[self.femaleGenderSwitch, self.maleGenderSwitch, self.noGenderSwitch];
NSUInteger numberOfSwitchesOn = 0;
for (UISwitch *aSwitch in switches) {
if ([aSwitch isOn]) {
numberOfSwitchesOn += 1;
}
}
if (numberOfSwitchesOn == 1) {
[self enableCreateProfileButton];
} else {
[self disableCreateProfileButton];
}
现在,如果您希望在打开一个 Switch 时关闭另外两个(如果需要),在我们的例子中只有一个,可以通过以下方式完成:
NSArray *switches = @[self.femaleGenderSwitch, self.maleGenderSwitch, self.noGenderSwitch];
BOOL hasASwitchOn = NO;
//We iterate over the switches
for (UISwitch *aSwitch in switches) {
//If the newly set is set to on, we need to disable the other (the one which aren't the same as the sender)
if ((UISwitch *)[sender isOn] && ![sender isEqual:aSwitch]) {
[aSwitch setOn:NO];
hasASwitchOn = YES;
} else if ([aSwitch isOn]) { //Else, we still count the number of isOn
hasASwitchOn = YES;
}
}
if (hasASwitchOn) {
[self enableCreateProfileButton];
} else {
[self disableCreateProfileButton];
}
正如评论中所说,禁用要求是错误的。需要始终启用所有三个开关。规则应该很简单,一次只能打开一个开关。
这里的关键是当你点击一个开关时,IBAction 方法被调用,sender
就是那个开关。
因此,只需保留对所有三个开关的列表引用,如果发件人现在是 on
,则循环遍历列表并关闭每个 不是 的开关发件人。
(或者使用由三部分组成的 UISegmentedControl,它会自动为您完成所有这些工作;它让用户可以从三部分中选择一个。)
我会使用 UIView
的 tag
属性 作为你的三个开关,给三个开关中的每一个一个独特的标签值:例如,0、1、2 .(您可以在 Interface Builder 或代码中进行设置 — 无论您喜欢哪个。)这使得区分三个开关变得微不足道。
然后,创建一个额外的 属性、genders
,一个包含三个开关的数组:
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UISwitch* femaleGenderSwitch;
@property (nonatomic, weak) IBOutlet UISwitch* maleGenderSwitch;
@property (nonatomic, weak) IBOutlet UISwitch* noGenderSwitch;
@property (nonatomic, strong) NSArray* genders;
@end
在 -viewDidLoad
中设置:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.genders =
@[[self femaleGenderSwitch], [self maleGenderSwitch], [self noGenderSwitch]];
}
最后,您可以像这样简化操作方法中的逻辑:
- (IBAction)checkGenderSwitch:(id)sender
{
if ([sender isOn]) {
for (id aSwitch in [self genders]) {
if ([aSwitch tag] != [sender tag]) {
[aSwitch setOn:NO animated:YES];
}
}
[self enableCreateProfileButton];
}
else {
[self disableCreateProfileButton];
}
}
我的视图控制器中有 3 个 UISwitch,每个都标识用户必须选择的性别(“女性、男性、无性别”)。
我想实现的行为是,当用户点击切换到 select 性别时,必须同时禁用其他两个。 一旦切换 selected,“创建配置文件”按钮就会被激活。 (screenshots attached)
我无法实现 if 条件(或者 switch 条件)来做到这一点。 请帮忙
这是我实现的代码:
- (IBAction)checkGenderSwitch:(id)sender {
if ([self.femaleGenderSwitch isOn] && (![self.maleGenderSwitch isOn] && ![self.noGenderSwitch isOn])) {
[self enableCreateProfileButton];
} else if ([self.maleGenderSwitch isOn] && (![self.femaleGenderSwitch isOn] && ![self.noGenderSwitch isOn])) {
[self enableCreateProfileButton];
} else if ([self.noGenderSwitch isOn] && (![self.femaleGenderSwitch isOn] && ![self.maleGenderSwitch isOn])) {
[self enableCreateProfileButton];
}else{
[self disableCreateProfileButton];
}
}
谢谢。
让我们重新表述您的需求:
每次更改开关值时,您都会执行(伪代码):
if (male isOn && female isOff && noGender isOff) { enableButton }
else if (male isOff && female isOn && noGender isOff) { enableButton}
else if (male isOff && female isOff && noGender isOn)) { enableButton }
else { disableButton }
可以翻译成:
if (onlyMale isOn) { enableButton }
else if (onlyFemale isOn) { enableButton}
else if (onlyNoGender isOn) { enableButton }
else { disableButton }
only... isOn
?把它们放到一个NSArray
中,数一数isOn
的个数怎么样?那应该可以解决问题吗? only... isOn
用于 count = 0 where isOn == true
。
然后可以编码:
NSArray *switches = @[self.femaleGenderSwitch, self.maleGenderSwitch, self.noGenderSwitch];
NSUInteger numberOfSwitchesOn = 0;
for (UISwitch *aSwitch in switches) {
if ([aSwitch isOn]) {
numberOfSwitchesOn += 1;
}
}
if (numberOfSwitchesOn == 1) {
[self enableCreateProfileButton];
} else {
[self disableCreateProfileButton];
}
现在,如果您希望在打开一个 Switch 时关闭另外两个(如果需要),在我们的例子中只有一个,可以通过以下方式完成:
NSArray *switches = @[self.femaleGenderSwitch, self.maleGenderSwitch, self.noGenderSwitch];
BOOL hasASwitchOn = NO;
//We iterate over the switches
for (UISwitch *aSwitch in switches) {
//If the newly set is set to on, we need to disable the other (the one which aren't the same as the sender)
if ((UISwitch *)[sender isOn] && ![sender isEqual:aSwitch]) {
[aSwitch setOn:NO];
hasASwitchOn = YES;
} else if ([aSwitch isOn]) { //Else, we still count the number of isOn
hasASwitchOn = YES;
}
}
if (hasASwitchOn) {
[self enableCreateProfileButton];
} else {
[self disableCreateProfileButton];
}
正如评论中所说,禁用要求是错误的。需要始终启用所有三个开关。规则应该很简单,一次只能打开一个开关。
这里的关键是当你点击一个开关时,IBAction 方法被调用,sender
就是那个开关。
因此,只需保留对所有三个开关的列表引用,如果发件人现在是 on
,则循环遍历列表并关闭每个 不是 的开关发件人。
(或者使用由三部分组成的 UISegmentedControl,它会自动为您完成所有这些工作;它让用户可以从三部分中选择一个。)
我会使用 UIView
的 tag
属性 作为你的三个开关,给三个开关中的每一个一个独特的标签值:例如,0、1、2 .(您可以在 Interface Builder 或代码中进行设置 — 无论您喜欢哪个。)这使得区分三个开关变得微不足道。
然后,创建一个额外的 属性、genders
,一个包含三个开关的数组:
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UISwitch* femaleGenderSwitch;
@property (nonatomic, weak) IBOutlet UISwitch* maleGenderSwitch;
@property (nonatomic, weak) IBOutlet UISwitch* noGenderSwitch;
@property (nonatomic, strong) NSArray* genders;
@end
在 -viewDidLoad
中设置:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.genders =
@[[self femaleGenderSwitch], [self maleGenderSwitch], [self noGenderSwitch]];
}
最后,您可以像这样简化操作方法中的逻辑:
- (IBAction)checkGenderSwitch:(id)sender
{
if ([sender isOn]) {
for (id aSwitch in [self genders]) {
if ([aSwitch tag] != [sender tag]) {
[aSwitch setOn:NO animated:YES];
}
}
[self enableCreateProfileButton];
}
else {
[self disableCreateProfileButton];
}
}