Reputation: 10284
In the page control sample from apple there is a ScrollView in the interface builder. It is linked with the corresponding IBOutlet. I want to change the code so this is all done programatically. I delete the interface builder object, I delete the IBOutlet keyword. I alloc and init the scrollView, but nothing appears when I run the program.
I assume this is because I need to assign it as a subView to the main view. Or do I? I still don't really understand how all the views work and interact with each other. If I do [self.view addSubView:ScrollView];
I get a runtime error (or something, it usually just says something like BAD ACCESS or SIGABRT).
What am I doing wrong? Am I on the wrong path completely? (only two days in to ios programming, still a bit lost in the woods)
awakeFromNib in phone content controller:
- (void)awakeFromNib
{
scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
// load our data from a plist file inside our app bundle
NSString *path = [[NSBundle mainBundle] pathForResource:@"content_iPhone" ofType:@"plist"];
self.contentList = [NSArray arrayWithContentsOfFile:path];
// view controllers are created lazily
// in the meantime, load the array with placeholders which will be replaced on demand
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++)
{
[controllers addObject:[NSNull null]];
}
self.viewControllers = controllers;
[controllers release];
// a page is the width of the scroll view
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.delegate = self;
pageControl.numberOfPages = kNumberOfPages;
pageControl.currentPage = 0;
// pages are created on demand
// load the visible page
// load the page on either side to avoid flashes when the user starts scrolling
//
[self loadScrollViewWithPage:0];
[self loadScrollViewWithPage:1];
}
header file:
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "ContentController.h"
@interface PhoneContentController : ContentController <UIScrollViewDelegate>
{
UIScrollView *scrollView;
UIPageControl *pageControl;
NSMutableArray *viewControllers;
// To be used when scrolls originate from the UIPageControl
BOOL pageControlUsed;
}
@property (nonatomic, retain) UIScrollView *scrollView;
@property (nonatomic, retain) IBOutlet UIPageControl *pageControl;
@property (nonatomic, retain) NSMutableArray *viewControllers;
- (IBAction)changePage:(id)sender;
@end
appDelegate:
#import "AppDelegate.h"
#import "ContentController.h"
@implementation AppDelegate
@synthesize window, contentController;
- (void)dealloc
{
[window release];
[contentController release];
[super dealloc];
}
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
NSString *nibTitle = @"PadContent";
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
nibTitle = @"PhoneContent";
}
[[NSBundle mainBundle] loadNibNamed:nibTitle owner:self options:nil];
[self.window addSubview:self.contentController.view];
[window makeKeyAndVisible];
}
@end
and the scrollView has been deleted from the xib file. Note: this is a new version of the downloaded program where all I have changed is deleting the IBOutlet keyword for the scrollView, deleted the scroll from the xib and added the alloc, init line in awake from nib.
I've had suggestions to change the appDelegate and change the awakeFromNib to an init method, i've tried all this but it still doesn't work.
Upvotes: 4
Views: 10239
Reputation: 11217
Simple Method: You can created multiple times if you need means
- (void)viewDidLoad
{
[super viewDidLoad];
int x = 0;
int y = 10;
for(int i=0; i<5; i++)
{
UIScrollView *scrollview=[[UIScrollView alloc]initWithFrame:CGRectMake(x, y, 50, 50)];
scrollview.showsVerticalScrollIndicator=YES;
scrollview.scrollEnabled=YES;
scrollview.userInteractionEnabled=YES;
scrollview.backgroundColor = [UIColor greenColor];
[self.view addSubview:scrollview];
//scrollview.contentSize = CGSizeMake(50,50);
x=x+55;
//[self myscrollView];
}
}
Upvotes: 0
Reputation: 6353
Since you're not loading the interface from a nib file, you should set up your UIScrollView
in your PhoneContentController
's init
method:
- (id)init
{
[super init];
if (self) {
scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 20, 320, 440)];
pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>)]; // Place it where you want it.
viewControllers = [[NSMutableArray alloc] init];
// load our data from a plist file inside our app bundle
NSString *path = [[NSBundle mainBundle] pathForResource:@"content_iPhone" ofType:@"plist"];
self.contentList = [NSArray arrayWithContentsOfFile:path];
// view controllers are created lazily
// in the meantime, load the array with placeholders which will be replaced on demand
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++)
{
[controllers addObject:[NSNull null]];
}
self.viewControllers = controllers;
[controllers release];
// a page is the width of the scroll view
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.delegate = self;
pageControl.numberOfPages = kNumberOfPages;
pageControl.currentPage = 0;
// pages are created on demand
// load the visible page
// load the page on either side to avoid flashes when the user starts scrolling
//
[self loadScrollViewWithPage:0];
[self loadScrollViewWithPage:1];
}
return self;
}
In your AppDelegate
, make the following changes:
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
contentController = [[PhoneContentController alloc] init];
} else {
contentController = [[PadContentController alloc] init];
}
[self.window addSubview:contentController.view];
[window makeKeyAndVisible];
}
Upvotes: 2
Reputation: 3020
you simply put this inside awakeFromNib method
scrollView=[[UIScrollView alloc] initWithFrame:CGRectMake(0, 20, 320, 440)];
no need to add as subview because in phoneContentController xib there are no views inside that.so how can you add like[ self.view addSubView:ScrollView];this is because phoneContentController is not type of UIViewController Class. it's a sub Class of ContentController which is subClass of NSObject inside that project.
Upvotes: 0