سؤال

أرغب في تغيير صورة على طريقة عرض ، من مربع حوار منبثق من 4-6 أيقونات (تخيل مثل تغيير صورتك على تطبيق Messenger). الطريقة التي أقوم بتنفيذ هذه المنبثقة الوسيطة هي إنشاء طريقة عرض جديدة في IB ، مع عتامة على الخلفية ، ثم أقوم بتحميل هذا بمثابة عرض فرعي:

    IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
[self.view addSubview:iconsViewController.view];

لذلك ، عندما يلمس المستخدم أيقونة ، لدي

- (IBAction)iconIsSelected:(id)sender {
switch ([sender tag]) {
    case 1:
        [(ParentViewController*)[self superview] changeIcon];
        break;
    case 2:
        // same here..
        break;
    default:
        break;
}
[self.view removeFromSuperview];
[self release];

}

changeicon يضبط فقط image إلى أيقونة مماثلة. كما يمكنك أن تخمن ، هذا لا يعمل - رسالة التغيير لا تعمل أبدًا. لا أستطيع أن أفهم ما أفعله خطأ ، أي مساعدة موضع تقدير كبير!

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

المحلول

لديك بعض الخيارات هنا ...

الأول هو إنشاء خاصية على iconsviewController من النوع ParentViewController*, ، علي سبيل المثال:

@property (readwrite,nonatomic,assign) ParentViewController* parentController; // weak reference

لكسر هذا أبعد من ذلك:

  • readwrite لأننا نريد أن نكون قادرين على الوصول إلى القيمة عبر [self parentController] ولكن أيضا تغييره عبر [iconsViewController setParentController:self]
  • nonatomic لأنني لست قلقًا جدًا بشأن الخيوط
  • assign لجعلها "مرجعًا ضعيفًا" حيث لن يحتفظ الطفل بالوالد. إذا كانوا لكل منهما retain والآخر ، يمكن أن يؤدي إلى تسرب الذاكرة لاحقًا لأنه ما لم يتم إصدارها صراحةً ، فسوف ينتهي بك الأمر مع دائرة الاحتفاظ بها مما لا يتسبب في عدم وجود كائن في الاحتفاظ بالصفر.

عند التحميل من NIB ، قم بتعيين الخاصية:

IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
iconsViewController.parentController = self;

ثم ، اتصل به من الداخل iconIsSelected مثله:

[[self parentController] changeIcon];

بدلاً من ذلك ، يمكنك إنشاء بروتوكول مندوب:

@protocol IconViewSelectedDelegate (NSObject)

- (void) changeIcon;

@end

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

خيار آخر هو الاستخدام nsnotificalcenter ونشر/اشترك في الأحداث من عرضك الديناميكية. هذا هو الاقتران "الأكثر هدوءًا" بين الكائنين ، ولكن قد يكون مبالغة في هذا السيناريو.

نصائح أخرى

الرؤية الإشرافية للعرض هي طريقة عرض ، وليس وحدة تحكم عرض ، ومع ذلك يمكنك أن تكون الرؤية الإشرافية لتكون في الفصل ParentViewController. إذا لم يكن المنظر لا يشرف ، فإنه يعود nil, ، ورسالة إلى NIL هي عدم وجود OPS (وهو ما يفسر سبب عدم تعطلك هناك).

راجع للشغل ، ذلك [self release] في النهاية يكون مشبوهة للغاية.

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