0

我一直在使用 MacRuby,并阅读了 Matt Aimonetti 所著的 MacRuby: The Definitive Guide 一书。

Movies CoreData 应用程序示例中,我有以下代码:

def add_image(sender)
    movie = movies.selectedObjects.lastObject
    return unless movie
    image_panel = NSOpenPanel.openPanel
    image_panel.canChooseDirectories = false
    image_panel.canCreateDirectories = false
    image_panel.allowsMultipleSelection = false

    image_panel.beginSheetModalForWindow(sender.window, completionHandler: Proc.new{|result|
        return if (result == NSCancelButton)
        path = image_panel.filename
        # use a GUID to avoid conflicts
        guid = NSProcessInfo.processInfo.globallyUniqueString
        # set the destination path in the support folder
        dest_path = applicationFilesDirectory.URLByAppendingPathComponent(guid)
        dest_path = dest_path.relativePath
        error = Pointer.new(:id)
        NSFileManager.defaultManager.copyItemAtPath(path, toPath:dest_path, error:error)
        NSApplication.sharedApplication.presentError(error[0]) if error[0]
        movie.setValue(dest_path, forKey:"imagePath")
    })
end

该应用程序加载正常并且运行正常 - 我可以在 CoreData 中创建新电影并删除它们等。但是,当我单击调用此函数的按钮时,它会很好地打开对话框窗口,但是“取消”或“打开文件” " 按钮在这里导致崩溃:

#import <Cocoa/Cocoa.h>

#import <MacRuby/MacRuby.h>

int main(int argc, char *argv[])
{
    return macruby_main("rb_main.rb", argc, argv); << Thread 1: Program received signal EXC_BAD_ACCESS
}

任何帮助表示赞赏。我认为它与 BridgeSupport 有关,但嵌入不起作用或我尝试这样做不起作用。无论哪种方式,其他东西似乎很无聊,因为本书提供的示例也崩溃了。

谢谢!

补充说明:

我去 macruby.org 测试了这段代码,它运行良好:

def browse(sender)
  # Create the File Open Dialog class.
  dialog = NSOpenPanel.openPanel
  # Disable the selection of files in the dialog.
  dialog.canChooseFiles = false
  # Enable the selection of directories in the dialog.
  dialog.canChooseDirectories = true
  # Disable the selection of multiple items in the dialog.
  dialog.allowsMultipleSelection = false

  # Display the dialog and process the selected folder
  if dialog.runModalForDirectory(nil, file:nil) == NSOKButton
  # if we had a allowed for the selection of multiple items
  # we would have want to loop through the selection
    destination_path.stringValue = dialog.filenames.first
  end
end

似乎在 beginSheetModalForWindow 调用中出现了一些问题,或者我错过了一些东西,试图追踪什么。我可以使用上面的代码使用于文件选择的模态对话框工作,但它不是附加到窗口的工作表。

4

1 回答 1

1

NSOpenPanel 是 NSSavePanel 的子类,因此您可以使用 NSSavePanel 的beginSheetModalForWindow:completionHandler:. 就是runModalForDirectory贬值了。然而,“depreciated”并不意味着“doesn't work”,它意味着“将来会停止工作”。

您得到的错误指向加载 MacRuby 本身的 C 代码。这表示 MacRuby 无法捕获的严重崩溃。它只显示在 Main.m 中,因为这是调试器设法捕获发生错误的堆栈的唯一位置。不幸的是,像这样将错误定位在堆栈的最顶部/底部使其对调试毫无用处。

我没有看到 Matt Aimonetti 的代码有任何明显的问题,所以我猜测这是 MacRuby 处理传递给完成处理程序的块的问题。这也可以解释为什么没有捕获错误,因为该块将位于与定义它的对象不同的地址空间中。

我建议直接通过图书网站MacRuby 邮件列表联系 Matt Aimonetti (他在那里非常活跃。)

于 2011-07-01T16:11:13.157 回答