Полностью загруженный UIViewController теряет все свои данные после добавления в представление прокрутки - PullRequest
1 голос
/ 02 мая 2010

Резюме

Я переназначаю проект Apple Page Control . В loadScrollViewWithPage: контроллеры представления, которые я добавляю в представление прокрутки, отображаются на экране без их инициализированных значений, как если бы они отображались непосредственно с кончика.

Особенности

Вот код, который появляется , чтобы работать, когда я прохожу через него:

 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];
 }

// добавить представление контроллера в представление прокрутки if (nil == controller.view.superview) { CGRect frame = scrollView.frame; frame.origin.x = frame.size.width * page; frame.origin.y = 0; controller.view.frame = frame; [scrollView addSubview: controller.view]; // << контроллер и подпредставления } // все имеют ненулевое значение // допустимые значения в этой точке </p>

Вот метод 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;
}

Хотя устранение неполадок за последние 2 часа помогло мне отследить некоторые несвязанные утечки памяти, я не могу на всю жизнь выяснить, что происходит со значениями, которые я представляю себе!

О, наверное, стоит упомянуть, что у меня есть @synthesize для каждого из моих выходов, и все они подключены в IB. Снимок экрана здесь .

1 Ответ

0 голосов
/ 04 мая 2010

часов спустя ....

Мое решение

Как отмечалось выше, я наконец нашел подсказку в том, что суб-представления viewDidLoad не запускались до тех пор, пока я не выполнил всю свою инициализацию для кнопок и еще много чего, подразумевая, что перо переписывал всю мою инициализацию.

Одним из решений, которое сработало, было сделать представление прокрутки делегатом подпредставлений ...

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

и затем инициализировать все, вызывая функцию в делегате из viewDidLoad подпредставления.

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, потому что все элементы управления действительно нужно было загрузить только один раз: неподвижно перемещаться по изображению. Загрузка пера для одного полноэкранного просмотра - это полное излишество.

Лучшее решение - использовать Interface Builder для более сложного макета представления прокрутки с имеющимися у меня кнопками и скользящей информационной вкладкой, но оставить Interface Builder вне этого для подпредставлений, которые можно так же легко загрузить. программным способом.

...