2013-01-17 66 views
0

我製作了一個自定義開關,用於開啓和關閉我的遊戲「光學戰鬥」中的聲音效果,但由於某些原因,按下該按鈕時會使開關移動到不同位置,但不起作用在第一次點擊。後來的水龍頭工作,而不是第一個。UIButton無法在第一個水龍頭上工作

在IBAction爲爲按鈕我有:

- (IBAction)theSwitch:(id)sender { 
NSUserDefaults *toggle = [NSUserDefaults standardUserDefaults]; 

if (_toggle == 1) { 

    [UIView animateWithDuration:0.3 animations:^{ 
     audioToggle.frame = CGRectMake(985.0f, 59.0f, audioToggle.frame.size.width, audioToggle.frame.size.height); 
    }]; 

    _toggle ++; 
    [toggle setInteger:_toggle forKey:@"toggleState"]; 
    [toggle synchronize]; 
    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"audioOn"]; 

} 

else { 

    [UIView animateWithDuration:0.3 animations:^{ 
     audioToggle.frame = CGRectMake(924.0f, 59.0f, audioToggle.frame.size.width, audioToggle.frame.size.height); 
    }]; 

    _toggle --; 
    [toggle setInteger:_toggle forKey:@"toggleState"]; 
    [toggle synchronize]; 
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"audioOn"]; 

} 
} 

而在viewDidLoad中,檢查開關的狀態,並調整它以顯示正確的位置(開或關):

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"audioOn"]) { 
    [audioToggle setFrame:CGRectMake(924.0f, 59.0f, audioToggle.frame.size.width, audioToggle.frame.size.height)]; 
    _toggle = 2; 
} 
else { 
    [audioToggle setFrame:CGRectMake(985.0f, 59.0f, audioToggle.frame.size.width, audioToggle.frame.size.height)]; 
    _toggle = 1; 
} 

編輯:我用這個來解決我的問題,在IBAction爲爲按鈕:

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"audioOn"]) { 
    [UIView animateWithDuration:0.3 animations:^{ 
    audioToggle.frame = CGRectMake(985.0f, 59.0f, audioToggle.frame.size.width, audioToggle.frame.size.height); 
    }]; 
    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"audioOn"]; 
} 
else { 
    [UIView animateWithDuration:0.3 animations:^{ 
    audioToggle.frame = CGRectMake(924.0f, 59.0f, audioToggle.frame.size.width, audioToggle.frame.size.height); 
    }]; 
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"audioOn"]; 
} 
+1

爲什麼不使用選定的布爾值? – amar

+1

我認爲這是一個邏輯錯誤。試試我的答案.. –

+0

我已經切換到布爾值,我會看看是否修復它。 –

回答

3

在你viewDidLoad

if _toggle = 2; 
frame = CGRectMake(924.0f, 59.0f, audioToggle.frame.size.width, audioToggle.frame.size.height) 

if _toggle = 1; 
frame = CGRectMake(985.0f, 59.0f, audioToggle.frame.size.width, audioToggle.frame.size.height) 

但在你buttonAction它是不同的。如果buttonAction正確,在viewDidLoad交換。

1

我懷疑阿努沙得到了它。但我也懷疑,如果你選擇了稍微不同的風格,你會很容易找到它。切換開啓或關閉,換句話說,布爾型完美匹配。如果你有一個名爲swicthedOn的BOOL,你會檢查讀取if(switchedOn),這會提高可讀性。

像這樣的東西可能:

- (IBAction)theSwitch:(id)sender { // Not using the sender for anything (?) 
    NSUserDefaults *toggle = [NSUserDefaults standardUserDefaults]; 
    BOOL audioOn = NO; 
    float toggleX = 924.0f; 

    if (_switchIsOn) { 
     toggleX = 985.0f; 
     audioOn = NO; // not strictly necessary but improves readability  
    } 
    else { 
     toggleX = 924.0f; // not strictly necessary but improves readability 
     audioOn = YES; 
    } 

    _switchIsOn = audioOn; 
    [UIView animateWithDuration:0.3 animations:^{ 
     audioToggle.frame = CGRectMake(toggleX, 59.0f, audioToggle.frame.size.width, audioToggle.frame.size.height); 
    }]; 

    [toggle setBool:_switchIsOn forKey:@"toggleState"]; 
    [toggle synchronize]; 
    [[NSUserDefaults standardUserDefaults] setBool:audioOn forKey:@"audioOn"]; // Not being synchronized 
} 

是的,我重構它(和可能出臺一些新的bug)。對不起,不由自主...

+0

謝謝,我剛剛從頭開始計算出來。我之前一直在使用過於複雜的方法來循環瀏覽PNG動畫,因爲我改變了只是在整個屏幕上移動圖像,只用NSUserDefaults就簡單多了。我沒有使用發件人,我一直在慢慢地將它從不需要的地方移開。 –

+0

我會考慮這一點,我知道還有很多清理工作要做,因爲我正在學習更多,我看到更多需要更改或優化的代碼。 –

相關問題