0

私のアプリケーションでは、ユーザーが 4 種類のフィルターから選択する必要があります。彼が 1 つのフィルターを選択すると、残りは閉じます。アプリケーションを起動すると、1 種類のフィルターが事前に選択されます。フィルターを選択するには、UISwitches を使用しています。常に 1 つのスイッチのみをオンにする必要があります。すべてが閉じられることはなく、複数になることもありません。

これを機能させるために、4 つの UISwitch を使用しています。私のコードは次のようになります。

- (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];
}

コードはかなりうまく機能します。すでにオンになっているスイッチを押すと、スイッチが再びオンになります (実際には 0.5 秒間オフになり、その後自動的にオンになります)。別のスイッチを押すと、オンになり、残りはすべてオフになります。問題は、アプリケーションをテストしているときに、スイッチを押してすぐに別のスイッチを押すと、両方がオンになることに気付きました! これは、このコードでは、既にオンになっているスイッチを押すとオフになったりオンになったりするためだと思いますが、別のスイッチを押すとこの「アクション」が発生しますが、両方ともオンにする必要があると「考え」ます。常に 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 に答える