2009-11-06 125 views
1

所以我创建了一个自定义的TableViewCell,并在笔尖上放了一个UISwitch。在我甚至将它连接到任何东西之前,如果我在模拟器中运行它并单击它,它将通过动画等从关闭切换到开启。单击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]; 
    } 

但是,无论我做什么,该交换机将翻转,即使我给它没有指示进行操作。我很确定这是自动翻转,即使在我把任何东西吸引到它之前,它也会这样做。有没有办法关掉它?

谢谢!

回答

3

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

如果你有媒体链接发在Interface Builder一个IBOutlet在你所属的类delared连接,你就可以将其设置在这样的代码:

mySwitch.userInteractionEnabled = NO; 

你也可以直接设置属性在Interface Builder中选择相应的复选框,如下图所示(但是在您的应用程序,你将需要多达连线按钮的IBOutlet反正来实现你的条件逻辑。) alt text http://www.clixtr.com/photo/ef06c1f7-8cca-40cd-a454-5ca534ceb9fe

+0

我试过了。问题是,它在一个TableViewCell上。当我关闭userInteractionEnabled并尝试点击开关时,它会触及它后面的单元格。细胞进入另一种观点。我需要它仍然算作一个对象,以便单元格不会被触及,但不会自动切换。 – Ethan 2009-11-06 21:55:21

+1

通过将常规UIView粘贴到具有userInteraction Enabled的按钮(具有完全相同的大小)下方,您可以使生活变得简单。然后,当您在按钮上关闭它时,触摸将通过开关下落,但被常规视图占用,并且永远不会触击TableView Cell – 2009-11-06 22:06:51

+1

另一种选择是将开关设置为NO。它会使开关变灰,所以你可以实际上告诉它在点击它之前不会做任何事情,并且它不会将水龙头传递到它后面的单元格。 – 2009-11-06 23:17:08

1

我想你会需要的东西如下所示:

// 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 
    } 
} 

您遇到的问题是交换机已经提交了它的状态。当情况并非如此(我不确定,从未测试过),您必须检查开关是否当前为而不是。当用户不允许切换开关时,这一位代码将恢复状态。

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