2012-05-28 76 views
1

我正在嘗試學習如何使用NSTimer s,並且我想到了以下內容:創建一個開關。讓計時器在應用程序開始時開始,每秒鐘後調用一次改變開關狀態的函數。用NSTimer翻轉UISwitch

這裏就是我所做的迄今:

我宣佈計時器,並在頭文件ViewControl.h開關都:

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

然後,在ViewControl.m文件I定義了以下:

- (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。您應該重新命名計時器的操作方法以澄清此問題。現在,計時器每秒都在調用開關的訪問器方法,這實際上沒有任何作用。

接下來,計時器將本身傳遞給它所調用的方法。 zeSwitch:中的sender參數將成爲計時器,而不是開關。如果此方法實際上是通過計時器調用的,則會發生崩潰,因爲您將發送isOn到計時器,並且它不響應。

你有一個插座開關,這樣你就可以通過該出口是指它:

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

請注意,我已經糾正了這個方法的名稱和類型 - 你也需要更改計時器創建以反映此:@selector(flipSwitch:)

第三,你想翻轉開關,所以你應該把它設置到的對面它的當前狀態。下一行必須是:

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

!運營商否定了BOOL到它的連接,把YESNO,反之亦然。

+0

萬歲!有效。非常感謝您的幫助和提示:D – stupidity

+0

很高興我能提供幫助。 –

3

1)當您指定一個選擇器需要一個參數時,名稱後需要冒號,所以@selector(zeSwitch:)

2)由定時器觸發的選擇器獲取定時器作爲參數,而不是開關,所以- (IBAction)zeSwitch:(NSTimer *)timer

+0

感謝您的支持! – stupidity