2
- (BOOL) imageBrowser:(IKImageBrowserView *) aBrowser moveItemsAtIndexes: (NSIndexSet *)indexes toIndex:(NSUInteger)destinationIndex;

で並べ替えるためのこのデータソースメソッドはIKImageBrowserView呼び出されていません。ペン先の接続が正しく行われています。setAllowsReorderderingYESに設定されます。

しかし、それはまだ機能していません。

- (void)imageBrowser:(IKImageBrowserView *)aBrowser removeItemsAtIndexes:(NSIndexSet *)indexes

同時に、アイテムを削除するための上記のメソッドは正しく呼び出され、完全に機能します。再注文してみませんか?

アイテムをドラッグして並べ替えると、次のドラッグアンドドロップコードが呼び出されます。ここには実際には2つのIKImageBrowserViewがあります。

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{           
NSPoint draggingLocation = [self convertPoint:[sender draggingLocation] fromView:nil];
NSRect contentRect  = [[_indexContentBrowserView enclosingScrollView] frame];
BOOL isForContent   = (contentRect.origin.x < draggingLocation.x) && (draggingLocation.x < contentRect.origin.x + contentRect.size.width);

if (isForContent)
{
    if ([sender draggingSource] == _indexContentBrowserView)
    {
        return NSDragOperationMove;
    }
    else
    {
        NSPasteboard *pb = [sender draggingPasteboard]; 
        NSString * type = [pb availableTypeFromArray:[NSArray arrayWithObject:NSFilenamesPboardType]];

        if(type != nil)
        {
            return NSDragOperationEvery;
        }           
    }
}
else
{
    if ([sender draggingSource] == _indexListBrowserView)
    {
        return NSDragOperationMove;
    }
    else
    {
        NSPasteboard *pb = [sender draggingPasteboard]; 
        NSString * type = [pb availableTypeFromArray:[NSArray arrayWithObject:NSFilenamesPboardType]];

        if(type != nil)
        {
            return NSDragOperationEvery;
        }           
    }
}

return NSDragOperationNone;



}
4

2 に答える 2

1
- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
{
    [super prepareForDragOperation:sender];

    if(nil == [sender draggingSource])
        return YES;

    BOOL success = NO;

    if (_galleryMultiImageFileBrowserView != [sender draggingSource])
    {
        //Code for checking the duplication of files
    }
    else
    {
        success = YES;
    }
    return success;
    //I had returned NO here which was the reason for the problem.
}

私は問題を見つけました。それは私の間違いでした。上記のコードは修正されたものです。以前、[sender draggingSource]IKImageBrowserViewの場合、NOを返しました。これが、 moveItemsAtIndexes:メソッドが呼び出されなかった理由です。

@Dov:貴重な時間を割いてくれてありがとうDov。どうもありがとう。@Joaquin:ありがとうございます。

于 2011-12-02T08:03:27.730 に答える
0

あなたのコメントに基づくと、あなたの問題は、組み込みのドラッグアンドドロップ機能を上書きしたため、「無料」で並べ替えることができなくなったことにあるようです。super次のように、オーバーライドの最初に実装を呼び出すことをお勧めします。

[super draggingEntered:sender];

それはあなたにとってはうまくいかないかもしれませんが、そうでない場合は、どうなるかわかりません。あなたはドラッグアンドドロップコードが必要だと言います-それらの線に沿った2つの質問:最初に、あなたは何を達成したいと思っていますか?draggingEntered:第二に、これを達成するための最良の/唯一の方法をオーバーライドしていますか?

于 2011-12-01T12:49:49.173 に答える