该程序包含一个文本视图,用于加载(硬编码)文本文件和一个按钮,该文件将保存文件并进行任何更改.我的想法是我有两个实例正在运行,并且在一个实例中保存将导致另一个实例重新加载已更改的文件.
加载和保存文件工作正常,但从不调用NSfilePresenter方法.它都基于一个名为fileManager的类,它实现了NSfilePresenter协议.代码如下:
接口:
@interface fileManager : NSObject <NSfilePresenter>@property (unsafe_unretained) IBOutlet NSTextVIEw *textVIEw;- (voID) savefile;- (voID) reloadfile;@end
执行:
@implementation fileManager{ NSOperationQueue* queue; NSURL* fileURL;}- (ID) init { self = [super init]; if (self) { self->queue = [NSOperationQueue new]; self->fileURL = [NSURL URLWithString:@"/Users/Jonathan/file.txt"]; [NSfileCoordinator addfilePresenter:self]; } return self;}- (NSURL*) presentedItemURL { NSLog(@"presentedItemURL"); return self->fileURL;}- (NSOperationQueue*) presentedItemOperationQueue { NSLog(@"presentedItemOperationQueue"); return self->queue;}- (voID) savefile { NSfileCoordinator* coordinator = [[NSfileCoordinator alloc] initWithfilePresenter:self]; NSError* error; [coordinator coordinateWritingItemAtURL:self->fileURL options:NSfileCoordinatorWritingForMerging error:&error byAccessor:^(NSURL* url) { Nsstring* content = [self.textVIEw string]; [content writetofile:[url path] atomically:YES enCoding:NSUTF8StringEnCoding error:NulL]; }];}- (voID) reloadfile { NSfileManager* fileManager = [NSfileManager defaultManager]; NSfileCoordinator* coordinator = [[NSfileCoordinator alloc] initWithfilePresenter:self]; NSError* error; __block NSData* content; [coordinator coordinateReadingItemAtURL:self->fileURL options:0 error:&error byAccessor:^(NSURL* url) { if ([fileManager fileExistsAtPath:[url path]]) { content = [fileManager contentsAtPath:[url path]]; } }]; dispatch_async(dispatch_get_main_queue(),^{ [self.textVIEw setString:[[Nsstring alloc] initWithData:content enCoding:NSUTF8StringEnCoding]]; });}// After this I implement *every* method in the NSfilePresenter protocol. Each one// simply logs its method name (so I can see it has been called) and calls reloadfile// (not the correct implementation for all of them I kNow,but good enough for Now).@end
注意,在applicationDIDFinishLaunching中调用reloadfile,每次单击保存按钮时都会调用savefile(通过app delegate).
唯一被调用的NSfilePresenter方法(由日志进行)是presentsItemURL(在程序启动时调用四次并在加载文件时调用四次,单击save时调用三次.在第二次实例中单击save对此没有明显影响第一个例子.
谁能告诉我这里我做错了什么?
解决方法 很长一段时间我一直在努力解决这个问题.对我来说,唯一可以调用的方法是-presentedSubitemDIDChangeAtURL :(我正在监视目录而不是文件).我向Apple提出了一个技术支持问题,他们的回答是这是一个错误,我们现在唯一能做的就是通过-sentsentSubitemDIDChangeAtURL做一切:如果你正在监视一个目录.不确定在监视文件时可以做些什么.我鼓励任何遇到此问题的人提交错误(https://bugreport.apple.com)以鼓励Apple尽快修复此问题.
@H_502_2@ 总结以上是内存溢出为你收集整理的objective-c – 永远不会调用NSFilePresenter方法全部内容,希望文章能够帮你解决objective-c – 永远不会调用NSFilePresenter方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)