UISwitch не работает - PullRequest
       11

UISwitch не работает

0 голосов
/ 15 декабря 2011

Первый мой .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 ]

1 голос
/ 15 декабря 2011

Я думаю, что ошибка следующая:

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

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

Заполнитель IBOutlet должен быть вставлен в @property. Измените код и попробуйте снова подключить розетку.

Edit:

Попробуйте создать свой 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:

Этот код работает для меня. Это реализация (файл .m) для MyViewController.

@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

помните, чтобы позвонить self.gravaSwicth = nil в dealloc в MyViewController.m !!

0 голосов
/ 16 февраля 2017

FWIW У меня была эта проблема, когда мой UISwitch был в UITableViewCell, и я поместил его в верхней части списка подпредставлений в Интерфейсном Разработчике (и, следовательно, ниже других представлений в ячейке при запуске). Он работал в разработке, но не в производственной сборке для тех, кто знает, по какой причине. В Prod, я бы нажал на UISwitch, и весь ряд будет мигать спросить, если выбран.

Поэтому я переместил его в конец списка (и, следовательно, поверх других представлений в ячейке при запуске), а затем я мог нажать на переключатель UIS.

0 голосов
/ 21 февраля 2013
-(IBAction)alarmSwitchToggled:(id)sender
{


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


    }
    }

Укажите правильные соединения в nib-файле и не забудьте указать его как valuechanged вместо touchupinside

...