0

私は、MSPageViewController と呼ばれるカスタム UIViewController クラスと関連する nib ファイルを持っています。pageImage と呼ばれる UIImageView である IBOutlet があります。

ここで、UIPageViewController に一連のカスタム MSPageViewController を表示する別の UIViewController でこのビュー コントローラーを使用したいと考えています。したがって、次のコードを使用します。

// カスタム ビュー コントローラを割り当てて初期化する

MSPageViewController *page1 = [[MSPageViewController alloc] initWithNibName:@"MSPageViewController" bundle:nil];

// これを呼び出さなければなりません。そうしないと、下に設定した画像が常に null になります // なぜ? ビューが表示されていないためにまだ描画されていないためだと思いますので、強制的に再描画する必要がありますが、これが私の質問です。これは正しいアプローチですか?

[page1.view setNeedsDisplay];

// 画像を設定

page1.pageImage.image = [UIImage imageNamed:@"tutorialPage1.png"];

// ビュー コントローラの配列を作成します。両面になる可能性があるため、配列が必要です

NSArray *viewController = [NSArray page1];

// カスタム ビュー コントローラを含む配列を渡します

[self.pageController setViewControllers:viewController direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

それで、私はこれを正しくやっていますか?アウトレットに割り当てようとしたときにアウトレットが存在するように、再描画を強制する必要がありますか?

4

3 に答える 3

4

setNeedsDisplay「必要」なのは部品ではなく、部品self.viewです。プロパティにアクセスするviewことで、View Controller に実際に NIB をロードさせます。これの副作用として、pageImageプロパティにもデータが取り込まれていると思います (そして、nilあなたが を呼び出す前でしたself.view)。

self.view;そのため、代わりに呼び出すだけ[self.view setNeedsDisplay];で十分です。

于 2013-08-09T20:36:16.713 に答える
2

他の人が指摘しているように、pageImage (UIImageView?) は、アクセスしているときにまだ nib からロードされていない可能性があります。

pageImage のカスタム ゲッターがある場合は、次の操作を実行できます。

- (UIImageView*) pageImage
{
    [self view];
    return _pageImage; // assuming the property backing ivar is synthesized as _pageImage.
}

しかし、私の個人的な好みは、画像ビュー自体を公開せず、画像のプロパティを公開することです。次に、ロードされた状態に関係なくイメージをビューコントローラーに設定し、ビューがロードされると内部でイメージビューに設定できます。

- (void) setImage: (UIImage*) image
{
    _image = image;

    if ( self.isViewLoaded )
    {
         self.pageImage.image = image;
    }
}

- (void) viewDidLoad
{
    [super viewDidLoad];

    self.pageImage.image = self.image;
}
于 2013-08-09T22:13:44.493 に答える