سؤال

لقد قمت بتصنيف NSCOLLECTIONVIEW وأحاول استلام الملفات التي تم سحبها من الباحث. أنا أتلقى draggingEntered: وإعادة قيمة مناسبة ، لكنني لا أتلقى أبدًا prepareForDragOperation: (ولا أي من الأساليب بعد ذلك في العملية). هل هناك شيء واضح أنا مفقود هنا؟

شفرة:

- (void)awakeFromNib
{
    [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
}

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{
    NSLog(@"entered"); //Happens
    NSPasteboard *pboard;
    NSDragOperation sourceDragMask;

    sourceDragMask = [sender draggingSourceOperationMask];
    pboard = [sender draggingPasteboard];

    if ([[pboard types] containsObject:NSFilenamesPboardType])
    {
        NSLog(@"copy"); //Happens
        return NSDragOperationCopy;
    }

    return NSDragOperationNone;
}

- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
{
    NSLog(@"prepare"); //Never happens
    return YES;
}
هل كانت مفيدة؟

المحلول

هذا متأخر جدًا ، لكنني وجدت المشكلة:

يوفر NSCOLLECTIONVIEW بصمت تنفيذًا غير متوافق مع:

-(NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender

... ولم توثق Apple هذا. إذا قمت ببساطة بتنفيذ هذه الطريقة لإعادة صياغة طريقة DraggingEntered ، فكل شيء يعمل بشكل جيد ، على سبيل المثال:

-(NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender
{
    return [self draggingEntered:sender];
}

(جئت إلى آمل أن أجد شرحًا لما يوفره هذا التنفيذ المخصص ، لأن ذلك أيضًا ... غير موثق (شكرًا ، Apple!). أعتقد أنه يفعل شيئًا ذكيًا مع إدارة نقطة إدخال داخل CollectionView؟).

تحديث: يبدو أن السحر الخاص داخل كائن مندوب NSCOLLECTIONVIEW. لسبب ما ، كان XCODE4 يدعي أنه لم يكن هناك مندوب بالنسبة لي ، ولكن تعيينه بنيت وركض موافق. تحقق من كل طرق السحب / إسقاط المخصصة / شبه الموثقة هناك.

(أو افعل فقط كما أصف أعلاه وتجاوز السلوك المخصص ، وتنفيذ شيء يعمل ويمكنك فهمه)

نصائح أخرى

قد ترغب في تجربة طرق المندوب هذه من NSCOLLECTIONVIEWDELEGATE بروتوكول

- (NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id <NSDraggingInfo> )draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation;
- (BOOL)collectionView:(NSCollectionView *)collectionView acceptDrop:(id <NSDraggingInfo> )draggingInfo index:(NSInteger)index dropOperation:(NSCollectionViewDropOperation)dropOperation;

- (BOOL)collectionView:(NSCollectionView *)collectionView canDragItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent *)event;
- (NSImage *)collectionView:(NSCollectionView *)collectionView draggingImageForItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent *)event offset:(NSPointPointer)dragImageOffset;
- (NSArray *)collectionView:(NSCollectionView *)collectionView namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropURL forDraggedItemsAtIndexes:(NSIndexSet *)indexes;
- (BOOL)collectionView:(NSCollectionView *)collectionView writeItemsAtIndexes:(NSIndexSet *)indexes toPasteboard:(NSPasteboard *)pasteboard;

أول طريقتين على وجه الخصوص.

مررت بهذا منذ فترة. بدا الأمر غير بديهي بالنسبة لي ، لكن الطريقة الوحيدة التي يمكنني بها العمل هي إعداد عرض التمرير المرتبط به كهدف إسقاط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top