objective-c – 永远不会调用NSFilePresenter方法

objective-c – 永远不会调用NSFilePresenter方法,第1张

概述我正在尝试编写一个简单的(玩具)程序,它使用NSFilePresenter和NSFileCoordinator方法来监视文件的变化. 该程序包含一个文本视图,用于加载(硬编码)文本文件和一个按钮,该文件将保存文件并进行任何更改.我的想法是我有两个实例正在运行,并且在一个实例中保存将导致另一个实例重新加载已更改的文件. 加载和保存文件工作正常,但从不调用NSFilePresenter方法.它都基于一 @H_502_2@ 我正在尝试编写一个简单的(玩具)程序,它使用NSfilePresenter和NSfileCoordinator方法来监视文件的变化.

该程序包含一个文本视图,用于加载(硬编码)文本文件和一个按钮,该文件将保存文件并进行任何更改.我的想法是我有两个实例正在运行,并且在一个实例中保存将导致另一个实例重新加载已更改的文件.

加载和保存文件工作正常,但从不调用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方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1004859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存