- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我看过 iOS 的 iCloud 文档示例代码,我用它来同步 uidocument往返于 iCloud,现在我正在尝试将 iCloud 与 nsdocument 同步在没有 UIDocument
的 Mac OSX 应用程序上。
我试图将 UIDocument
更改为 NSDocument
但所有与 icloud 同步的方法是不同的。除了来自 apple 的文档外,我没有找到任何示例代码或教程。这是非常困惑的,写得不好。
例如,iOS 上的 UIDocument
中的以下方法在 OS X 上的 NSDocument
中不存在:
//doc is an instance of subclassed UIDocument
[doc openWithCompletionHandler:nil];
Apple 文档为 OS X 提供了以下代码:
- (void)checkIfCloudAvaliable {
NSURL *ubiquityContainerURL = [[[NSFileManager defaultManager]
URLForUbiquityContainerIdentifier:nil]
URLByAppendingPathComponent:@"Documents"];
if (ubiquityContainerURL == nil) {
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
NSLocalizedString(@"iCloud does not appear to be configured.", @""),
NSLocalizedFailureReasonErrorKey, nil];
NSError *error = [NSError errorWithDomain:@"Application" code:404
userInfo:dict];
[self presentError:error modalForWindow:[self windowForSheet] delegate:nil
didPresentSelector:NULL contextInfo:NULL];
return;
}
dest = [ubiquityContainerURL URLByAppendingPathComponent:
[[self fileURL] lastPathComponent]];
}
- (void)moveToOrFromCloud {
dispatch_queue_t globalQueue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalQueue, ^(void) {
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSError *error = nil;
// Move the file.
BOOL success = [fileManager setUbiquitous:YES itemAtURL:[self fileURL]
destinationURL:dest error:&error];
dispatch_async(dispatch_get_main_queue(), ^(void) {
if (! success) {
[self presentError:error modalForWindow:[self windowForSheet]
delegate:nil didPresentSelector:NULL contextInfo:NULL];
}
});
});
[self setFileURL:dest];
[self setFileModificationDate:nil];
}
如何在 iOS 和 OS X 之间同步(因为 NSDocument
在 iOS 上不存在,UIDocument
在 OS X 上不存在)?有谁知道我在哪里可以找到 Mac OSX 的示例(NSDocument
同步)?
最佳答案
我设法让它工作了!这是我的子类 nsdocument 的代码OS X 上的文件:
头文件:
#import <Cocoa/Cocoa.h>
#import <Foundation/Foundation.h>
@interface subclassedNSDocument : NSDocument
@property (strong) NSData *myData;
@end
执行文件:
- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
{
BOOL readSuccess = NO;
if (data)
{
readSuccess = YES;
[self setMyData:data];
}
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataModified"
object:self];
return readSuccess;
}
- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{
if (!myData && outError) {
*outError = [NSError errorWithDomain:NSCocoaErrorDomain
code:NSFileWriteUnknownError userInfo:nil];
}
return myData;
}
在 AppDelegate.m 文件中:
#define kFILENAME @"mydocument.dox"
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSURL *ubiq = [[NSFileManager defaultManager]
URLForUbiquityContainerIdentifier:nil];
if (ubiq) {
NSLog(@"iCloud access at %@", ubiq);
// TODO: Load document...
[self loadDocument];
}
else
{
NSLog(@"No iCloud access");
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(dataReloaded:)
name:@"dataModified" object:nil];
}
- (void)update_iCloud
{
NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:kFILENAME];
self.doc.myData = [NSKeyedArchiver archivedDataWithRootObject:[@"Your Data Array or any data", nil]];
[self.doc saveToURL:ubiquitousPackage ofType:@"dox" forSaveOperation:NSSaveOperation error:nil];
}
- (void)loadData:(NSMetadataQuery *)query {
if ([query resultCount] == 1) {
NSMetadataItem *item = [query resultAtIndex:0];
NSURL *url = [item valueForAttribute:NSMetadataItemURLKey];
NSLog(@"url = %@",url);
subclassedNSDocument *doc = [[subclassedNSDocument alloc] initWithContentsOfURL:url ofType:@"dox" error:nil];
[doc setFileURL:url];
self.doc = doc;
}
else {
NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:kFILENAME];
dataUrls *doc = [[dataUrls alloc] init];
[self.doc setFileURL:ubiquitousPackage];
self.doc = doc;
[self.doc saveToURL:ubiquitousPackage ofType:@"dox" forSaveOperation:NSSaveOperation error:nil];
}
}
- (void)queryDidFinishGathering:(NSNotification *)notification {
NSMetadataQuery *query = [notification object];
[query disableUpdates];
[query stopQuery];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSMetadataQueryDidFinishGatheringNotification
object:query];
_query = nil;
[self loadData:query];
}
- (void)loadDocument {
NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
_query = query;
[query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
NSPredicate *pred = [NSPredicate predicateWithFormat: @"%K == %@", NSMetadataItemFSNameKey, kFILENAME];
[query setPredicate:pred];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:query];
[query startQuery];
}
- (void)dataReloaded:(NSNotification *)notification
{
self.doc = notification.object;
NSArray *arrFromCloud = [NSKeyedUnarchiver unarchiveObjectWithData:self.doc.myData];
//Update you UI with new data
}
我唯一没有工作的是,如果我在 iPad 上更改文档的数据,Mac 应用程序不会调用 readFromData
方法从 iCloud 更新,有谁知道我错过了什么?
在 iOS 上,等效方法 loadFromContents
会在 iCloud 中的 UIDocument
每次更改时自动调用。在 OS X 上,readFromData
在加载时被调用一次,但再也不会被调用。
希望我的代码能有所帮助,对我来说它是从 Mac 到 iPad 的一种工作方式。
关于objective-c - 如何使用 iCloud 将 NSDocument 从 Mac osx 同步到 iPad/iPhone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9032901/
我喜欢 NSDocument,因为当与核心数据模型结合使用时,它可以免费为我提供具有持久数据的应用程序。但我知道,对于我的特定项目,我只会处理一份“文档”。我不需要文档架构堆栈附带的多文档支持。我仍然
当基于文档的应用程序处于事件状态并且没有打开的窗口时,会自动创建一个新的文档窗口。我想防止这种行为并显示我的“选择模板”对话框,而不是默认创建空白文档。 正如您在屏幕截图中看到的,新文档是在 NSAp
文件的保存和打开效果非常好,但是当选择“恢复到保存”时,在窗口的右侧(以前的文档)一眨眼,我的文档版本就出现了,然后只是空白副本。如果我从这个废话中恢复,副本注释会被更改,但如果我保存并重新打开文档,
我正在创建我的第一个基于 NSDocument 的应用程序。我可以从头开始创建新文档,也可以通过导入旧文件来创建新文档。 这个应用程序将允许每个文档有多个窗口,因此我将覆盖 makeWindowCon
在将 NSObject 添加到 mainmenu.xib 后,我可以使用 [NSApp delegate] 访问应用程序范围的委托(delegate)实例,并设置对象的名称更改为我的 appDeleg
我发现我的基于文档的应用程序的架构存在一个主要问题。基本上是将模型(一个简单的字符串)存储在一个全局变量中,每次字段中的文本发生变化时。我让文档将此字符串保存为数据,并使用此数据恢复重新打开的文件。
我有一个基于 NSDocument 的应用程序,我希望在重新打开文档时保存和恢复我的窗口位置。 Apple 关于此的文档非常少,但我能够拼凑的是,在某些时候,应用程序中的某些内容需要调用 NSWind
我正在用 Swift 编写一个基于 NSDocument 的应用程序。如果应用程序未使用文档参数启动,我已将其设置为打开默认文档。 我注意到,如果我启动该应用程序然后立即打开另一个文档,比如使用“打开
我需要在控制文档 View 的 NSViewController 方法中以编程方式保存基于 NSDocument 的应用程序的事件文档。菜单项通过将 save() 发送给第一响应者来完成此操作。以编程
我有一个基于 NSDocument 的 Cocoa 应用程序,我有几个辅助线程,当用户关闭文档窗口或应用程序退出时,我需要正常终止它们(等待它们运行完当前循环)。我正在使用 canCloseDocum
搜索这篇文章的标题会发现它很常见;确实,我从 Xcode 得到了这个错误。但我似乎找不到任何修复方法。我现在在运行我的程序时看到它,它似乎发生在调用 changeCountTokenForSaveOp
我正在尝试实现保存功能来保存 html 文件。目前,当我尝试保存时它会返回错误。我的代码是 - (BOOL)writeToURL:(NSURL *)absoluteURL ofType:(NSStri
我的基于文档的应用程序存在内存泄漏。它启动正常,我可以打开或创建新文档,但只能打开一两次,然后应用程序崩溃。我在 Xcode 中使用了分析工具,没有任何问题。 但是,Instruments 揭示了内存
我正在开发一个基本的hello world应用程序,它将打开一个txt文档,编辑它,然后最后保存 文档。处理编辑的最佳实践是什么。 我已经通读了 Apple 的文档,但是当我检查 NSError **
我是一名尝试 Web 浏览器应用程序的新手,正在尝试使用带有 NSDocument 架构的 WebKit(如某些 WebKit 引用代码)。我让它打开一个预先设置的主页,然后将当前 URL 发布到相邻
在其文档中,我的应用程序使用了许多与文档路径相关的资源。因此,在添加 Assets 之前必须保存文档。如何强制调用 [NSDocument saveDocumentAs] ? 我设法完成了其中的一部分
如何正确检索与文档窗口关联的 NSDocument?我需要 NSDocument 作为数据源来在窗口中显示数据。 我是否必须遍历所有打开的文档并检查我的实例是否等于文档的 -windowForShee
我创建了一个基于文档的应用程序,需要打开具有特定扩展名的 xml 文本文件。当我使用 NSDocument 模板在 Xcode 中创建项目时,我指定了所需的扩展名,并且一切正常。 按照 Apple 关
我有一个 NSDocument 类,我需要在其中访问主菜单窗口,即应用程序启动时打开的主菜单窗口。当我从应用程序在该窗口中操作时,一切似乎都正常,但是当尝试从 readFromFileWrapper:
我刚刚开始进行单元测试,我想知道如何正确测试 NSDocument 子类? 在我的测试设置中,我可以初始化文档,但这并不能反射(reflect)文档在应用程序使用时的设置方式,特别是未建立 IBOut
我是一名优秀的程序员,十分优秀!