2014-06-16 72 views
5

我需要在我的iOS自定義鍵盤中將數據保存到NSUserDefault。 我已經在開發者門戶網站成功創建了應用組和權利,並且XCodeNSUserDefault無法在iOS8中保存並加載擴展名

這是我如何保存我的價值與UISwitch

- (IBAction)switchAction:(id)sender 
{ 
    [self.defaults setBool:self.myKey.on forKey:@"myValue"]; 

    [self.defaults synchronize]; 
} 

,這裏是我如何KeyboardView負荷值。

self.defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.mycompany.customkeyboard"]; 

if([self.defaults boolForKey:@"myValue"]) 
{ 
    self.backgroundColor = [UIColor redColor]; 
} 

else 
{ 
    self.backgroundColor = [UIColor blackColor]; 
} 

這是行不通的,不會加載值。

如何保存和加載數據?

+0

[應用程序組與應用程序之間的數據通信和持久化](http://stackoverflow.com/questions/24015506/communicating-and-persisting-data-between-apps-with-app-groups) –

+0

否我已經發現了這些問題。我的問題是我不知道如何從NSUserDefault加載數據。 –

+0

我指的是[我對該問題的回答](http://stackoverflow.com/a/24063144/2446155),我稍微修改並在下面進行了複製。 –

回答

4

初始化您NSUserDefaults對象這樣的應用程序組中的所有應用程序,他們將共享數據庫:

[[NSUserDefaults alloc] initWithSuiteName:@"group identifier"]; 

記住一切從[NSUserDefaults standardUserDefaults]數據庫中的每個應用程序將不會延續到這個數據庫中。

documentation indicates[NSUserDefaults standardUserDefaults]應該像上面的代碼一樣返回共享數據庫,但它不會。我將此作爲bug提交(rdar:// 17164758)。

而且不要忘了同步數據庫:

[yourDefaults synchronize]; 
+0

是的,我喜歡你說的,它沒有正確加載。在這裏我的代碼。 self.defaults = [[NSUserDefaults alloc] initWithSuiteName:@「」]; ([self.defaults boolForKey:@「myValue」]) self.backgroundColor = [UIColor redColor]; } else { self.backgroundColor = [UIColor blackColor]; } –

+0

@Sabo數據庫開始爲空,因此在設置任何值之前,您必須調用您的'switchAction:'方法。還要確保您的應用組在您的授權文件,開發者門戶應用ID,供應配置文件和Xcode中正確設置。 –

+0

我的SwitchAction是UISwitch的連接事件,當UISwitch打開時,我將值保存到NSUserDefault。但是我無法在KeyboardView中加載該數據。 :( –

0

你可以從包含應用程序加載正確的數據,所以可能設置擴展應用新的值會有所幫助。

[self.defaults setObject:newValue forKey:@"thisKeyIsJustUsedForSyn"] 

然後加載正確的數據。

2

好吧,所以我看了一下,因爲我有確切的問題。我所做的工作就是將主應用程序和擴展程序添加到一個組中,轉到主項目 - >目標 - >功能,然後創建一個組(如果您還沒有,或者無論如何),如下所示:

enter image description here

然後,轉到目標(E)以下的擴展,再能力和擴展添加到組(完全按照你做的主要目標相同的應用程序組),像這樣:

enter image description here

然後,一旦你做了兩個,在你的主應用程序,只要你想添加的東西,創建一個NSUserDefaults的新實例,但是對於Suitename來說,它等於你之前做的groupname。就像這樣:

NSArray *testing = @[@"first",@"Second",@"Third"]; 
NSUserDefaults *userd = [[NSUserDefaults alloc]initWithSuiteName:@"The gouprname I made earlier"];//This is exactly the same as the groupname 
[userd setObject:testing forKey:@"ExtensionArray"];//set the object you want to share 
[userd synchronize]; //It's a good idea to sync, just to be on the safe side. 

在您的擴展視圖控制器,使用相同的組名,但是讀取用戶的默認值:

NSUserDefaults *sharedD=[[NSUserDefaults alloc]initWithSuiteName:@"Exactly the same groupname that I gave both in the Capabilities and when initialising the userdefault"]; 
self.testing = [[NSArray alloc]initWithArray:[sharedD arrayForKey:@"ExtensionArray"]]; 

,瞧!陣列在那裏!我讀過一些地方,甚至可以使用Wormhole類爲對象更改時添加通知功能,但我無法找到指向它的鏈接。我敢肯定,如果你是谷歌Wormhole類,你會遇到它。

我希望我能幫上忙,如果您發現更多信息,請與我分享。