1
votes

Coming from an Android and Java background, I am relative new with Xcode Development.

I am using Xcode 5.0.2 and created my first IOS Application by selecting Create a New Xcode Project -> Single View Application. The initial project structure has been generated and I found that there is a Main_iphone.storyboard file which opens a UI Designer where I can drag and drop items to it. I selected UIScrollView and dragged it into the main window that has been generated.

Now in the Controller header file, I added @property (nonatomic, retain) IBOutlet UIScrollView *scrollView; so that i could access the scrollView from inside my controller code.

I wanted to add an item to the scrollView programatically so I created a template Custom View by adding new file -> Objective-C Class with XIB for User Interface, named it TSTFilesInfoController and designed the XIB by adding a View and a label inside the view. Same with the scrollView above, I created a property to expose the mainView in my controller class.

I hardcoded a loop of 10x inside the controller of the UIScrollView and inside the for loop I am instantiating TSTFilesInfoController and adding the view to the UIScrollView. But when i run the application, nothing is shown or added in the UIScrollView.

Heres the code for adding the CustomView:

- (void)viewDidLoad {
        [super viewDidLoad];

        for ( int i = 0; i < 10 ; i++) {
            TSTFilesInfoController *info = [[TSTFilesInfoController alloc] init];

            [self addChildViewController:info];

            [self.scrollView addSubview:info.mainView];
            NSLog(@"View has been added into the scrollView");


        }

}

Can someone please tell me whats wrong with my codes and what would be the correct approach to achieve the output that i wanted? Thank you in advance for the help.

-- EDIT --

This code is auto-generated in TSTFilesInfoController.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
    }


    return self;
}
1
Did you connect mainView in XIB files? why declare a mainView instead of ViewController's property view.johnMa
mainView is connected to the view in the File Owner and the class is set to TSTFilesInfoController. I changed info.mainView to info.view and there is a progress. The viewDidLoad of TSTFilesInfoController has been invoked. This method is not invoked using info.mainView. But the UI still doesn't display anything. Still a blank UIScrollViewMacchiato
if i have xib file i would like to initialize my viewController by initWithNibNamed:.and you can try checkout wether the frames of your view is not ZEROjohnMa
I have edited the question and I included the code for initWithNibNamed. I added a Log inside the loop that prints the dimension of the instantiated TSTFilesInfoController and it prints this info.view.frame dimension x 0.000000, y 0.000000, w 320.000000, h 130.000000Macchiato

1 Answers

3
votes

This is a misuse of a UIViewController subclass. Do not use a view controller just as a sort of fishing rod to hook a view that's inside a xib file. Simply load the xib file and grab the view yourself, and stuff it into your interface.

There are complex rules for how to put a view controller's view manually inside your interface, and in general it is something you should be reluctant to do. But making views come and go dynamically and directly is easy and common.

Let's suppose the .xib file is called TSTFilesInfo.xib and it has a top-level UIView subclass object, class MyView, which is the one you want. Then:

MyView* v = (MyView*)
    ([[UINib nibWithNibName:@"TSTFilesInfo" bundle:nil]
         instantiateWithOwner:nil options:nil][0]);

This loads the nib once, instantiating its contents, and handing you a reference to that instance (the UIView in this case). Now plunk v into your interface. Keep that reference in an instance variable (probably weak, since it is retained by its superview) so that you can subsequently configure and communicate with any subviews of MyView to which you have created outlets.

NOTE: However, I must say from the example so far that it sounds to me like what you really want here is a UITableView, not a simple UIScrollView. It comes all set to do just the kind of thing you seem to up to here.