通过在iOS应用程序中使用On-Off开关或类似于Pages.App启用iCloud功能

时间:2014-07-31 14:34:35

标签: ios uiviewcontroller uitabbarcontroller icloud

我在App Store中有一个完全构建的基于Core Data的应用程序,并且正在进行更新,我正在为应用程序带来iCloud同步功能。这将是用户启用而不是立即启用它的选项。

我有UITabBarController,在第5个标签中,我有一个设置窗格,其中一个选项是通过使用Switch打开或关闭iCloud同步。

我不确定的是如何启用这样的内容,因为SettingsViewController(第五个标签页)需要与AppDelegate进行实质性的对话才能调用此内容。

persistentStoreCoordinator中的AppDelegate位于以下位置:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Lite.sqlite"];

    NSError *error = nil;

    NSURL *cloudURL = [self grabCloudPath:@"iCloud"];

    NSDictionary *options = nil;
    if ([[NSUserDefaults standardUserDefaults]boolForKey:@"OnLatestVersion"]) {
        options = @{                                       NSMigratePersistentStoresAutomaticallyOption : @YES,
                                                           NSInferMappingModelAutomaticallyOption : @YES,
                                                           NSPersistentStoreUbiquitousContentURLKey: cloudURL, NSPersistentStoreUbiquitousContentNameKey: @"LiteCloud"};
        NSLog(@"Using iCloud from migration");
    }
    else
    {
        NSLog(@"Using the other store without the iCloud Migration");
        options = @{                                       NSMigratePersistentStoresAutomaticallyOption : @YES,
                                                           NSInferMappingModelAutomaticallyOption : @YES};
    }

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }


    return _persistentStoreCoordinator;
}

与此问题无关为什么persistentStore就是这样,但实质上,我想确保在SettingsViewController中,当用户打开iCloud开关时,它会调用iCloud同步。

我看过很多关于关闭iCloud的帖子,但从来没有人谈过如何做到这一点,等等。

修改:小更新

通过一些思考,或许我可以这样做:

  • 从AppDelegate的applicationDidFinishLaunchingWithOptions方法中取出storeWill和storesDidChange通知,并将它们放入单独的方法中
  • 在applicationDidFinishLaunchingWithOptions
  • 中设置通知监听器(自定义通知)
  • 此自定义通知会在调用
  • 时触发这些方法
  • 在SettingsVC中,在Switch
  • 中启用iCloud时调用自定义通知
  • 让它在AppDelegate
  • 中执行所需的操作

这是对的吗?理论上我理解,如果是这种情况,但只是不确定如何最好地实现这一点。

如果这一切都是正确的,那么下面的内容将适用于applicationDidFinishLaunchingWithOptions

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(reloadFetchedResults:)
                                             name:@"SomethingChanged"
                                           object:[[UIApplication sharedApplication] delegate]];

如何实现这样的目标呢?任何想法将不胜感激。

1 个答案:

答案 0 :(得分:0)

设置NSUserDefaults密钥,然后使用NSNotification检查该密钥应该可以正常工作。在设置视图中,当翻转开关时,您在NSUserDefaults中更改BOOL值,然后在appDelegate中调用NSNotification以根据更改的NSUserDefaults值进行更新。在applicationDidFinishLaunchingWithOptions中,就像你说的那样:

[[NSNotificationCenter defaultCenter] addObserver:self
                                     selector:@selector(reloadFetchedResults)
                                         name:@"SomethingChanged"
                                       object:nil];

并且在reloadFetchedResults中,您可以检查在设置视图中设置的NSUserDefaults中的密钥。在NSUserDefaults中更改密钥后立即在设置视图中调用[[NSNotificationCenter defaultCenter] postNotification: @"SomethingChanged"];