0

OS X 10.5 では問題なく動作していた次のコードが、10.6 では失敗します。

    @IBAction
def addButton_(self, sender):
    panel = NSOpenPanel.openPanel()
    panel.setCanChooseDirectories_(YES)
    panel.setAllowsMultipleSelection_(YES)
    try:
        panel.beginSheetForDirectory_file_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.directory, None, NSApp().mainWindow(), self, 'openPanelDidEnd:panel:returnCode:contextInfo:', None)
    except:
        pass

@AppHelper.endSheetMethod
def openPanelDidEnd_panel_returnCode_contextInfo_(self, panel, returnCode, contextInfo):

私が得るエラーは次のとおりです。

objc.BadPrototypeError: Python signature doesn't match implied Objective-C signature for <unbound selector openPanelDidEnd:panel:returnCode:contextInfo: of controller at 0x6166a70>
4

2 に答える 2

1

Elv が指摘しbeginSheetForDirectory:file:modalForWindow:modalDelegate:didEndSelector:contextInfo:ているように、10.6 で非推奨になり、使用する新しいメソッドはbeginSheetModalForWindow:completionHandler:、Snow Leopard に同梱されたバージョンの PyObjC にはこのメソッドのメタデータはありませんが、その後追加されており、適切なファイルを自分で更新できるので、この方法を使用できること。/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/AppKit/PyObjC.bridgesupport を開き、次の要素を見つけます。

<class name='NSSavePanel'>

この中に、次を追加します。

<method selector='beginSheetModalForWindow:completionHandler:'>
    <arg index='1' block='true' >
        <retval type='v' />
        <arg type='i' type64='q' />
    </arg>
</method>
<method selector='beginWithCompletionHandler:'>
    <arg index='0' block='true' >
        <retval type='v' />
        <arg type='i' type64='q' />
    </arg>
</method>

これは、Python 側が正しいタイプのオブジェクトを取得して Objective-C に返すために必要なメタデータです。完了ハンドラが正しい署名を持っている (つまり、整数の引数を取り、何も返さない) 限り、任意の呼び出し可能オブジェクトを渡すことができます。例:

def showOpenPanel_(self, sender):
    openPanel = NSOpenPanel.openPanel()

    def openPanelDidClose_(result):
        if result == NSFileHandlingPanelOKButton:
            openPanel.orderOut_(self)
            image = NSImage.alloc().initWithContentsOfFile_(openPanel.filename())
            self.imgView.setImage_(image)
    openPanel.setAllowedFileTypes_(NSImage.imageFileTypes())
    openPanel.beginSheetModalForWindow_completionHandler_(self.imgView.window(), 
                                                          objc.selector(openPanelDidClose_, argumentTypes='l'))
于 2011-03-11T11:02:09.783 に答える
1

beginSheetForDirectory:file:modalForWindow:modalDelegate:didEndSelector:contextInfo: は 10.6 で廃止されました: http://developer.apple.com/library/mac/#documentation/cocoa/reference/ApplicationKit/Classes/NSOpenPanel_Class/DeprecationAppendix/AppendixADeprecatedAPI.html

同じ問題の原因で苦労している PyObjC にはブロック署名http://pyobjc.sourceforge.net/documentation/pyobjc-core/blocks.html for beginSheetModalForWindow:completionHandler: がなく、runModal のみを使用できます

私の解決策:

panel = NSOpenPanel.openPanel()
panel.setCanChooseDirectories_(NO)
panel.setAllowsMultipleSelection_(NO)

panel.setAllowedFileTypes_(self.filetypes)
panel.setDirectoryURL_(os.getcwd())

ret = panel.runModal()
if ret:
    print panel.URL()

panel.URL() は、ユーザーの選択を返します。

于 2011-03-02T01:17:48.723 に答える