كيفية التحقق مما إذا كانت وحدة التحكم في العرض يمكنها إجراء مقطع

StackOverflow https://stackoverflow.com//questions/9626469

سؤال

قد يكون هذا سؤالًا بسيطًا جدًا ولكنه لم يسفر عن أي نتائج عند البحث عنه، فها هو...

أحاول إيجاد طريقة للتحقق مما إذا كانت وحدة تحكم عرض معينة يمكنها إجراء مقطع باستخدام المعرف XYZ قبل الاتصال بـ performSegueWithIdentifier: طريقة.

شيء على غرار:

if ([self canPerformSegueWithIdentifier:@"SegueID"])
    [self performSegueWithIdentifier:@"SegueID"];

ممكن؟

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

المحلول

كما هو مذكور في الوثائق:

لا تحتاج التطبيقات عادةً إلى تشغيل المقاطع مباشرةً.بدلاً من ذلك ، تقوم بتكوين كائن في منشئ الواجهة المرتبط بوحدة التحكم في العرض ، مثل عنصر تحكم مضمن في التسلسل الهرمي للعرض ، لإحداث Segue.ومع ذلك ، يمكنك استدعاء هذه الطريقة لإحداث segue برمجياً ، ربما استجابةً لبعض الإجراءات التي لا يمكن تحديدها في ملف موارد القصة المصورة.على سبيل المثال ، يمكنك الاتصال به من معالج عمل مخصص يستخدم لمعالجة أحداث الهز أو التسارع.

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

يقال أنه عندما تقوم بتشغيل segue, ، عادة ما يكون ذلك لأنه من المفترض أن UIViewController سوف تكون قادرة على الرد عليه مع محددة segue's معرف.وأنا أتفق أيضًا مع Dan F، حيث يجب أن تحاول تجنب المواقف التي قد يتم فيها طرح استثناء.كسبب لعدم قدرتك على القيام بشيء مثل هذا:

if ([self canPerformSegueWithIdentifier:@"SegueID"])
    [self performSegueWithIdentifier:@"SegueID"];

أظن أن:

  1. respondsToSelector: يتحقق فقط مما إذا كنت قادرًا على التعامل مع هذه الرسالة في وقت التشغيل.في هذه الحالة يمكنك، لأن الطبقة UIViewController قادر على الرد عليه performSegueWithIdentifier:sender:.للتحقق فعليًا مما إذا كانت إحدى الطرق قادرة على التعامل مع رسالة ذات معلمات معينة، أعتقد أنه سيكون مستحيلًا، لأنه من أجل تحديد ما إذا كان ذلك ممكنًا، يجب تشغيلها بالفعل وعند القيام بذلك NSInvalidArgumentException سوف ترتفع.
  2. لإنشاء ما اقترحته فعليًا، سيكون من المفيد الحصول على قائمة بمعرفات السلسلة التي UIViewController يرتبط ب.من UIViewController توثيق, ، لم أتمكن من العثور على أي شيء يشبه ذلك

أما الآن، أعتقد أن أفضل رهان لك هو الاستمرار في ذلك @try @catch @finally.

نصائح أخرى

للتحقق مما إذا كان هذا الشهر موجود أم لا، أنا ببساطة تحيط ببساطة المكالمة بكتلة TRY-and-catch.يرجى الاطلاع على مثال التعليمات البرمجية أدناه: giveacodicetagpre.

نأمل أن يساعد هذا.

giveacodicetagpre.

تم تحديث هذا المنشور ل SWIFT 4.


هنا هو طريقة أكثر تصحيحا سريع للتحقق مما إذا كان هناك أي نظام معلومات: giveacodicetagpre.

يمكنك تجاوز - (BOOL) يجب أن AllyperformseGyWithiddierifient: المرسل: الأسلوب والقيام بمنطقك هناك. giveacodicetagpre.

نأمل أن يساعد هذا.

نسخة سريعة من إجابة Evgeny Mikhaylov، والتي عملت بالنسبة لي:

أعيد استخدام وحدة تحكم لوجهات نظرتين.هذا يساعدني في إعادة استخدام التعليمات البرمجية. giveacodicetagpre.

لا توجد طريقة للتحقق من أنه باستخدام الوظائف القياسية، ما يمكنك القيام به هو فئة فرعية UIStoryboardSegue وتخزين المعلومات في source وحدة تحكم العرض (التي يتم تمريرها إلى المُنشئ).في منشئ الواجهة، حدد "مخصص" كنوع السلسلة حيث اكتب اسم الفئة الخاصة بفصلك، ثم سيتم استدعاء المنشئ الخاص بك لكل سلسلة تم إنشاء مثيل لها ويمكنك الاستعلام عن البيانات المخزنة إذا كانت موجودة.

يجب عليك أيضًا تجاوز perform طريقة للاتصال [source presentModalViewController:destination animated:YES] أو [source pushViewController:destination animated:YES] اعتمادًا على نوع الانتقال الذي تريده.

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