UISwitch不工作

时间:2011-12-15 13:44:46

标签: ios uiswitch

首先是我的.h文件:

@interface SettingsViewController : UIViewController <UINavigationControllerDelegate>
{
    IBOutlet UISwitch *gravaSwitch;
    ...
}

@property (retain, nonatomic) UISwitch *gravaSwitch;
...
@end

我的viewDidload .m文件(可行):

...
// SET SWITCH BUTTON STATE
keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"TrafficApp" accessGroup:nil];

if ( [[keychain objectForKey:(id)kSecAttrAccount] isEqualToString:@"" ] ) 
    [self.gravaSwitch setOn:FALSE];
else [self.gravaSwitch setOn:TRUE];
...

但我的switchChanged不起作用,我不知道为什么。在IB上,所有内容都是正确连接的,它在此方法中输入,但gravaSwitch始终为空。

- (IBAction)switchChanged:(id)sender
{
    if ( self.gravaSwitch.on )
    {
        NSLog(@"IF");
        [self.gravaSwitch setOn:FALSE animated:YES];
    }
    else
    {
        NSLog(@"ELSE");
        [self.gravaSwitch setOn:TRUE animated:YES];
    }
}

问候。

3 个答案:

答案 0 :(得分:1)

我认为错误如下:

@interface SettingsViewController : UIViewController <UINavigationControllerDelegate>
{
    UISwitch *gravaSwitch;
    ...
}

@property (retain, nonatomic) IBOutlet UISwitch *gravaSwitch;
...
@end

必须将IBOutlet占位符插入@property。更改您的代码并尝试再次连接您的插座。

修改

尝试以编程方式创建UISwitch。按以下方式更改@property

@property (retain, nonatomic) UISwitch *gravaSwitch;

保持@synthesize不变。然后在您的viewDidLoad方法中添加您的UISwitch(默认情况下on属性为FALSE):

// Width and height are set to zero but they take the default dimension
UISwitch *yourSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(100, 100, 0, 0)];
// add target and action
mySwitch addTarget:self action:@selector(yourCustomAction:) forControlEvents:UIControlEventValueChanged];
self.gravaSwitch = yourSwitch;
// don't forget because gravaSwitch has already a retain policy
[release yourSwitch];

// add the switch to the view
[self.view addSubview:self.gravaSwitch];

在同一个控制器中,但在viewDidLoad方法之外,添加以下方法:

- (void)yourCustomAction:(id)sender
{
    if ( self.gravaSwitch.on )
    {
        NSLog(@"IF");
        [self.gravaSwitch setOn:FALSE animated:YES];
    }
    else
    {
        NSLog(@"ELSE");
        [self.gravaSwitch setOn:TRUE animated:YES];
    }
}

- (void)dealloc
{
  self.gravaSwitch = nil; // remember to dealloc the switch!!
  [super dealloc]
}

您也可以在self.gravaSwitch = nil;方法中致电viewDidUnload

作为替代方案,您可以设置gravaSwicth以分配策略如下。在这种情况下,您无需在self.gravaSwitch = nil;和/或dealloc中同时致电viewDidUnload

@property (assign, nonatomic) UISwitch *gravaSwitch;

希望它有所帮助。

编辑2:

此代码适用于我。这是MyViewController的实现(.m文件)。

@synthesize gravaSwitch;

- (void)viewDidLoad
{
    [super viewDidLoad];

    UISwitch *yourSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(100, 100, 0, 0)];
    [yourSwitch addTarget:self action:@selector(yourCustomAction:) forControlEvents:UIControlEventValueChanged];

    self.gravaSwitch = yourSwitch;

    [yourSwitch release];

    [self.view addSubview:self.gravaSwitch];
}

- (void)yourCustomAction:(id)sender
{
    if(self.gravaSwitch.on)
    {
        NSLog(@"on");
    }

    else
    {
        NSLog(@"off");
    }
}

其中gravaSwicth在MyViewController.h中声明如下:

@interface MyViewController : UIViewController
{
     UISwitch *gravaSwitch;
     ...
}

@property (retain, nonatomic) UISwitch *gravaSwitch;
...
@end

在MyViewController.m中以dealloc方式调用self.gravaSwicth = nil

答案 1 :(得分:0)

-(IBAction)alarmSwitchToggled:(id)sender
{


    if ([switchAlarm isOn]) {
        NSLog(@"switch is ON");
    }
    else
    {
                   NSLog(@"switch is OFF");


    }
    }

在nib文件中提供正确的连接,不要忘记将其设为valuechanged而不是touchupinside

答案 2 :(得分:0)

FWIW当我的UISwitch在UITableViewCell中时,我遇到了这个问题,我将它放在Interface Builder中的子视图列表的顶部(因此在运行时在单元格中的其他视图之下)。它在开发版本中工作,但不是生产版本,谁知道是什么原因。在prod中,我会点击UISwitch,整行会闪烁询问是否选中。

所以我将它移动到列表的底部(因此在运行时在单元格中的其他视图之上)然后我可以单击UISwitch。