2012-06-10 17 views
5

Xem xét chế độ xem (parent) với chế độ xem phụ (child). Cả hai đã đăng ký loại kéo NSFilenamesPboardType.Superview là điểm đến kéo nếu chế độ xem phụ từ chối nó

parent chỉ quan tâm đến tệp hình ảnh và child trong tệp âm thanh. Nếu họ phát hiện tệp có loại tương ứng trong số draggingEntered:, chúng sẽ trả lại NSDragOperationCopy. Nếu không, họ sẽ trả về NSDragOperationNone.

child chồng chéo parent và khi kéo đạt child, parent nhận được một thông điệp draggingExited:, bất kể nếu child là quan tâm đến việc kéo hay không.

Làm cách nào để tạo parent nhận được thao tác kéo nếu child không muốn?

+0

Có phải 'con' luôn nhận' draggingEntered: 'trước khi' parent' nhận được 'draggingExited:' trong trường hợp này? (hoặc ngược lại, luôn luôn?) Điều quan trọng là phải biết nếu thứ tự của các sự kiện là 100% phù hợp.Nếu nó không phù hợp 100% thì điều đó làm cho giải pháp phức tạp hơn một chút. – MechEthan

+0

Có thể chia sẻ hình ảnh/sơ đồ đơn giản hiển thị bố cục của các chế độ xem không? – Alladinian

Trả lời

3

Nếu tôi có được quyền này, bạn nên gọi:

[self.superview yourmethod]; 

trong Childs chức năng.

Nếu đứa trẻ được thừa hưởng từ cha mẹ bạn có thể gọi:

[super yourmethod]; 
+0

'yourmethod' là gì? – strangetimes

2

Có một vài điều bạn có thể làm ở đây:

  1. Như @Thomas đề cập, bạn có thể thực hiện logic trong chế độ xem con để xác định xem các sự kiện kéo có được chuyển tiếp đến chế độ xem chính hay không và chuyển tiếp các sự kiện khi thích hợp.

  2. Bạn có thể hủy đăng ký chế độ xem con khỏi nhận tin nhắn kéo ([childView unregisterDraggedTypes]) và sau đó bạn có thể triển khai tất cả logic cho các lần kéo trong parentView. Về cơ bản, ý tưởng sẽ là để tính toán loại và vị trí của kéo và có hay không giao cắt với chế độ xem con. Nếu nó giao cắt với chế độ xem con, hãy áp dụng logic kéo cho chế độ xem con. Nếu không, hãy áp dụng logic kéo cho chế độ xem chính. Bạn có thể sẽ cần phải thực hiện draggingUpdated: để thực hiện việc này.

1

Bạn có thể xem phụ huynh là người duy nhất đăng ký NSFilenamesPboardType.

Và cũng giống như các UIResponderChain, tạo ra một danh mục cho từng subviews

- (NSView*) dragTest:(id<NSDraggingInfo>)sender; 

nếu giá trị trả về là con số không, nó có nghĩa là subview (và subivews của nó) không muốn để xử lý các sự kiện kéo.

Bây giờ quay trở lại chế độ xem trước, khi kéo Đã nhập: đã kích hoạt, tính toán vị trí và tìm xem chế độ xem nào đang bật, hãy gọi dragTest: để kiểm tra xem chế độ xem con tương ứng có muốn xử lý nó hay không. Hãy để khung nhìn không rỗng trả về để xử lý sự kiện, nếu không hãy xử lý nó trong phần tử cha.

Phương pháp này sẽ hữu ích nếu bạn có nhiều cấp độ xem phụ.

Các vấn đề liên quan