小编Ger*_*nis的帖子

将文件类型/扩展名与基于非文档的cocoa应用程序相关联

由于某种原因,这很难找到和解决.找不到任何文档.我有一个非基于文档的应用程序,我想打开所有特定的文件类型,但我不想使用NSDocuments但让我的代码处理文件的打开和处理它.我已经将CFBundleTypeExtensions和所有设置添加到info.plist中.

现在应用程序将打开文件类型,但显示如下错误:"无法打开文档xxxx.应用程序无法以yyyyy格式打开文件."

macos xcode file-type objective-c associate

10
推荐指数
1
解决办法
3973
查看次数

NSToolbarItem(setView)中的NSButton单击"仅文本"时强制模式为"图标和标签"

我试图在他们的工具栏中重新创建像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等一样漂亮的工具栏?

cocoa interface-builder nstoolbar nstoolbaritem

7
推荐指数
1
解决办法
3604
查看次数

存档/取消存档导致 initForReadingWithData 无法理解存档

我已经实现了保存applicationWillTerminate和加载applicationWillFinishLoading。有一个完整的对象树,所有对象树都实现了NSCoding协议,并且我已经检查了我输入的类型。

其中一个类还存储NSMutableDataNSKeyedArchive,我怀疑这有时可能会破坏解档。奇怪的是,有时有效,有时无效。我怀疑其中的某些内容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)

macos xcode objective-c archiving nscoding

5
推荐指数
2
解决办法
4986
查看次数

lseek/write突然返回-1,errno = 9(错误的文件描述符)

我的应用程序用于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.

c file-io handle seek

5
推荐指数
2
解决办法
2万
查看次数

按NSTextField中的选项卡选择所有文本而不是转到下一个控件

我有多个视图都可以正常工作但由于某种原因,在键入tab键时视图不会聚焦下一个控件.而是选择当前NSTextField的所有文本.

我忘记了这里真正愚蠢的事情; 谁可以帮我这个事?

所以这是一个包含NSView的NIB.在视图上有两个NSTextField,按下一个选项卡不会前进到下一个,而是选择当前的所有文本.

cocoa objective-c interface-builder

4
推荐指数
1
解决办法
1588
查看次数

在Objective C(Mac OS X)中检测CPU架构(32位/ 64位)运行时

我正在拧一个Cocoa应用程序,它需要执行一些针对32位和64位优化的(控制台)应用程序.因此,我想检测运行应用程序的CPU架构,以便启动正确的控制台应用程序.

简而言之:如何检测应用程序是否在64位操作系统上运行?

编辑:我知道Mach-O胖二进制文件,这不是我的问题.我需要知道这一点,所以我可以启动另一个非捆绑(控制台)应用程序.一个针对x86进行了优化,另一个针对x64进行了优化.

macos objective-c cpu-architecture 32bit-64bit

3
推荐指数
2
解决办法
7549
查看次数

getaddrinfo addrinfo导致堆栈或堆

至少我有点困惑.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似乎不起作用,因为问题仍然存在:原始结构在函数范围结束后被销毁.

任何人都可以在这里给我更多的见解(请解释在哪里创建的地方和销毁地点,堆栈,堆欢迎所有信息)

c heap networking stack struct

3
推荐指数
1
解决办法
1607
查看次数

检测其他进程正在使用的文件

在 Windows 等上,我曾经使用一种技巧来找出当前正在使用的文件(专门编写的)。

我用来打开文件进行写入,如果它失败了,很可能另一个进程正忙于访问它。

遗憾的是,这些技巧(使用带有排他锁的 C OPEN 进行写入)在我的 Mac 上不起作用。虽然我在终端中的 curl 仍在写入我的 -fileBusy() 检查失败。

使用 F_GETLK 对 fd 调用 fcnt 也不会显示任何锁定。

我有没有机会检测一个文件是否正在被另一个进程使用?

Ps> 无法侦听 fsevents,因为我的应用程序在其他应用程序/进程创建之后启动。

macos cocoa file objective-c file-in-use

3
推荐指数
1
解决办法
2266
查看次数