2015-06-09 84 views
1

我爲滑塊在界面構建器中設置的「當前值」默認值似乎完全被忽略,當我運行該應用程序時,滑塊從我上次運行應用程序時最後一次設置的位置開始。如何以編程方式創建默認滑塊值?

我希望滑塊從其默認值開始,並且在切換到另一個視圖之前調用它們最後一次的位置。

這裏是允許的代碼要保存的滑塊值:

- (void)viewWillAppear:(BOOL)animated{ 
    [_firstSlider setValue:[[NSUserDefaults standardUserDefaults] floatForKey:@"firstSliderValue"]]; 
} 

- (IBAction)firstSliderValueChange:(id)sender { 
    [[NSUserDefaults standardUserDefaults] setFloat:[_firstSlider value] forKey:@"firstSliderValue"]; 
} 

謝謝

viewController.m!

+0

這是沒有意義的。滑塊如何同時具有其默認值和其保存的值? –

+0

爲了澄清,我想在運行應用程序的開始時初始化一個「默認值」,所以滑塊總是以「0」開始,但在切換視圖之後也保留它們的值。上面的代碼完成了後面的問題,但現在我不知道如何初始化應用第一次打開時的值。 – PlateReverb

+0

我的代碼基於這個問題的解決方案:http://stackoverflow.com/questions/24170781/maintaining-slider-position-in-xcode-when-switching-views – PlateReverb

回答

0

不要使用NSUserDefaults來存儲視圖之間的值。這不是它的目的。只需將滑塊值從一個視圖傳遞到另一個視圖。您可能需要在-prepareForSegue:sender:中執行此操作。

當你想保存和恢復應用程序的新啓動之間的值時使用NSUserDefaults。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"ShowAnotherSlider"]) { 
     DBAnotherViewController *destinationViewController = (DBAnotherViewController *)segue.destinationViewController; 
     destinationViewController.sliderStartValue = self.slider.value; 
    } 
} 

請注意,我正在設置目標視圖控制器的屬性,而不是直接設置滑塊值。

@property (nonatomic, strong) CGFloat sliderStartValue; 

此時目標視圖控制器的視圖可能未加載,所以slider屬性爲零。改爲設置這個其他屬性,然後當視圖被加載時(-viewDidLoad),您可以使用該值更新滑塊。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.slider.value = self.sliderStartValue; 
} 
+0

感謝您的信息。我是一個初學者,並根據這個問題給出的解決方案的基礎上我的代碼(http://stackoverflow.com/questions/24170781/maintaining-slider-position-in-xcode-when-switching-views)。你介意給我一些我可能放在'-prepareForSegue:sender:'中的代碼來完成這個任務嗎? – PlateReverb

+0

除了這種方式你會增加不必要的複雜性。您需要公開該屬性,並在使用滑塊回到ViewController之前傳遞用戶可能經歷的每個ViewController中的正確值。這會產生一些問題,例如不知道sliderStartValue屬性是否已設置並設置了不正確的初始滑塊值。 – psobko

0

只需刪除對象的關鍵,當應用程序被再次啓動:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"firstSliderValue"]; 

爲此,您可以在AppDelegate中或任何其他地方是有道理的。

+0

不會的。但這將是糟糕的代碼。不要解決新問題的問題。 –

+0

它確實有效!其實,'[[NSUserDefaults standardUserDefaults] setFloat:0.05 forKey:@「firstSliderValue」];'基本上是我在找的東西。我意識到這不是解決問題的最好方法,但它現在起作用。如果有人能夠展示更好的解決方案的例子,那會很好。 – PlateReverb

+0

是的,這不是理想的解決方案,但我認爲有人提供了一個答案,顯示原始解決方案無法正常工作的原因。最好的解決方法是創建一個模型對象,將其中的「whateverSliderValueRepresents」作爲屬性,並從任何視圖控制器和其他類需要它的地方訪問它。你可以創建一個全局變量並通過你的AppDelegate或共享實例來訪問它(https://www.cocoanetics.com/2009/05/the-death-of-global-variables/)。 – psobko

0

正如Dave Batton所說,NSUserDefaults是默認應用程序的新發布。如果我正確地理解了你的問題,在我看來,你正在覆蓋firstSliderValueChange中的默認值。這就是爲什麼會發生這種情況:

滑塊從我上次運行應用程序時最後一次設置的位置開始。

要麼分別存儲您的默認值和應用內值,要麼在視圖之間傳遞它們。

編輯: 您在下面的評論中提到的代碼沒有通過值。它堅持價值觀。

問題:假設您最初設置的滑塊值默認爲0.當您第一次運行應用程序時,您會看到滑塊爲0.現在將滑塊移動到5,然後此方法爲所謂:

- (IBAction)firstSliderValueChange:(id)sender { 
    [[NSUserDefaults standardUserDefaults] setFloat:[_firstSlider value] forKey:@"firstSliderValue"]; 
} 

現在的默認值不再是0.這是5和應用程序啓動之間的持續存在,因爲你正在使用NSUserDefaults的。

解決方案:將動態滑塊值保存在其他位置 - 不在NSUserDefaults中。既然你有多個視圖控制器,一個辦法是這樣的:

//viewController.m 
@interface 
@property (strong, nonatomic) IBOutlet UISlider *mySlider; 
@end 

-(void)prepareForSegue: (UIStoryboardSegue *)segue sender:(id)sender { 
if([segue.identifier isEqualToString: @"segueIdentifer"]) { 
    otherViewController *ovc = (otherViewController *)segue.destinationViewController; 
    ovc.dynamicSliderValue = self.mySlider.value; 
    } 
} 

和:

//otherViewController.h 
@interface 
@property(assign) CGFloat dynamicSliderValue; 
@end 

現在,每當你切換回你的第一個視圖控制器的視圖,只需訪問該屬性,並更新滑塊因此。 注 - 我相信還有很多其他方法可以做到這一點!

+0

我基於這個問題的答案我的代碼:http://stackoverflow.com/questions/24170781/maintaining-slider-position-in-xcode-when-switching-views這是唯一的地方,我發現,顯示瞭如何在視圖之間傳遞值。你能否解釋一個更好的方法,讓我保留應用程序打開時的默認值? – PlateReverb

+0

當我切換回第一個控制器視圖時,如何訪問此屬性並更新滑塊的值? – PlateReverb

+0

@PlateReverb擡起頭來放鬆一下。基本上,當您返回到原始視圖控制器時,會自動調用一個自定義方法。在此方法中,使用setValue方法更新滑塊值。 – TheJack

1

只需添加這[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"YourKey"];如@psobko在AppDelegate中說,像:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"YourKey"]; 
    return YES; 
} 
相關問題