I'm trying to switch views after an animation as seen:
[UIView beginAnimations: @"Fade Out" context:nil];
[UIView setAnimationDelay:1.0];
[UIView setAnimationDuration:0.25];
splash.alpha = 0.0;
[UIView commitAnimations];
[self.view addSubview : view];
At the [self.view addSubview : view];
I have to add a name for the view for it to add, so I made an IBOutlet
like so: (on the first view controller's .h file)
IBOutlet UIView *main;
But when I try to connect the *main
UIView
to the view on the storyboard, it wont let me...
Thanks so much guys.
Although IBOutlets are often found as weak, Apple recommends a while back (2015) that references should be strong by default. Of course, this is unless the reference needs to be weak.
An IBAction is for hooking a method (action) up to a view when designing your XIB. An IBOutlet lets you reference the view from your controller code. An IBAction lets the view call a method in your controller code when the user interacts with the view. You should release or nil IBOutlet properties in dealloc.
If you have a property defined that you want to make accessible to your storyboards, just add the @IBOutlet attribute before your property. Similarly with @IBAction to connect storyboard actions back to code.
Your point of confusion is between creating UI objects in code vs creating them graphically using Interface Builder / storyboard.
One clue is your use of the preprocessor hint 'IBOutlet'. IB is for Interface Builder == graphic creation (using a storyboard or xib file).
If creating in storyboard...
create an IBOutlet property as you have done, although the full correct syntax is@property (nonatomic, weak) IBOutlet UIView *main;
drag a "custom view" view from the object library to your storyboard scene.
The entire purpose of an IBOutlet is to give you a reference to an item in your storyboard scene that you can use in your code.
You won't need to do this:
[self.view addSubview : view];
as it is already created and added in your storyboard. Make sure it is located as you expect in your view hierarchy.
If creating in code...
Declare a property in your @interface
@property (nonatomic, strong) UIView *main;
(No need for IBOutlet
as you aren't linking it up in your storyboard. Declared 'strong' instead of 'weak' in case you don't immediately assign it to a view hierarchy).
Before you add this line
[self.view addSubview : view];
you need to consider: are you adding a new view that does not exist in your storyboard/xib? If so, you cannot add it until you have created it. (Adding a view that IS in your storyboard doesn't make sense, as it is already there, in your storyboard scene).
So - as you appear to be doing this in code - you need to create the view before adding it.
UIView* myView = [[UIView alloc] init];
set it's frame property so that we know where it will appear when you add it to the view hierarchy
myView.frame = CGRectMake (CGFloat x, CGFloat y, CGFloat width, CGFloat height);
Assign your newly-created view to the property
self.main = myView;
Add it to your view hierarchy
[self.view addSubview : myView];
Now you can refer to it in code by using self.main. This is just as it would be if you were to have added it in IB/storyboard and CRTL-dragged a reference link to your IBOutlet.
If you are creating your view in code and immediately adding it to a view hierarchy, an alternative to declaring a property is to set the (numerical) tag property on the view, then you can refer to the view using it's superview's viewWithTag:
method
The one thing you can't do is create the view in code, then manipulate it using the storyboard.
I hope this is all useful, I fear I may be confusing you further!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With