如何防止UISwitch改变状态?

时间:2012-01-02 10:39:44

标签: objective-c ios cocoa-touch uiswitch

我有一个在{.xib文件中定义的UISwitch。我所连接的事件是“Value Changed”。

我想要以下行为(基本上警告用户该功能在软件的Full Vesion中可用):

  1. 允许用户点击开关
  2. 防止开关滑动到“开”(我希望开关保持在“关闭”位置)
  3. 显示提醒
  4. 到目前为止,我无法上班2。现在我有一个kludge。我强制开关回到OFF位置:

    [self.switchButton setOn:NO animated:NO];
    
    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Feature unlocked in Full Version" message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] autorelease];
    alert.tag = ALERT_TAG;
    [alert show];
    

    问题是你看到开关滑动到ON位置,然后它跳到OFF位置,然后你看到警告框。

    有没有办法拦截行为,以便开关不会滑动到ON位置?

    更新

    我尝试链接到“TouchUpInside”事件并将警报代码移到那里。现在还不足以拦截开关状态的视觉变化。

8 个答案:

答案 0 :(得分:8)

我遇到了和你一样的问题。在valueChanged操作方法中,您必须使用动画设置为true来调用setOn方法。所以很快就会:

SelectedItem
ScrollTo()
Focus()

这似乎违反直觉,因为在切换值更改后调用此方法。但不知何故,它似​​乎有效。

答案 1 :(得分:3)

一个简单的解决方案就是在UISwitch控件前放置一个尺寸和透明背景颜色相同的按钮。虽然它不是您问题的直接答案,但这是一个很好的解决方法,我总是使用UIImageView来做到这一点。

答案 2 :(得分:3)

向该UISwitch视图添加一个清晰的颜色子视图,覆盖它并将UITapGestureReconizer添加到该子视图,并且可以在点击操作中触发所有操作操作,包括更改UISwitch视图状态。希望对你有帮助!

答案 3 :(得分:1)

在xib和UISwitch内部valueChange操作方法中将-(IBAction) switchValueChanged{ if (toggleSwitch.on) { UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Feature unlocked in Full Version" message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] autorelease]; alert.tag = ALERT_TAG; [alert show]; } } 的状态设置为关闭

{{1}}

答案 4 :(得分:1)

尝试收听TouchDown事件,而不是TouchUpInside。

答案 5 :(得分:1)

为什么不简单地将userInteraction设置为NO

[self.switchButton setUserInteractionEnabled:NO];

答案 6 :(得分:1)

这是您的操作方式,请将UISwitch设置为.touchUpInside

switchBtn.addTarget(self, action: #selector(unlockEvent), for: .touchUpInside)

如果将其设置为.valueChanged,则无论是否进行用户交互,每次都会触发该事件。

答案 7 :(得分:0)

很遗憾,UISwitch似乎没有委托方法来检查是否允许UISwitch进行更改。

我在UISwitch上添加了一个按钮,并处理了该按钮的IBAction事件的切换,这似乎是最好的方法。