سؤال

لدي NSTableView وNSOutlineView، وكلاهما مزود بمحتواهما عن طريق الارتباطات، وأرغب في الحصول على بعض وظائف السحب والإفلات:

  • اسحب الصفوف من الجدول أ على صف من المخطط التفصيلي B، حيث سيتم نسخها إلى بنية بيانات يمثلها الصف في المخطط التفصيلي B.

  • اسحب صفًا من المخطط التفصيلي B على صف آخر في المخطط التفصيلي B، والذي سيقوم بنسخ البيانات التي يمثلها الصف الأول إلى البيانات الممثلة في الصف الثاني.

أنا قد قرأت وثائق السحب والإفلات من Apple ولم تصل إلى أي مكان تقريبًا.لا يبدو أن هذا ينطبق حقًا على ما يجب أن أفعله.ماذا ينقصني؟

هل كانت مفيدة؟

المحلول

أنت بحاجة إلى مصدر بيانات — AFAIK، لا يمكنك تحقيق ذلك باستخدام Bindings وحدها.

يتضمن Adium Xtras Creator غير المكتمل، والذي يخضع لترخيص BSD، وحدة تحكم صفيف يمكنك تعيينها كمصدر بيانات للحصول على السحب والإفلات في عرض جدول مدعوم بالربط.

قد لا ينطبق هذا المطلب على NSOutlineView وNSTreeController.لم أحاول ذلك.

نصائح أخرى

الصفحة التي قمت بربطها واضحة تمامًا بشأن ما عليك القيام به.في مصدر بيانات الجدول أ، قم بالتنفيذ registerForDraggedTypes: و tableView:writeRowsWithIndexes:toPasteboard: لوضع بعض القطاع الخاص TableAPasteboardType البيانات الموجودة على لوحة اللصق.

في مصدر بيانات المخطط التفصيلي B، قم بتنفيذ نفس الطريقتين ووضع بعض الخاصية OutlineBPasteboardType البيانات الموجودة على لوحة اللصق.

وأخيرا، تنفيذ tableView:validateDrop:proposedRow:proposedDropOperation: و tableView:acceptDrop:row:dropOperation: للتحقق من اللوح لأي منهما TableAPasteboardType أو OutlineBPasteboardType وقم بإجراء التغييرات المناسبة على النموذج المرتبط الخاص بك، اعتمادًا على ذلك.

إنه أمر بسيط جدًا بمجرد الحرث والقيام بذلك.

في نظام التشغيل MacOS 10.7 تمت إضافة بعض البروتوكولات الجديدة لتنفيذ ذلك.

هناك عدم وجود وثائق للجداول في الوقت الحالي ولكن يمكنك العثور على بعض الأمثلة الرائعة:

بالنسبة لـ NSTableViwew، يحدد البروتوكول NSTableViewDataSource الطرق التالية:

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

بالنسبة لـ NSOutlineView، يحدد البروتوكول NSOutlineViewDataSource الطرق التالية:

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

هذا هو الحد الأدنى من المتطلبات التي يجب تنفيذها لكل نوع عرض.حالات الاستخدام متشابهة تمامًا.

  1. إذا كان toPasteboard:ترجع الطريقة نعم، بدأ السحب.
  2. التحقق من صحة إسقاط:تتحكم الطريقة في العقدة المستهدفة المسموح بها عن طريق تحديث العلامة في العرض
  3. قم بإرجاع نعم للقبول:الطريقة إذا كان الهبوط ناجحا

يؤدي هذا إلى حالتين استخدام فرعيتين عليك إدارتهما.الأول هو السحب والإسقاط داخل نفس العرض أو نفس العملية بين طريقتي عرض.بالإضافة إلى ذلك، يمكنك التمييز بين عمليات النقل أو النسخ أو الحذف.أحد الأمثلة الجيدة هو كيفية عمل نقاط التوقف مع السحب والإفلات في Xcode.

يحتوي tableView على بعض الطرق الإضافية لتخصيص السحب والإفلات، ولكن تلك التي ذكرتها هي الطرق الأساسية لتشغيله.

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