2016-11-28 2 views
0

У меня есть NSCollectionView, который я хочу изменить. Я использую макет потока, делегат и источник данных установлен в мой ViewController. Я также зарегистрировал свой тип сопротивления, но я только получить вызов делегата для:Переупорядочение NSCollectionView с (компоновкой потока)

- (BOOL)collectionView:(NSCollectionView *)collectionView canDragItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent *)event; 

, но не для других вызовов делегата. Вот мой исходный код ViewController:

#import "ViewController.h" 
#import "CollectionViewItem.h" 

@interface ViewController() 

@property(nonatomic, strong) NSArray *strings; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do view setup here. 
} 


- (void)awakeFromNib 
{ 
    self.strings = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g", @"h"]; 

    NSArray *supportedTypes = [NSArray arrayWithObjects:@"CustomDDType", nil]; 
    [self.collectionView registerForDraggedTypes:supportedTypes]; 
} 


#pragma mark CollectionView DataSource 


- (NSInteger) numberOfSectionsInCollectionView:(NSCollectionView *)collectionView 
{ 
    return 1; 
} 


- (NSInteger) collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return self.strings.count; 
} 



- (NSCollectionViewItem *) collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CollectionViewItem *item = [collectionView makeItemWithIdentifier:@"CollectionViewItem" forIndexPath:indexPath]; 
    item.myTitle.stringValue = [self.strings objectAtIndex:indexPath.item]; 

    return item; 
} 

#pragma mark Drag/Drop 

- (BOOL)collectionView:(NSCollectionView *)collectionView canDragItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent *)event { 
    NSLog(@"canDragItems"); 
    return YES; 
} 


-(NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id<NSDraggingInfo>)draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation { 
    NSLog(@"Validate Drop"); 
    return NSDragOperationMove; 
} 


-(BOOL)collectionView:(NSCollectionView *)collectionView writeItemsAtIndexes:(NSIndexSet *)indexes toPasteboard:(NSPasteboard *)pasteboard 
{ 
    NSLog(@"Write Items at indexes : %@", indexes); 

    NSData *indexData = [NSKeyedArchiver archivedDataWithRootObject:indexes]; 
    [pasteboard declareTypes:@[@"CustomDDType"] owner:self]; 
    [pasteboard setData:indexData forType:@"CustomDDType"]; 

    return YES; 
} 


- (BOOL)collectionView:(NSCollectionView *)collectionView acceptDrop:(id<NSDraggingInfo>)draggingInfo index:(NSInteger)index dropOperation:(NSCollectionViewDropOperation)dropOperation { 
    NSLog(@"Accept Drop"); 

    NSPasteboard *pBoard = [draggingInfo draggingPasteboard]; 
    NSData *indexData = [pBoard dataForType:@"CustomDDType"]; 
    NSIndexSet *indexes = [NSKeyedUnarchiver unarchiveObjectWithData:indexData]; 
    NSInteger draggedCell = [indexes firstIndex]; 

    return YES; 
} 

@end 

Я что-то пропустил? Я не могу использовать новые вызовы делегатов, представленные в 10.11, потому что мой проект должен работать раньше.

+1

Можете ли вы использовать схему потока до 10.11? – Willeke

+0

Спасибо за этот намек. Я думаю, что это невозможно. В настоящее время изменение представления коллекции на макет массива содержимого. – Matt

+0

У меня такая же проблема, и это сводит меня с ума. Вы нашли какое-то решение тем временем? – JFS

ответ

0

OK !!! Таким образом, вы повторно заказываете раскладку! Это может быть сложно - я не на моем Mac, так что я дам вам «Обзор»

Когда переназначения любой таблицы/Collection и у вас есть несколько изменений, вам необходимо периодического обновления к источнику данных. (возможно, вы уже знаете это)

Обязательно подключите свой источник данных и делегат к представлению. (я не вижу его в коде, поэтому я предполагаю, что вы сделали это в интерфейсе)

Наконец, вы можете проверить, что ваш вид коллекции является сильным (настолько сильным), потому что он может потерять свою ссылку до того, как он когда-либо появится. - Если ни одна из этих работ не даст мне знать.

+0

Благодарим вас за ответ. Да, я подключил источник данных и делегировал его в контроллер просмотра в построителе интерфейса. Может быть, мне не нужен макет потока. Легче ли использовать Массив содержимого в качестве макета для переупорядочения? Но я получаю вызов делегата canDragItemsAtIndex. – Matt

+0

Matt - У вас есть набор протоколов для делегатов? ViewController: NSCollectionViewDelegate –

+0

Да, я установил протокол делегата. – Matt

 Смежные вопросы

  • Нет связанных вопросов^_^