A little background: I'm going through the CS193P iTune videos and I was stuck on the assignment 3 for the longest time. Basically, the assignment asks you to programmatically create a custom view to display a shape on the screen. I'm not using any view controllers by the way.
I could not get my view to display until I finally dragged a View object in Interface Builder and change the object name to my custom view class. So my question is when people say to programmatically create a view, are they just saying manually create the class but when you need to display it use IB? I can't help feeling like I misunderstood something?
edit: let me be more clear. My custom view has been initialized with a frame of 0, 0, 200, 150 and drawRect is overriden to draw a square in it. My view doesn't even show up if try adding it to the main window within my controller:
UIWindow* window = [UIApplication sharedApplication].keyWindow;
[window addSubview:polygonView];
However, if use drag a view in IB and change the class to my view class, it shows up fine.
Edit: Added some code. This is my controller's awakeFromNib method where the view should be drawn.
- (void)awakeFromNib {
shape = [[PolygonShape alloc] initWithNumberOfSides:numberOfSidesLable.text.integerValue minimumNumberOfSides:3 maximumNumberOfSides:12];
polygonView = [[PolygonView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
UIWindow *window = [UIApplication sharedApplication].keyWindow;
polygonView.backgroundColor = [UIColor blackColor];
[window addSubview:polygonView];
[self updateInterface];
}
Part of my controller's updateInterface method:
- (void)updateInterface {
[polygonView setPolygon:shape];
[polygonView setNeedsDisplay];
...
}
PolygonView.h
#import <UIKit/UIKit.h>
#import "PolygonShape.h"
@interface PolygonView : UIView {
IBOutlet PolygonShape *polygon;
}
@property (readwrite, assign) PolygonShape *polygon;
- (void)drawRect:(CGRect)rect;
@end
PolygonView.m
#import "PolygonView.h"
@implementation PolygonView
@synthesize polygon;
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
nslog(@"initialized");
}
return self;
}
- (void)drawRect:(CGRect)rect {
CGRect bounds = [self bounds];
[[UIColor grayColor] set];
UIRectFill(bounds);
CGRect square = CGRectMake(10, 10, 10, 100);
[[UIColor blackColor] set];
UIRectFill(square);
[[UIColor redColor] set];
UIRectFill(square);
NSLog(@"drawRect called");
}
@end
The polygonView is being initialized but the drawRect isn't being called.
hi just add this code,
This is an old question, but I'm not sure he got the answer he expected - it sounds like he ran into the same problem I did where I created a
UIViewController
subclass, whacked aUIViewController
in an interface builder nib but then couldn't figure out how to get the two working with one another.If you made the nib seperately (so it wasn't made for you alongside your class) then you have to remember to click the UIViewController you placed in the interface builder, and then from the properties panel click the third tab button ('Custom Class'). The
Class
will be the default base classUIViewController
etc - just open up this dropdown list and you'll see a list of all your custom subclasses, select it and volla - you've linked your custom element to the interface.Hope that saves somebody the days it took me to figure out, I found some stupidly wonderful ways of getting around it until I realized the simple solution.