Reputation: 569
I can't figure out what's wrong with this. I am trying to add a sub view to my current view. I alloc
and initWithNibName
my SecondViewController
and set its myImageView
parameter that is a UIImageView
. The problem is that when the subView is added the myImageView
is not set.
This is the code:
- (void)viewDidLoad
{
[super viewDidLoad];
SecondViewController *secondView = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
secondView.myImageView.image = [UIImage imageNamed:@"image1.png"];
[self.view addSubview secondView.view];
}
if I set an image to myImageView
via Interface Builder it is correctly displayed on addSubview
but if I set the property as described above it doesn't work... The UIImageView
outlet is correctly connected on IB.
this is the SecondViewController
:
@interface SecondViewController : UIViewController
{
}
@property(nonatomic,strong)IBOutlet UIImageView *myImageView;
@end
Upvotes: 0
Views: 532
Reputation: 1009
I believe your problem is that when you call secondView.myImageView.image = [UIImage imageNamed:@"image1.png"];
the myImageView outlet has not yet been set. The documentation for initWithNibName:bundle:
says, "The nib file you specify is not loaded right away. It is loaded the first time the view controller’s view is accessed." So you need code like this:
- (void)viewDidLoad
{
[super viewDidLoad];
SecondViewController *secondView = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
// Force the nib to load, which subsequently sets the myImageView outlet
[secondView view];
secondView.myImageView.image = [UIImage imageNamed:@"image1.png"];
[self.view addSubview secondView.view];
}
However, I don't recommend this approach. You should really set the image of the myImageView outlet in SecondViewController's -viewDidLoad method. That's where it belongs.
// SecondViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
self.myImageView.image = [UIImage imageNamed:@"image1.png"];
}
And then in the other view controller's -viewDidLoad method, just add SecondViewController's view as a subview like before:
- (void)viewDidLoad
{
[super viewDidLoad];
SecondViewController *secondVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
[self.view addSubview:secondVC.view];
}
Upvotes: 1
Reputation: 2194
If you set it myImageView via IB it will instantiate myImageView. IF you use the above code, myImageView is in instantiated.
You have to add the following line in SecondViewController viewDidLoad or initWithFrame:
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,100,100)]
secondView.myImageView = imageView;
[Thanks H2CO3]
Upvotes: 0