UIVIEWController المحمّلة بالكامل يفقد كل بياناتها بعد الإضافة إلى عرض التمرير

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

سؤال

ملخص

أنا أعيد تعزيز Apple's التحكم في الصفحة مشروع. في loadscrollviewwithpage: ، تظهر وحدات التحكم في العرض التي أقوم بإضافتها إلى طريقة عرض التمرير على الشاشة دون قيمها المهيئة ، كما لو كانت معروضة مباشرة من NIB.

تفاصيل

إليك الرمز الذي يبدو أن أعمل عندما أتخطى ذلك:

 CBFullScreenViewController *controller = [viewControllers objectAtIndex:page];

 if ((NSNull *)controller == [NSNull null]) {
  controller = [[CBFullScreenViewController alloc] init];

  // Populate the view from the corresponding CBImage object
  CBImage *imageObject = [imageArray objectAtIndex:page];
  BOOL bookmarked = [imageObject.bookmarked boolValue];
  controller.bookmarkButton.highlighted = bookmarked;
  NSString *subtitle = imageObject.subtitle;
  controller.closedSubtitleLabel.text = subtitle;
     // <-- snip...more initialization --> //
  controller.delegate = self;

  [viewControllers replaceObjectAtIndex:page withObject:controller];
  [controller release];
 }

// إضافة طريقة عرض وحدة التحكم إلى عرض التمرير إذا (nil == controller.view.superview) {cgrect frame = scrollview.frame ؛ frame.origin.x = frame.size.width * page ؛ frame.origin.y = 0 ؛ controller.view.frame = الإطار ؛ [ScrollView AddSubview: Controller.view] ؛ // << وحدة التحكم والمؤسسات الفرعية} // جميعها لا تحتوي

إليك طريقة init في cbfullscreenviewController:

- (id)init {
 if ((self = [super initWithNibName:@"CBFullScreenViewController" bundle:nil])) {
  self.cover = [[UIImageView alloc] init];
  self.homeButton = [[UIButton alloc] init];
  self.tabView = [[UIButton alloc] init];
  self.closedSubtitleLabel = [[UILabel alloc] init];
  self.openSubtitleLabel = [[UILabel alloc] init];
    // <-- snip...more initialization --> //
 }
 return self;
}

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

أوه ، ربما تجدر الإشارة إلى أنني حصلت على synthesize لكل من منافذاتي ، وكلها مدمن مخدرات في IB. لقطة شاشة هنا.

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

المحلول

بعد ساعات....

بلدي الحل

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

كان أحد الحلول التي نجحت لجعل التمرير مندوبًا للآراء الفرعية ...

@interface CBScrollViewController : UIViewController
          <***CBFullScreenViewControllerDelegate***, UIScrollViewDelegate> {
...etc...

ثم قم بتهيئة كل شيء عن طريق استدعاء وظيفة في المندوب من داخل ViewDiddload من Subview.

cbfullScreenViewController.h

@protocol CBFullScreenViewControllerDelegate
- (UIImage *)imageForFullScreenView:(CBFullScreenViewController *)controller;
@end

CBSCROLLVIEWCONTROLLER.M

- (UIImage *)imageForFullScreenView:(CBFullScreenViewController *)controller {
    NSUInteger page = controller.pageNumber;
    CBImage *image = [imageArray objectAtIndex:page];
    UIImage *pixels = [CBDataAccess pixelsForImage:image];
    return pixels;
}

حل أفضل

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

يوضح الرمز أعلاه كيف انتهى بي الأمر إلى عدم وجود شيء في وجهات نظر الخاصة بي بخلاف UiimageView لأن جميع عناصر التحكم تحتاج إلى تحميلها مرة واحدة فقط: العائمة بلا حراك على الصورة. إن تحميل NIB لعرض واحد على الشاشة كاملة هو Overkill الكلي.

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

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