【问题标题】:Preloading Documents into iOS App将文档预加载到 iOS 应用程序中
【发布时间】:2012-05-24 21:46:28
【问题描述】:

情况: 我有一个处理文件并让用户保存、编辑、打开和执行这些文件的各种操作的 iOS 应用程序。我希望能够在用户打开应用程序(例如模板)时查看一些预制文档以及他们自己的自定义文档。

问题: 在用户安装并启动我的应用程序后(以及之前的所有时间),我如何创建一个文档(或模板文件)并将其显示在 Documents 文件夹中?

背景: 此文档(将安装到应用程序文档目录中的文档)由我而非用户创建。

我知道要做到这一点,您需要将其保存在您的捆绑包中,然后在您的应用程序第一次运行时将其静默复制到文档目录中。我应该在 appDidFinishLaunchingWithOptions 方法还是在我的 viewDidLoad 方法中复制它并编写逻辑来检测它是否是应用程序第一次运行?

我的代码: 在这个网页上:http://textsnip.com/d35fbc 但是当它运行时,它总是说:“文件不存在[在文档文件夹中]”,然后它告诉我它正在被复制。问题是,当我检查应用程序的文档文件夹时,它从不存在,它仍然在包中。

为什么不复制这段代码 这是如何工作的?

【问题讨论】:

    标签: objective-c ios filesystems


    【解决方案1】:

    这些文件实际上必须添加到应用程序包中,然后在应用程序启动时静默复制。

    以下代码将一个文本文件从我的包的顶层复制到文档目录(如果它尚不存在)。

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    
    NSString *txtPath = [documentsDirectory stringByAppendingPathComponent:@"txtFile.txt"];
    
    if ([fileManager fileExistsAtPath:txtPath] == NO) {
        NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"txtFile" ofType:@"txt"];
        [fileManager copyItemAtPath:resourcePath toPath:txtPath error:&error];
    }
    

    此代码中唯一的缺陷是,如果用户删除了文件,当他们再次打开应用程序时,它会立即重新出现。

    【讨论】:

      【解决方案2】:

      正如您所说,您将其包含在您的应用程序包中(将其添加到您的项目中并确保它是您的目标的一部分)。然后你可以通过调用这样的东西来访问它的路径:

      NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"MyTemplateDoc" 
                                                             ofType:@"extension"];
      

      然后将其复制到应用的文档文件夹中。

      NSString *docPath = <a path in your documents folder>
      NSError *error = nil;
      [[NSFileManager defaultManager] copyItemAtPath:bundlePath 
                                              toPath:docPath 
                                               error:&error];
      if (error) {
          // handle copy error.
      }
      

      【讨论】:

      • 我已将以下代码放入我的 viewDidLoad 方法中,但它从不复制(我什至在我的 Mac 上找到了 iOS 模拟器文件,但它不存在)。这是代码的链接:textsnip.com/d35fbc
      • 当我运行应用程序时,NSLog 行都按预期执行,这告诉我它正在 viewDidLoad 方法中执行。但是你说的目标是什么?如何将其添加到我的 Target?
      • 选择文件并在 XCode 4 右侧(可能需要打开右侧面板)的第一个选项卡中,确保选择了您的目标。
      • 我将 Target Membership 添加到 App 和 App 测试中。我什至用断点测试了复制代码,它没有复制——这可能与 docPath 或 bundlePath 有关吗?
      • 您正在错误地检查错误。您应该检查 copyItemAtPath:… 方法的返回值是 nil 在这种情况下错误参数包含实际错误。
      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 2013-01-23
      • 2015-04-21
      • 2017-04-08
      • 2018-09-04
      • 1970-01-01
      • 2013-12-11
      • 2019-01-20
      相关资源
      最近更新 更多