0

我有一个名为 MSPageViewController 的自定义 UIViewController 类以及相关的 nib 文件。我有一个 IBOutlet,它是一个名为 pageImage 的 UIImageView。

现在,我想在另一个 UIViewController 中使用这个视图控制器,它将在 UIPageViewController 中显示一系列我的自定义 MSPageViewController。所以,我使用以下代码:

// 分配并初始化我的自定义视图控制器

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

// 我必须调用它,否则我在下面设置的图像将始终为空 // 为什么?我想这是因为视图尚未绘制,因为它尚未显示,所以我需要强制重绘 - 但这是我的问题。这是正确的方法吗?

[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属性,您将强制视图控制器实际加载 NIB。我想这是一个副作用,该pageImage属性也被填充(并且nil在你调用之前self.view)。

因此,只需调用self.view;而不是[self.view setNeedsDisplay];就足够了。

于 2013-08-09T20:36:16.713 回答
2

正如其他人所指出的,当您访问它时,pageImage(一个 UIImageView?)可能还没有从笔尖加载。

如果您有 pageImage 的自定义 getter,则可以执行以下操作:

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

但我个人的偏好是不公开图像视图本身,而只公开图像的属性。然后,您可以将图像设置为 viewcontroller,而不管它的加载状态如何,并在视图加载后在内部将其设置为 imageView:

- (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 回答
0

如果您将一些代码移动到 viewDidLoad 方法,您将保证视图已被绘制。

于 2013-08-09T20:33:24.663 回答