首先是我的.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];
}
}
问候。
答案 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。