Adding a custom subview (created in a xib) to a view controller's view - What am I doing wrong

Objective CIosXibAddsubview

Objective C Problem Overview


I've created a view in a xib (with an activity indicator, a progress view and a label). Then I've created .h/.m files:

#import <UIKit/UIKit.h>

@interface MyCustomView : UIView {
    IBOutlet UIActivityIndicatorView *actIndicator;
    IBOutlet UIProgressView *progressBar;
    IBOutlet UILabel *statusMsg;
}

@end

#import "MyCustomView.h"
  
@implementation MyCustomView    

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        // Initialization code
    }
    return self;
}

- (void)dealloc {
    [super dealloc];
}

@end

In IB, I set the file's owner and view identity to MyCustomView and connect the IBOutlet to the File's owner

In MyViewController.m, I've:

- (void)viewDidLoad {

    [super viewDidLoad];   

    UIView *subView = [[MyCustomView alloc] initWithFrame:myTableView.frame];
    [subView setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]];

    [myTableView addSubview:subView];
    [subView release];
}

When I run the app, the view is added, but I can't see the label, the progress bar and the activity indicator.

What am I doing wrong?

Objective C Solutions


Solution 1 - Objective C

You need to load it using the -loadNibNamed method. -initWithNibName is only for UIViewControllers.

Add the following code to your MyCustomView init method:

NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil];
UIView *mainView = [subviewArray objectAtIndex:0];
[self addSubview:mainView];

Remember, if you are initializing an object from a nib, it calls - (id)initWithCoder:(NSCoder *)aDecoder to initialize, so you'll have to override that if you are creating the MyCustomView object within the nib. If you're just doing it with initWithFrame:, then just override that and add the code above. Also, in your nib, make sure you have one top-level UIView, and place all other elements within that (that makes sure that your subviewArray only has one entry).

This will load the views from the nib and add them to the object, and should do the trick.

Solution 2 - Objective C

I think you need to use this method:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;

This is because you need to pass it the .xib filename in the "nibNameOrNil".

Solution 3 - Objective C

As hocker said you have to use that method passing in the XIB name (without the extension).

Then you have to control this list:

  • Open the .xib file in IB
  • Click on File Owner and select the correct class (MyCustomView in your case)
  • Hold down control and drag from File Owner to the View (Now the outlet for the view is ok)

Hope it works. Cheers.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSefran2View Question on Stackoverflow
Solution 1 - Objective CNedView Answer on Stackoverflow
Solution 2 - Objective ChockerView Answer on Stackoverflow
Solution 3 - Objective CLorenzo BView Answer on Stackoverflow