0

在我的应用程序中,我需要用户在 4 种类型的过滤器之间进行选择。如果他选择一个过滤器,其余的应该关闭。启动应用程序时,会预先选择 1 种类型的过滤器。要选择过滤器,我正在使用 UISwitches。每次只有 1 个开关应该打开。永远不会全部关闭,也不会超过一个。

为了完成这项工作,我使用了 4 个 UISwitches。我的代码看起来像这样:

- (IBAction)noFilterButtonTapped:(id)sender {
    if([noFilterButton isOn]){
        [noFilterButton setOn:YES animated:YES];
        [filterByTopicButton setOn:NO animated:YES];
        [filterByDateButton setOn:NO animated:YES];
        [filterByDistanceButton setOn:NO animated:YES];
    }
    else [noFilterButton setOn:YES animated:YES];

}

- (IBAction)filterByTopicButtonTapped:(id)sender {
    if([filterByTopicButton isOn]){
        [noFilterButton setOn:NO animated:YES];
        [filterByTopicButton setOn:YES animated:YES];
        [filterByDateButton setOn:NO animated:YES];
        [filterByDistanceButton setOn:NO animated:YES];    
    }
    else [filterByTopicButton setOn:YES animated:YES];
}

- (IBAction)filterByDateButtonTapped:(id)sender {
    if([filterByDateButton isOn]){
        [noFilterButton setOn:NO animated:YES];
        [filterByTopicButton setOn:NO animated:YES];
        [filterByDateButton setOn:YES animated:YES];
        [filterByDistanceButton setOn:NO animated:YES];    
    }    
    else [filterByDateButton setOn:YES animated:YES];    
}

- (IBAction)filterByDistanceButtonTapped:(id)sender {
    if([filterByDistanceButton isOn]){
        [noFilterButton setOn:NO animated:YES];
        [filterByTopicButton setOn:NO animated:YES];
        [filterByDateButton setOn:NO animated:YES];
        [filterByDistanceButton setOn:YES animated:YES];    
    }
    else [filterByDistanceButton setOn:YES animated:YES];
}

该代码运行良好。如果您按下一个已经打开的开关,则该开关会再次打开(实际上是关闭半秒钟然后自动打开)。如果你按下另一个开关,它就会打开,其余的都关闭。问题是,在测试应用程序时,我注意到如果我按下一个开关并立即按下另一个开关,它们都可以打开!我认为发生这种情况是因为使用此代码时,当您点击一个已经打开的开关时,它会关闭然后再次打开,但是如果您点击另一个开关,就会发生这种“动作”,他们都“认为”应该打开。我如何确保始终只有 1 个开关打开?我不知道当开关打开并且您再次按下时是否有一种方法,而不是关闭和打开,而只是不对动作做出“反应”。即使有,它是一个可行的解决方案吗?

4

3 回答 3

2

AUISwitch是您尝试执行的错误控制。您应该改用UISegmented控件。

于 2012-07-15T14:41:36.297 回答
1
- (IBAction)filterByDateButtonTapped:(id)sender 
{
    if(![filterByDateButton isOn])
        [filterByDateButton setOn:YES animated:YES];

    if([noFilterButton isOn])
        [noFilterButton setOn:NO animated:YES];

    if([filterByTopicButton isOn])
        [filterByTopicButton setOn:NO animated:YES];

    if([filterByDistanceButton isOn])
        [filterByDistanceButton setOn:NO animated:YES];
}

显然其他方法也应该是这样的。

希望这可以帮助。

干杯!

于 2012-07-15T14:42:28.057 回答
0

公认的解决方案是很多代码,有更好的方法(除了 UISegmented)。

创建一个包含所有开关的数组

@property (strong,nonatomic) NSArray *switches

-(void)viewDidLoad{
    self.switches = [NSArray arrayWithObjects: filterByTopicButton, noFilterButton, filterByTopicButton, filterByDistanceButton, nil];
}
...

将所有 UISwitch 连接到同一个 IBAction,然后像这样

-(IBAction)switchSwitched:(UISwitch *)sender{
    for (UISwitch *switch in self.switches)
        if (![switch isEqual:sender]) [switch setOn:NO animated:YES];
}

就是这样,相同的效果和更少的代码

于 2014-04-02T18:18:40.157 回答