24

これは些細なことのように聞こえますが、私はいくつかの奇妙さに気づいています。UISwitch の Value Changed イベントのハンドラーを接続しました。私が期待するのは、ハンドラーが呼び出されるたびにスイッチの値が変わることです。しかし、実際には常にそうであるとは限りません。スイッチのオン/オフをすばやく押すと、スイッチの同じ状態でハンドラーが連続して呼び出される可能性があります (私の特定のアプリケーションでは、これは問題です)。だから、他の誰かがこの振る舞いに気づき、良い解決策を見つけたのではないかと思っています.

4

8 に答える 8

8

ハンドラーでスイッチの状態を取得します。

- (void)valueChanged:(UISwitch *)theSwitch {
   BOOL flag = theSwitch.on;
}
于 2010-11-04T16:50:01.567 に答える
7

押すたびに、スイッチのオン/オフがすぐに切り替わることはありません。スイッチがオフの位置にある場合は、オンの位置にアニメートする前に数回押すことができます。アニメーションが完了するまで「オン」とは見なされないため、これらの各プレスは「スイッチをオンにする」と解釈されます。値が実際にはまだ変更されていないにもかかわらず、プレスごとに「valueChanged」コールバックを受け取ります。

于 2011-02-10T05:45:44.860 に答える
1

ここに私のために働く解決策があります。また、スイッチが変更されると、プロパティの「変更予定/変更」通知も送信されます。イベントは、前後の値が正しく維持されるという点でも正しく機能します。

@interface MySwitch : UISwitch

@end

@implementation MySwitch
{
    BOOL _previousValue;
    BOOL _returnPreviousValue;
}

- (instancetype) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder: aDecoder];
    if (!self) return nil;

    _previousValue = self.isOn;
    [self addTarget: self action: @selector(_didChange)
                forControlEvents: UIControlEventValueChanged];

    return self;
}

- (instancetype) initWithFrame: (CGRect) frame
{
    self = [super initWithFrame: frame];
    if (!self) return nil;

    [self addTarget: self action: @selector(_didChange)
                forControlEvents: UIControlEventValueChanged];

    return self;
}

- (BOOL) isOn
{
    return (_returnPreviousValue)
                        ? _previousValue
                        : [super isOn];
}

- (void) setOn:(BOOL) on animated: (BOOL) animated
{
    [super setOn: on animated: animated];

    _previousValue = on;
}

- (void) _didChange
{
    BOOL isOn = self.isOn;

    if (isOn == _previousValue) return;

    _returnPreviousValue = true;
    [self willChangeValueForKey: @"on"];
    _returnPreviousValue = false;

    _previousValue = isOn;
    [self didChangeValueForKey:  @"on"];
}

@end
于 2014-07-15T06:36:59.440 に答える
0

スイッチをオフ/オンに切り替えると、「値が変更されました」が呼び出されました。したがって、valueChanged でメソッドを呼び出すことでスイッチの変更を検出できます。

于 2012-07-21T10:20:42.560 に答える
0

最後の状態をログに記録して、状態が変更されたかどうか、または同じ状態でトリガーされたかどうかを確認できるようにします。

于 2010-11-04T16:32:50.340 に答える
0

私の問題はばかげたものでした...enabled値が変化することを期待していましたが、明らかにそれはスイッチの切り替え時に検査する正しい値ではありません. onorisOnを使用するのが正しいものです.

于 2017-09-11T17:24:57.703 に答える