使用initWithNibName时为什么需要setNeedsDisplay

时间:2013-08-09 20:31:07

标签: ios

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

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

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

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

我这样做是对的吗?当我尝试分配给他们时,我必须强制重绘以便我的网点存在吗?

3 个答案:

答案 0 :(得分:4)

这不是你需要的setNeedsDisplay部分,而是self.view部分。通过访问view属性,您强制视图控制器实际加载NIB。我想这是一个副作用,pageImage属性也被填充(在nil}之前是self.view

因此,只需拨打self.view;而不是[self.view setNeedsDisplay];即可。

答案 1 :(得分:2)

正如其他人所说,当你访问它时,pageImage(一个UIImageView?)可能还没有从nib加载。

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

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

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

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

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

- (void) viewDidLoad
{
    [super viewDidLoad];

    self.pageImage.image = self.image;
}

答案 2 :(得分:0)

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