Метод источника данных для переупорядочения в IKImageBrowserView, не вызывается - PullRequest
2 голосов
/ 20 ноября 2011
- (BOOL) imageBrowser:(IKImageBrowserView *) aBrowser moveItemsAtIndexes: (NSIndexSet *)indexes toIndex:(NSUInteger)destinationIndex;

Этот метод источника данных для переупорядочения в IKImageBrowserView не вызывается. Соединения пера выполнены правильно. setAllowsReorderdering установлено ДА.

Но это пока не работает.

- (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;



}

Ответы [ 2 ]

1 голос
/ 02 декабря 2011
- (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.
}

Я обнаружил проблему. Это была моя ошибка. Приведенный выше код исправлен. Ранее, когда [senger draggingSource] был IKImageBrowserView , он возвращал NO. По этой причине метод moveItemsAtIndexes: не вызывался.

@ Дов: Спасибо, Дов, за то, что уделили нам драгоценное время. Большое спасибо. @Joaquin: Большое спасибо.

0 голосов
/ 01 декабря 2011

Судя по вашим комментариям, ваша проблема в том, что вы переопределили встроенную функцию перетаскивания, и вам больше не нужно переупорядочивать «бесплатно».Я бы порекомендовал вызвать реализацию super в начале переопределения, например:

[super draggingEntered:sender];

Это может не сработать, но если нет, я не уверен, что будет.Вы говорите, что вам нужен код перетаскивания - два вопроса в том же духе: во-первых, чего вы надеетесь достичь?Во-вторых, является ли переопределение draggingEntered: лучшим / единственным способом достижения этого?

...