Hi I already read tutorials around the web on MVC and already read the topics on here. I think i got the concept of the MVC but i\'m not sure of its implementation.
I\'v
Simply: UIViewController
is not your view, it's your controller
UIViewController
as a puppeteer and the UIView
as the puppet.UIViewController
controls WHAT is displayed on the UIViewUIView
's main purpose is to contain subviews.NSObject
can be used by any class, but should be used by the UIViewController
.Admittedly, I understood it much better after completing codeschool's tutorial http://www.codeschool.com/courses/try-ios. I highly recommend this simple hands-on approach.
Let's break it down:
Note: Here we utilize @property
declarations instead. These will save you from writing your own setter and getter methods. (unless you need to override them for custom functionality)
//MyModelObject.h
#import <Foundation/Foundation.h>
@interface MyModelObject : NSObject
@property (nonatomic) int count;
@end
//MyView.h
#import <UIKit/UIKit.h>
@interface MyView : UIView
// holds it's own subviews
@property (strong, nonatomic) UIView *anotherView;
@property (strong, nonatomic) UIImageView *myImageView;
@end
//MyViewController.h
#import <Foundation/Foundation.h>
#import "MyView.h" // your custom view
#import "MyModel.h" // your custom model
@interface MyViewController : UIViewController
@property (strong, nonatomic) MyView *myView
// see how the view is "owned" by the view controller?
@end
//MyViewController.m
@implementation MyViewController
@synthesize myView;
- (void) someMethod {
[myView doSomething];
}
@end
For whose have any doubt about where put the UI elements, I often like put the UI elements in View.m
My strategy is make all methods to build UI elements in View.m, where I have a method that call all others methods in View.m. Thus, i call only one method in ViewController
For example :
TodayView.h
#import <UIKit/UIKit.h>
@interface TodayView : UIView
@property (strong, nonatomic) UIImageView *imageView;
@property (strong,nonatomic) UINavigationBar *navBar;
-(void) addAllElements:(UIView*) mainView addController:(UIViewController*) controller;
-(void) addImage:(UIImageView*) image view:(UIView*) todayView;
-(void) addNavBar:(UIViewController*) navController addView:(UIView*)view;
@end
TodayView.m
#import "TodayView.h"
@implementation TodayView
-(void) addImage:(UIImageView *)image view:(UIView *)todayView{
image= [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
image.image = [UIImage imageNamed:@"icone-apps"];
[todayView addSubview:image];
}
-(void) addNavBar:(UIViewController *)navController addView:(UIView *)view{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 80, 120, 50)];
label.textAlignment = UITextAlignmentCenter;
[label setFont:[UIFont boldSystemFontOfSize:40.0]];
[label setBackgroundColor:[UIColor clearColor]];
[label setTextColor:[UIColor blackColor]];
[label setText:@"Hoje"];
[navController.navigationController.navigationBar.topItem setTitleView:label];
[view addSubview:label];
}
-(void) addAllElements:(UIView *)mainView addController:(UIViewController*)controller{
[self addNavBar:controller addView:mainView];
}
@end
TodayViewController.m
#import "TodayViewController.h"
@interface TodayViewController ()
@end
@implementation TodayViewController
@synthesize myView;
-(void) blankMethod{
}
-(void) addImage:(TodayView*)todayView{
todayView.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
todayView.imageView.image = [UIImage imageNamed:@"icone-apps"];
[self.view addSubview:todayView.imageView];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = UIColor.whiteColor;
TodayView *todayView = [[ TodayView alloc] init];
# Here I call the method that call all others methods to build UI elements
[todayView addAllElements:self.view addController:self];
}
-(UITabBarItem*) tabBarItem{
return [[UITabBarItem alloc] initWithTitle:@"Hoje" image:[UIImage imageNamed:@"icone-hoje"] tag:0];
}
@end