Objective c 使用10.9打开模式表

Objective c 使用10.9打开模式表,objective-c,cocoa,modal-dialog,Objective C,Cocoa,Modal Dialog,我有一个应用程序,使用多个模式表进行数据输入。打开模式表的方法工作得很好,而且仍然工作得很好,但它们已经被弃用,我担心它们很快将无法用于Xcode的未来版本 但是随着Xcode 5.1的发布,他们发现loadNibNamed方法已经被弃用,我们应该使用一个类似的函数来引用顶级对象 我遇到的问题是改变这一点: [NSBundle loadNibNamed:@"OrderDetailsWindow" owner:self]; 这件事 NSArray *array; [[NSBundle mainB

我有一个应用程序,使用多个模式表进行数据输入。打开模式表的方法工作得很好,而且仍然工作得很好,但它们已经被弃用,我担心它们很快将无法用于Xcode的未来版本

但是随着Xcode 5.1的发布,他们发现loadNibNamed方法已经被弃用,我们应该使用一个类似的函数来引用顶级对象

我遇到的问题是改变这一点:

[NSBundle loadNibNamed:@"OrderDetailsWindow" owner:self];
这件事

NSArray *array;
[[NSBundle mainBundle]loadNibNamed:@"OrderDetailsWindow" owner:self topLevelObjects:&array]; 
这个方法调用实际上打开了模式表。然而,在我打开模式表的方法结束时,Xcode挂断了这个错误

0x7fff8c33b097:  andl   24(%r11), %r10d    Thread1: EXC_BAD_ACCESS (code:EXC_I386_GPFLT)

我不确定这告诉我什么。它没有给我调试区域的任何信息。这可能与topLevelObjects数组未正确释放有关吗?关于如何使这项工作更顺利一点有什么想法吗?苹果过时的图书馆快把我逼疯了

是的,苹果的文档很乱。“工作表编程主题”文档自2009年以来未更新

更改后您没有显示完整的代码,但我猜您的问题在于NIB对象的内存管理

从新的
loadNibNamed:owner:topLevelObjects:

与传统方法不同,对象遵循标准的cocoa内存 管理规则;有必要对它们进行强有力的引用 通过使用IBOutlets或保留对数组的引用来防止 取消分配nib内容

顶级对象的出口应该是对 展示所有权并防止解除分配

您有一个NSArray,它在您的方法中保存顶级对象。一旦执行离开此方法,NSArray将被解除并释放,如果您的所有顶级对象在其他地方没有被强烈引用,那么它们也是如此

您需要将NIB中的顶级对象连接到窗口控制器中的出口,或者将NSArray保留为窗口控制器实例的成员变量,以便在显示方法的工作表退出后不会释放它。并确保myCustomSheet正确声明并从工作表的NIB连接


另外,
[NSApp beginSheet::
也不推荐使用,您现在可以调用。

我总是使用带有自定义委托的
NSWindowController
子类来处理我的工作表:

从要显示图纸的窗口:

_myModalController = [[MyModalController alloc] init];
_myModalController.delegate = self;
[_myModalController beginSheet:self.window];
然后在模态窗口控制器中,我有:

- (id)init {
    self = [super initWithWindowNibName:@"MyModalWindow" owner:self];
    return self;
}

- (void)beginSheet:(NSWindow *)mainWindow {
    [NSApp beginSheet:[self window]
       modalForWindow:mainWindow
        modalDelegate:self
       didEndSelector:@selector(_didEndSheet:returnCode:contextInfo:)
          contextInfo:nil];
}

- (void)endSheet:(NSWindow *)mainWindow {
    [NSApp endSheet:[self window]];
    [[self window] orderOut:mainWindow];
}

这似乎避免了
loadNibNamed:
被弃用的整个问题。

您使用的是Xcode 5.1?如果您使用的是Xcode 5.1,那么您必须在Apple工作。我们其余的人都在使用Xcode 5.0.1。仅供参考-您的问题与Xcode无关。任何不推荐的内容都与Cocoa框架的API版本有关。看看最近的问题,您可能也有同样的问题。请参考此链接Lol。。不,我没有5.1。我的打字错误。我有5.0.1。也我看了这两个例子,并尝试合并一些建议,但我仍然有相同的问题。我认为问题可能与纸张所有权有关。模态表完全在它们自己的类中运行。单击主窗口上的按钮(或在某些区域双击)时,将触发模式工作表以打开。并非所有loadNibNamed表单都已弃用,需要使用当前表单。[NSApp开始页]和[NSApp结束页]从10起不再推荐使用。9@danielv嗯,我没看到。虽然没有来自Xcode的警告(但是我的MinMacOSX版本是10.7,所以可能这就是原因)。我想知道我使用的其他什么已经被弃用了…@danielv是的,我使用的是10.9 SDK。更糟糕的是,我需要将现有方法保留10.{7,8},而将新方法保留10.9+。我想这些方法还没有“正式”弃用。来自NSApplication.h:“这些方法在10.9中已被弃用,并将在下一版本中正式弃用。”。似乎“未正式”被弃用意味着没有警告?@danielv是的,我认为这不会是一个问题;该委托方法几乎不做任何事情,因此代码不会很复杂。谢谢你的帮助-感觉是我问的问题;-)反应很好。我想这正是我面临的问题。我会把它弄得乱七八糟,看看能不能让它工作。
- (id)init {
    self = [super initWithWindowNibName:@"MyModalWindow" owner:self];
    return self;
}

- (void)beginSheet:(NSWindow *)mainWindow {
    [NSApp beginSheet:[self window]
       modalForWindow:mainWindow
        modalDelegate:self
       didEndSelector:@selector(_didEndSheet:returnCode:contextInfo:)
          contextInfo:nil];
}

- (void)endSheet:(NSWindow *)mainWindow {
    [NSApp endSheet:[self window]];
    [[self window] orderOut:mainWindow];
}