8

Tôi có một NSTableView và một NSOutlineView, cả hai với nội dung của họ được cung cấp bởi các ràng buộc, mà tôi muốn có một số chức năng kéo-và-thả:NSTableView và NSOutlineView drag-and-drop

  • Kéo các hàng từ Bảng A lên một hàng của Phác thảo B, nơi chúng sẽ được sao chép vào cấu trúc dữ liệu mà hàng trong Outline B đại diện.

  • Kéo một hàng từ Outline B lên một hàng khác trong Outline B, sẽ sao chép dữ liệu được biểu thị bằng hàng đầu tiên vào dữ liệu được biểu thị trong hàng thứ hai.

Tôi đã đọc Apple's drag-and-drop documentation và không chỉ nhận được ở đâu cả. Nó không thực sự có vẻ áp dụng cho những gì tôi cần làm. Tôi đang thiếu gì?

Trả lời

5

Bạn cần nguồn dữ liệu — AFAIK, bạn không thể thực hiện điều này với Bindings.

Trình tạo Adium Xtras chưa hoàn thành, theo giấy phép BSD, bao gồm an array controller that you can set as the data source to get drag-and-drop in a Bindings-powered table view.

Yêu cầu này có thể không áp dụng cho NSOutlineView và NSTreeController. Tôi đã không thử điều đó.

+0

Liên kết kết thúc bằng 404 và tôi không thể tìm thấy mã gốc ở bất kỳ đâu. –

+0

@ François Beausoleil: Cảm ơn; Tôi đã cập nhật liên kết. –

+0

Như một cách hoàn toàn hợp lý và sạch sẽ để làm điều này. Cảm ơn bạn đã phản hồi. –

7

Trang bạn đã liên kết đến khá rõ ràng về những gì bạn cần làm. Trong nguồn dữ liệu của bảng A, hãy triển khai registerForDraggedTypes:tableView:writeRowsWithIndexes:toPasteboard: để đặt một số dữ liệu riêng tư trên TableAPasteboardType trên bảng.

Trong nguồn dữ liệu của đường viền B, hãy triển khai cùng hai phương pháp và đặt một số dữ liệu riêng lẻ trên OutlineBPasteboardType trên bảng.

Cuối cùng, hãy thực hiện tableView:validateDrop:proposedRow:proposedDropOperation:tableView:acceptDrop:row:dropOperation: để kiểm tra bảng phấn cho TableAPasteboardType hoặc OutlineBPasteboardType và thực hiện các thay đổi thích hợp cho mô hình ràng buộc của bạn, tùy thuộc.

Khá đơn giản khi bạn vừa cày vào và làm điều đó.

5

Trong MacOS 10.7 một số giao thức mới được thêm vào để thực hiện việc này.

Có một lack of documentation for tables vào lúc này nhưng bạn có thể tìm thấy một số ví dụ tốt đẹp:

Đối NSTableViwew Nghị định thư NSTableViewDataSource xác định các phương pháp sau:

  • (BOOL)tableView:writeRowsWithIndexes:toPasteboard:
  • tableView:validateDrop:proposedRow:proposedDropOperation:
  • tableView:acceptDrop:row:dropOperation:

Đối NSOutlineView Nghị định thư NSOutlineViewDataSource xác định các phương pháp sau:

  • (BOOL)outlineView:writeItems:toPasteboard:
  • (NSDragOperation)outlineView:validateDrop:proposedItem:proposedChildIndex:
  • (BOOL)outlineView:acceptDrop:item:childIndex:

Đây là những yêu cầu tối thiểu để triển khai cho từng loại chế độ xem. Các trường hợp sử dụng khá giống nhau.

  1. Nếu phương thức toPasteboard: trả về CÓ, kéo được bắt đầu.
  2. Các validateDrop: Phương pháp điều khiển mà nút nhắm mục tiêu được phép bằng cách cập nhật điểm đánh dấu trong giao diện
  3. Return YES cho acceptDrop: Phương pháp nếu thả đã thành công

Điều này dẫn đến hai tiểu usecases bạn có để quản lý. Điều đầu tiên là kéo & thả trong cùng một chế độ xem hoặc hoạt động tương tự giữa hai chế độ xem. Ngoài ra, bạn có thể phân biệt giữa các thao tác di chuyển, sao chép hoặc xóa. Một ví dụ điển hình là cách các điểm ngắt hoạt động với việc kéo thả & vào Xcode.

BảngView có một số phương pháp bổ sung để tùy chỉnh kéo thả &, nhưng những cái tôi đã đề cập là các phương pháp chính để làm cho nó hoạt động.

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