【问题标题】:Turn off auto-switching when clicked on UISwitch?点击UISwitch时关闭自动切换?
【发布时间】:2010-12-14 00:37:34
【问题描述】:

所以我创建了一个自定义 TableViewCell,并在笔尖中放置了一个UISwitch。在我将它连接到任何东西之前,如果我在模拟器中运行它并单击它,它会随着动画等从关闭切换到开启。

我正在尝试添加一个功能,当某个条件为真时,只允许用户从关闭更改为开启。我想要这样,当用户触摸开关时,它会检查条件是否为真,如果不是,则开关不会移动。

我已经设置了一个IBAction,如果用户在里面触摸,它将运行我的函数。我的功能是这样的:

if([on_switch isOn])
    {
        if([my_switch canSwitchOn])
        {
            NSLog(@"SWITCHED ON SUCCESSFULLY");
            [on_switch setOn:TRUE animated:TRUE];
        }
        else
        {
            NSLog(@"SWITCHED ON UNSUCCESSFULLY");
                        //Put in popup here
        }
    }
    else
    {
        [[ClassesSingleton sharedSingleton] classSwitchedOff:cell_index];
        [on_switch setOn:FALSE animated:TRUE];
    }

但是,无论我做什么,这个开关都会翻转,即使我没有给它任何指示。我很确定是自动翻转导致它这样做,甚至在我将任何东西连接到它之前。有没有办法关闭它?

谢谢!

【问题讨论】:

    标签: iphone uiswitch


    【解决方案1】:

    您需要做的是在您的UISwitch 上将userInteractionEnabled 属性设置为False。

    如果您已经在 Interface Builder 中建立了与您在自己的类中声明的 IBOutlet 的连接,您将能够在如下代码中设置它:

    mySwitch.userInteractionEnabled = NO;
    

    您还可以通过选中复选框直接在 Interface Builder 中设置属性,如下所示(但是在您的应用程序中,无论如何您都需要将按钮连接到 IBOutlet 以实现您的条件逻辑。) alt text http://www.clixtr.com/photo/ef06c1f7-8cca-40cd-a454-5ca534ceb9fe

    【讨论】:

    • 我试过了。问题是,它在 TableViewCell 上。当我关闭 userInteractionEnabled 并尝试单击开关时,它会触及它后面的单元格。单元格转到另一个视图。我需要它仍然算作一个对象,这样单元格就不会被触摸,但不会自动切换。
    • 您可以通过在启用了 userInteraction 的按钮(大小完全相同)下方粘贴一个常规 UIView 来让您的生活更轻松。然后,当您在按钮上将其关闭时,触摸将通过开关下降,但会被常规视图吞噬,并且永远不会碰到 TableView 单元
    • 另一个选项是在交换机上简单地将启用设置为 NO。它会使开关变灰,因此您实际上可以在点击它之前告诉它不会做任何事情,并且它不会将点击传递到它后面的单元格。
    • 在我翻转它之前我无法判断,Ed,但除此之外听起来不错!我认为布拉德的想法会很有效,所以谢谢!
    • 注意:实际上,令人沮丧的是,布拉德的想法并没有奏效。即使视图设置为用户启用,它也会进入下面的单元格。不过感谢您的帮助!
    【解决方案2】:

    我认为您将需要以下内容:

    // Somewhere just after the creation of _switch
    [_switch addTarget:self action:@selector(switchValueDidChange:) forControlEvents:UIControlEventValueChanged];
    
    // Target/Action method
    - (void)switchValueDidChange:(UISwitch *)sender {
        if(sender.on && [self canSwitchOn] == NO){
            [sender setOn:NO animated:YES];
            // Popup
        }
    }
    

    您遇到的问题是开关已经提交它在触摸时处于开启状态。如果不是这种情况(我不确定,从未测试过),您必须检查开关当前是否打开。当用户不被允许切换开关时,这段代码将恢复状态。

    更好的方法是禁用控件,但在这种情况下,这可能不是您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多