如何启用 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,它会自动为您完成所有这些工作;它让用户可以从三部分中选择一个。)

我会使用 UIViewtag 属性 作为你的三个开关,给三个开关中的每一个一个独特的标签值:例如,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];
    }
}