كيفية تغيير uiimage من uiimageview من عرض فرعي؟
-
21-09-2019 - |
سؤال
أرغب في تغيير صورة على طريقة عرض ، من مربع حوار منبثق من 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]
في النهاية يكون مشبوهة للغاية.