1

NSCollectionView のプロトタイプとして使用されるカスタム NSView 内に NSTabView があります。2 番目のタブには、NSButton ボタンと NSImageView オブジェクトがあります。

NSButton は、NSOpenPanel をトリガーする「参照」ボタンです。

ボタンのセレクターを MyCustomView の IBAction に接続しました。これにより、次のことが実行されます。

// MyView.h

@interface MyView : NSView 
{
    IBOutlet NSTabView *tabView;
    IBOutlet NSImageView *myImageView;
    IBOutlet NSButton *browseButton;
}

-(IBAction)openBrowseDialog:(id)sender;


@end


// MyView.m

-(IBAction)openBrowseDialog:(id)sender
{

    NSOpenPanel* openDlg = [NSOpenPanel openPanel];

    [openDlg setCanChooseFiles:YES];
    [openDlg setCanChooseDirectories:NO];
    [openDlg setAllowsMultipleSelection:NO];
    [openDlg setAllowedFileTypes:[NSArray arrayWithObjects:@"png", @"jpg", @"jpeg", @"gif", nil]];


    if ( [openDlg runModal] == NSOKButton )
    {

        NSArray* files = [openDlg URLs];
        NSURL* fileURL = [files objectAtIndex:0];
        NSData *imageData = [NSData dataWithContentsOfURL:fileURL];

        if( imageData != nil )
        {
            NSImage *image = [[NSImage alloc] initWithData:imageData];
            myImageView.image = image;
            [image release];
        }

    }

}

この「myImageView」を実行すると、Interface Builder で IBOutlet として接続したにもかかわらず、コンソールで「null」がトレースされます。理由を説明していただけますか?代わりにこれを行うにはどうすればよいですか? また、「fileURL」値を NSCollectionViewItem オブジェクトの「representedObject」に渡す必要がありますが、ここからアクセスする方法がわかりません。

4

1 に答える 1

2

1日のトラブルシューティングの後、ようやく必要なものを達成しました. 私の最初のアプローチにはいくつかの問題がありました。

1) NSCollectionView 内で NSTabView を使用することは、「非アクティブ」タブではバインディングが初期化されないため、悪い考えのようです。私はそれを破棄し、代わりに NSSegmentedControl を選択して、オブジェクトを手動で表示/非表示にしました。

2)元の質問のすべてのコードは、NSViewのサブクラスではなく、NSCollectionViewItemのサブクラス内に実際に配置する必要があります。これは、カスタム描画を行っていないため、必要ありません。

今は大丈夫です。勉強中です。

于 2011-02-04T01:47:43.583 に答える