2011-10-09 32 views
5

Bir dizi öğe içeren bir NSTableView sahibim. Sürüklenen öğeyi silmek için 'dan içine sürükleme ve NSTableView öğesinin dışına düşmesini istiyorum. (Tür gibi nasıl Safari 'poofs' imleri uzakta.)Kaldırmak için NSTableView dışarı sürükleme

NSTableView zaten drag n' açılır yeniden sıralama desteklemek üzere yapılandırılmış ve uygulamada başka NSTableView gelen damla kabul edilir bunun çoğu şebeke kurmuş iken, ve bu nedenle Sadece küçük bir işlevsellik eksik.

Güncelleme:

teşekkürler yardımlarından ötürü Seankadar ileri. Bir öğenin orijinal konumuna geri döndükten sonra sürüklendiğini belirten bildirim alabilirken (yanıtına yorum), fare düğmesi serbest bırakıldıktan hemen sonra bildirim almak istiyorum.

Geçerli davranış, kullanıcının bir öğeyi dışarı sürüklemesi, "geçerli değil" olarak ele alınacak sürüklemenin ve öğenin orijinal konumuna geri döndürülmesidir. Sonra bildirimi alındı ​​ve öğeyi kaldırabilirim, ancak kullanıcı arabirimi açısından UI açısından biraz kafa karıştırıcı (kullanıcılar için).

cevap

9

Tablo görünümünüzün zaten NSDraggingSource protokolünü uyguladığı gibi görünüyor. Bu durumda, sürükleme başarısız olursa, (ön OS 10.7) veya(OS 10.7) yönteminiişlemine sağlayabilirsiniz. Böylece, bu işlemin gerçekleştirilip geçirilmediğini kontrol edebilir, sonra nesneyi silebilir ve eğer varsa, bunu kaldırırsınız. Başka bir deyişle

, bu (10.7 'de) böyle bir şey görünecektir:

-(void)draggingSession:(NSDraggingSession *)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation { 
    if (operation == NSDragOperationNone) { 
     //delete object, remove from view, etc. 
    } 
} 
+1

Bu yöntemlerin NSTableView'da veya temsilci/veri kaynağı olarak görev yapan nesnede tanımlanması gerekir mi? Geçerli bir sürükleme işlevselliği düzeyini sağlamak için NSTableView alt sınıfına ihtiyacım yoktu, sadece birkaç delege yöntemi uyguladı ve registerForDraggedTypes :. Veri kaynağı/temsilci içinde önerdiğiniz sürükleme yöntemlerini uygulamak işe yaramadı, ancak bunları NSTableViews'ın alt sınıf sürümlerinde deneyeceğim. –

+1

Alt sınıf NSTableView'a ekleyerek çalıştı, ancak sorun, uygulamanın sürgünün "kötü" olarak davranması ve görüntünün orijinal konumuna geri dönmesidir, * sonra yukarıdaki yöntemler çağrılır. Fare düğmesi serbest bırakıldığında hemen bir bildirim almanın herhangi bir yolu var mı? –

+1

Son parçayı çözebildim. Alt sınıflanmış NSTableView'ımda, basitçe geçersiz kıldım: ** dragImage: at: offset: event: pasteboard: source: slideBack: ** ve sonra bu yöntemi [super ...] moduna geçirdikten sonra slideBack: parametresini NO olarak değiştirir. –

4

silmeden önce tekrar eski konumuna yüzen sürükleme görüntüsünü önlemek için, sürükleyerek oturumu özelliğini "animatesToStartingPositionsOnCancelOrFail ayarlayabilirsiniz bir sürüklenen satır silerken homoseksüel '"tableView: draggingSession: willBeginAtPoint: forRowIndexes: yöntemle

- (void)tableView:(NSTableView *)tableView draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint forRowIndexes:(NSIndexSet *)rowIndexes { 
    [session setAnimatesToStartingPositionsOnCancelOrFail:NO]; 
} 

Ancak hala oluşturmak yöntemi için arıyorum'.

+0

Bu bir yöntem değil, bir işlev: ['NSShowAnimationEffect'] (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Miscellaneous/AppKit_Functions/Reference/reference.html#// apple_ref/c/func/NSShowAnimationEffect) –

+2

Bunun için teşekkürler Peter.Şimdi bunu kullanıyorum: NSShowAnimationEffect (NSAnimationEffectPoof, [NSEvent mouseLocation], NSZeroSize, nil, nil, nil); – SarahR

+0

Bu yöntemde, sürükleme işleminin ne olduğunu öğrenebilirim? Bunu yaptığınızda [session setAnimatesToStartingPositionsOnCancelOrFail: NO]; her zaman geri dönmez ... ama sadece bir satırı sildiğimde bunu istiyorum ... İkinci soru ise, sürüklenen öğe benim uygulama penceremden çıktığında satırı silmek istiyorum. endedAtPoint ile mümkün ama nasıl bir fikrim yok? umarım yardım edebilirsin :) – Missaq