完全加载的UIViewController在添加到滚动视图后丢失了所有数据

时间:2010-05-02 00:37:18

标签: iphone objective-c nib addsubview

摘要

我正在重新利用Apple的页面控制项目。在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]; //&lt;&lt;控制器和子视图  } //看起来都是非空的                                                  //此时的有效值

这是CBFullScreenViewController中的init方法:

- (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连接起来了。屏幕截图here

1 个答案:

答案 0 :(得分:0)

几小时后......

我的解决方案

如上所述,我终于找到了一个线索,即子视图' viewDidLoad 在我完成对按钮的所有初始化之后才会触发,这意味着nib覆盖了我的所有初始化。

一个有效的解决方案是使滚动视图成为子视图的代表......

@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从子视图中移除,这可以很容易地加载编程。

相关问题