由于某种原因,这很难找到和解决.找不到任何文档.我有一个非基于文档的应用程序,我想打开所有特定的文件类型,但我不想使用NSDocuments但让我的代码处理文件的打开和处理它.我已经将CFBundleTypeExtensions和所有设置添加到info.plist中.
现在应用程序将打开文件类型,但显示如下错误:"无法打开文档xxxx.应用程序无法以yyyyy格式打开文件."
我试图在他们的工具栏中重新创建像Finder,Safari和Transmission这样漂亮的纹理按钮.首先,我开始只需拖动IB中的"纹理按钮"等.除了用户将工具栏设置为"仅文本"模式时,一切正常.当他点击按钮时,工具栏将自动启用"图标和标签".我已从工具栏中删除alles代码和委托,以确保它不是代码问题.
然后,为了确保,我创建了一个新项目(根本没有代码),我可以用一个带有NSToolbar的干净NSWindow重现这个问题,其中一个NSToolbarItem带有一个NSButton.
通过以下代码添加NSButton:
- (NSArray*)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar {
return [NSArray arrayWithObject:@"myToolbarMenu"];
}
- (NSArray*)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar {
return [self toolbarAllowedItemIdentifiers:toolbar];
}
- (NSToolbarItem*)toolbar:(NSToolbar*)toolbar
itemForItemIdentifier:(NSString*)str
willBeInsertedIntoToolbar:(BOOL)flag
{
if ([str isEqualToString:@"myToolbarItem"] == YES) {
NSToolbarItem* item = [[NSToolbarItem alloc] initWithItemIdentifier:str];
[item setView:[[NSButton alloc] init]];
[item setMinSize:NSMakeSize(50,50)];
[item setMaxSize:NSMakeSize(50,50)];
[item setLabel:@"Text"];
return [item autorelease];
}
return nil;
}
Run Code Online (Sandbox Code Playgroud)
但这也有同样的效果:当我在"仅文本模式"中按下带有NSButton的NSToolbarItem时,工具栏本身会强制它的模式为"图标和文本".
您是否知道如何使其正常工作或者可能有另外一种方法来创建像Safari等一样漂亮的工具栏?
我已经实现了保存applicationWillTerminate和加载applicationWillFinishLoading。有一个完整的对象树,所有对象树都实现了NSCoding协议,并且我已经检查了我输入的类型。
其中一个类还存储NSMutableData了NSKeyedArchive,我怀疑这有时可能会破坏解档。奇怪的是,有时有效,有时无效。我怀疑其中的某些内容NSMutableData会破坏存档。
我对所有对象使用encodeObject,除了 bools 和 int,我在其中使用正确的相应方法 (encodeBool:forKey:和encodeInt:forKey:)
更清楚地说:代码确实有效,有时它能够重建一个相当完整的对象图,但并非总是如此。
我收到的错误消息是:
initForReadingWithData incomprehensible archive 0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30
Run Code Online (Sandbox Code Playgroud)
添加:失败的代码,大小超过NSMutableData10 MB
- (void)encodeWithCoder:(NSCoder*)encoder {
[encoder encodeObject:self.encodedMessage forKey:@"EncodedMessage"]; //NSData
[encoder encodeObject:self.data forKey:@"Data"]; //NSMutableData (10+MB)
[encoder encodeObject:self.header forKey:@"Header"]; //NSString
[encoder encodeObject:self.fileName forKey:@"FileName"]; //NSString
[encoder encodeInt:self.dataStartIndex forKey:@"DataStartIndex"]; //int
[encoder encodeInt:self.dataEndIndex forKey:@"DataEndIndex"]; //int
}
- (id)initWithCoder:(NSCoder*)decoder {
if (self = [super init]) {
self.encodedMessage = …Run Code Online (Sandbox Code Playgroud) 我的应用程序用于lseek()寻找写入数据的所需位置.该文件使用成功打开open()和我的应用程序能够使用lseek()和write()大量的时间.
在给定的时间,对于某些用户而且不易重现,lseek()返回-1,其中errno包含9.文件在此之前未关闭且文件句柄(int)未重置.
在此之后,创建另一个文件; open()再好,lseek()并write()再次工作.
更糟糕的是,这个用户再次尝试了完整的序列,一切都很顺利.
所以我的问题是,操作系统可以出于某种原因为我关闭文件句柄吗?什么可能导致这个?某种文件索引器或文件扫描程序?
解决这个问题的最佳方法是什么; 这个伪代码是最好的解决方案吗?(别介意代码布局,会为它创建函数)
int fd=open(...);
if (fd>-1) {
long result = lseek(fd,....);
if (result == -1 && errno==9) {
close(fd..); //make sure we try to close nicely
fd=open(...);
result = lseek(fd,....);
}
}
Run Code Online (Sandbox Code Playgroud)
有人遇到类似的事吗?
总结:对于给定的fd,文件搜索和写入工作正常,并且在没有理由的情况下突然返回errno = 9.
我有多个视图都可以正常工作但由于某种原因,在键入tab键时视图不会聚焦下一个控件.而是选择当前NSTextField的所有文本.
我忘记了这里真正愚蠢的事情; 谁可以帮我这个事?
所以这是一个包含NSView的NIB.在视图上有两个NSTextField,按下一个选项卡不会前进到下一个,而是选择当前的所有文本.
至少我有点困惑.getaddrinfo()调用'updates'指向addrinfo结构的指针,当我要在相同的范围(该函数)中使用addrinfo时,一切都很好但是如果我将结构复制到另一个(通过分配它)会发生什么.
请帮助我理解正在进行的基础知识(不寻求替代方法的建议).
如果我错了,请纠正我:a)getaddrinfo()需要指向addrinfo的struct-pointer的指针.b)getaddrinfo在当前函数作用域中创建addrinfo结构并更新a)中所需的指针
现在我的真正问题是:我想将addrinfo存储在其他地方.使用分配给另一个指针不会执行深层复制,并且在该函数之后所有指针都变为无效?
最好给出一个非常简单的例子:
void GetAddrInfo(struct addrinfo *update)
{
struct addrinfo *res;
getaddrinfo(xx,xx,xx,&res);
//is this save? After this 'scope' ends all pointed fields are invalid?
//this doesn't copy the linked list ai_next.
*update=*res;
}
Run Code Online (Sandbox Code Playgroud)
直接使用和更新getaddrinfo似乎不起作用,因为问题仍然存在:原始结构在函数范围结束后被销毁.
任何人都可以在这里给我更多的见解(请解释在哪里创建的地方和销毁地点,堆栈,堆欢迎所有信息)
在 Windows 等上,我曾经使用一种技巧来找出当前正在使用的文件(专门编写的)。
我用来打开文件进行写入,如果它失败了,很可能另一个进程正忙于访问它。
遗憾的是,这些技巧(使用带有排他锁的 C OPEN 进行写入)在我的 Mac 上不起作用。虽然我在终端中的 curl 仍在写入我的 -fileBusy() 检查失败。
使用 F_GETLK 对 fd 调用 fcnt 也不会显示任何锁定。
我有没有机会检测一个文件是否正在被另一个进程使用?
Ps> 无法侦听 fsevents,因为我的应用程序在其他应用程序/进程创建之后启动。
objective-c ×5
macos ×4
cocoa ×3
c ×2
xcode ×2
32bit-64bit ×1
archiving ×1
associate ×1
file ×1
file-in-use ×1
file-io ×1
file-type ×1
handle ×1
heap ×1
networking ×1
nscoding ×1
nstoolbar ×1
seek ×1
stack ×1
struct ×1