2012-05-28 3 views
1

Я пытаюсь узнать, как использовать NSTimer, и я подумал о следующем: Создайте переключатель. Пусть таймер начинается с начала приложения, и после каждой секунды вызывается функция, которая изменяет состояние переключателя.Перевернув UISwitch с помощью NSTimer

Вот что я сделал до сих пор:

Я объявил как таймер и переключатель в файле заголовка ViewControl.h:

//Timer 
{NSTimer *timer;} 
@property (weak, nonatomic) IBOutlet UISwitch *zeSwitch; 

Затем в файле ViewControl.m я определил следующие :

- (IBAction)zeSwitch:(id)sender { 
    UISwitch *zeSwitchSatus = (UISwitch *) sender; 
    BOOL yn = zeSwitchSatus.isOn; 
    [zeSwitch setOn:yn animated:YES]; 

}  

- (void)viewDidLoad 
{ 

    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self 
    selector:@selector(zeSwitch) userInfo:nil repeats:YES]; 


    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

Таким образом, я надеюсь, что когда я запустил код, я увижу переключатель, который включен или выключен. Затем я увижу, что он меняет свой статус автоматически со временем, без меня вмешивается.

image!

Но это не сработало! Сначала я получаю изображение выше. Ничего не меняется. Затем он падает, когда я нажимаю переключатель. (Но моя идея не касаться его вообще.)

Любые идеи?

+0

Когда вы говорите «не работает», вы имеете в виду, что он падает, не так ли? –

+0

Я сначала получу изображение выше. Ничего не меняется. Затем он падает, когда я нажимаю переключатель. (Но моя идея не трогать его вообще.) – stupidity

+0

Сделаю. Спасибо за совет. – stupidity

ответ

4

Вы довольно близко. Здесь кое-что не так. Во-первых, метод, который вы даете таймеру, называется zeSwitch: - двоеточие значимо. Так что вам нужно, чтобы создать таймер, как это:

timer = [NSTimer scheduledTimerWithTimeInterval:1 
             target:self 
             selector:@selector(zeSwitch:) 
             userInfo:nil    //^ Note colon! 
             repeats:YES]; 

Метод назван zeSwitch без двоеточия на самом деле метод сбруи для коммутатора, потому что вы назвали вашим имуществом zeSwitch. Вы должны действительно переименовать метод действия таймера, чтобы прояснить это. Прямо сейчас таймер вызывает метод доступа для коммутатора каждую секунду, что на самом деле ничего не делает.

Далее таймер отправляет сам методу, который он вызывает. Аргумент sender в zeSwitch: будет таймером, а не переключателем. Если этот метод действительно вызывается через таймер, вы получите крах, потому что вы отправляете isOn на таймер, и он не отвечает на это.

У вас есть выход к коммутатору, так что вы можете обратиться к нему через эту розетку:

- (void)flipSwitch: (NSTimer *)tim 
{ 
    BOOL switchIsOn = [[self zeSwitch] isOn]; 

Обратите внимание, что я исправил имена и типы в этом методе - вы будете также необходимо изменить создание таймера, чтобы отразить это: @selector(flipSwitch:).

В-третьих, вы хотите перевернуть переключатель, поэтому вы должны установить его на напротив своего текущего состояния.Следующая строка должна быть:

[[self zeSwitch] setOn:!switchIsOn animated:YES]; 

Оператор ! отрицает BOOL, к которому он прикреплен, поворачивая YES в NO и наоборот.

+0

Ура! Это сработало. Большое спасибо за помощь и советы: D – stupidity

+0

Рад, что я мог бы помочь. –

3

1) Когда вы указываете селектор, который принимает один параметр, вам нужно двоеточие после имени, поэтому @selector(zeSwitch:).

2) Селектор, который запускается таймером, получает таймер как параметр, а не переключатель, поэтому - (IBAction)zeSwitch:(NSTimer *)timer.

+0

Спасибо за это! – stupidity

Смежные вопросы