我们从这张图开始说吧。从这张图我们可以很清楚的看到iOS开发的MVC结构。UIApplication,Application Delegate 和 View Controller都是控制器。UIWindow和各种其他的UIView都是视图。
1。 程序的启动函数UIApplicationMain
该函数主要创建一个UIApplication对象和一个UIApplicationDelegate对象,并且设置事件循环,然后开始处理事件。
int UIApplicationMain (
int argc,
char *argv[],
NSString *principalClassName,
NSString *delegateClassName
);
该函数有四个参数,前两个我们都很熟悉了。第三个函数是UIApplication类的名字,如果为空程序会自动创建一个UIApplication的实例。第四个函数是,UIApplicationDelegate类的名字,如果为空系统会从Main xib文件寻找。
如果不用Main xib文件呢? 那就必须自己指定一个了,总不能让程序启动无门吧。
首先,我们先用一个不使用xib文件的例子来看看UIApplicationDelegate,UIWindow,UIViewController和UIView是怎么连起来的。我们的例子自定义了Test2AppDelegate(和项目创建的TestAppDelegate区别开),MyViewController和MyView及个类。
首先,创建一个window-based的项目。因为我们不用xib文件,所以删除plist文件中NSMainNibFile这一项和对应的value。然后,设置UIApplicationMain函数的第四个参数为指定的Delegate的名字。
int retVal = UIApplicationMain(argc, argv, nil, @"Test2AppDelegate");
2。UIApplicationDelegate
为了区别于项目自动生成的UIApplicationDelegate类,我自己定义了Test2AppDelegate类。
#import <Foundation/Foundation.h>
@interface Test2AppDelegate : NSObject <UIApplicationDelegate>{
UIWindow *window;
UIViewController *viewController;
}
@property (nonatomic, retain) UIWindow * window;
@property (nonatomic, retain) UIViewController *viewController;
@end
从代码可以看到,该类继承NSObject并实现了UIApplicationDelegate协议。
这个协议的方法提供了UIApplication的关键事件信息,比如完成加载,即将关闭或者内存不足。实现对应的方法就可以对这些事件进行处理。
代理类的重要之处还在于对程序的状态转换做出相应的处理。比如程序完成加载后会调用application didFinishLaunchingWithOptions。我们在这个方法里面创建一个UIWindow,否则程序会显示黑屏。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
CGRect appFrame = [UIScreen mainScreen].applicationFrame; // Override point for customization after application launch.
window = [[UIWindow alloc] initWithFrame:appFrame];
viewController = [[MyViewController alloc] initWith_Frame:appFrame];
[window addSubview:viewController.view];
[self.window makeKeyAndVisible];
return YES;
}
3。UIWindow
UIWindow是所有视图的根,每个程序里只有一个UIWindow实例。它定义了管理并协调窗口在屏幕上显示的对象。它的两个主要功能是分发事件给UIView对象和提供显示视图的区域。
4。UIViewController
UIViewController提供了基本的View管理模型。每个实例管理一个View hierarchy(层次结构)。我们定义的UIViewController如下所示。
#import <UIKit/UIKit.h>
@interface MyViewController : UIViewController {
CGRect frame;
}
@property (nonatomic) CGRect frame;
- (id) initWith_Frame:(CGRect) _frame;
@end
用户也可以用其他已经定义的视图控制器,比如UITabBarController,来管理更复杂的视图层次结构。
如果要使用xib文件来定义UIViewController的视图,必须调用initWithNibName: bundle方法来初始化。
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
注意:每次用xib文件都别忘了connection。要想让xib文件视图不显示为黑屏必须做两件事情。
a)设置File‘s owner 为我们定义的MyViewController。点File’s Owner在Identity Inspector窗口设置Customer class。
b)建立xib文件和File‘s Owner(MyViewController)的view的连接。在File’s Owner的Connection Inspector窗口中,Outlets中的view上拉一条线到左面Objects列表的view。(xcode 4)
如果使用自定义的UiView,必须继承loadiew方法来加载视图。
另外,用xib文件就表定义loadView方法了,不然也可能会显示黑屏。
- (void)loadView
{
UIView* myV = [MyView alloc];
[myV initWithFrame: frame];
[self setView: myV];
[myV release];
}
5。UIView
如果不用xib文件而是自定义视图,就要实现drawRect方法自己画。
- (void)drawRect:(CGRect)rect
{
CGContextRef X = UIGraphicsGetCurrentContext();
CGRect bounds = CGContextGetClipBoundingBox(X);
CGPoint center = CGPointMake((bounds.size.width / 2), (bounds.size.height / 2));
CGContextSetRGBFillColor(X, 0.9,0.9,0.9, 0.8f);
CGContextFillRect(X, bounds);
char* text = "GaGa... NO XIB! Hello iOS!";
CGContextSelectFont(X, "Helvetica Bold", 32.0f, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(X, kCGTextFill);
CGContextSetRGBFillColor(X, 0.1f, 0.3f, 0.8f, 0.85f);
CGAffineTransform xform = CGAffineTransformMake(
1.0f, 0.0f,
0.0f, -1.0f,
0.0f, 0.0f );
CGContextSetTextMatrix(X, xform);
CGContextShowTextAtPoint(X, 0, center.y, text, strlen(text));
}
OK。That‘s all!欢迎多多交流!
分享到:
相关推荐
iOS基础——UI控件案例之xib、plist、mvc
IOS 常用 代码 ios开发入门基础 object-c语言训练
iOS 10应用开发基础教程
C++工程项目里必备的几个基础类,包含读取配置文件类,读写日志类,任务类,数据格式转换类,数据库连接类
iOS 9.1应用开发基础教程大学霸
资源名称:《iOS开发零基础入门教程》(40集)资源目录:【】传智播客《iOS开发零基础入门教程》1.1【】传智播客《iOS开发零基础入门教程》1.2【】传智播客《iOS开发零基础入门教程》1.3【】传智播客《iOS开发零基础...
美国Dave Mark、Jack Nutting、Jeff LaMarche编著的《iOS 5基础教程》是一部关于iOS SDK开发的基础教程,内容翔实、语言生动。几位作者结合消费类设备上的常见实例,循序渐进地讲解了适用于iPhone 4S、iPad 2及iPod ...
ios应用源码之开发iphone的基础例子代码写的很好 .
分享了一个很不错的文件:《iOS 7编程基础》以及《为iOS 7编程》两本书的代码例子,快来看看吧
https://github.com/Ws1797822324/BasisProduct
这是一个常用的基础类压缩包,里面包括了ALIST.H、AQUEUE.H、ASTACK.H、BinNode.H、BinTree.cpp等基础类信息,有需要的朋友拿去
IOS开发中,基础是UI控件,控件的使用离不开方法。归纳其常用的方法,有所裨益
iOS 11应用开发基础教程Swift4.0 iOS 11应用开发基础教程Swift4.0
iOS5开发基础教程.pdfiOS5开发基础教程.pdfiOS5开发基础教程.pdfiOS5开发基础教程.pdfiOS5开发基础教程.pdfiOS5开发基础教程.pdfiOS5开发基础教程.pdfiOS5开发基础教程.pdf
IOS5开发经典基础实例20例,不多说,自己下了看吧,绝对物有所值
对plist 属性文件的操作 里面含两种读取 一种是沙盒里的文件 一种的程序资源里的文件
ios开发 入门教程 适合新手学习交流 共同学习
IOS入门英文经典基础教程,讲解详细,示例简单,适合对有意于苹果移动开发并有一定英文基础的开发人员阅读学习。
是一个以MVC模式搭建的开源功能集合,基于Objective-C上面进行编写,意在解决新项目对于常见功能模块 的重复开发,代码支持iOS7以后版本;超小内存,绝无垃圾文件及无用集成,方便实用,轻量级框架! 不断更新中......
这是ios5开发基础教程附带的源码,课本的每一个例子都有详细的源码,让你更轻松的学习这门课!