1

概要

私は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*ページ; frame.origin.y = 0; controller.view.frame=フレーム; [scrollView addSubview:controller.view]; //<<コントローラーとサブビュー}//すべてにnull以外の、この時点で有効と思われる//値があります

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に接続されていることを言及する価値があるでしょう。ここにスクリーンショット。

4

1 に答える 1

0

時間後....

私の解決策

上記のように、サブビューのviewDidLoadが、ボタンなどのすべての初期化を完了するまで起動しないという手がかりを最終的に見つけました。

うまくいった解決策の1つは、スクロールビューをサブビューのデリゲートにすることでした...

@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 以外のサブビューに何も持たなくなったことを示しています。単一の全画面表示用に nib をロードするのは、完全にやり過ぎです。

より良い解決策は、私が持っていたボタンとスライドする情報タブを備えたスクロールビューのより複雑なレイアウトに Interface Builder を使用することですが、プログラムで簡単にロードできるサブビューには Interface Builder を使用しません。

于 2010-05-03T22:18:00.723 に答える