AppDelegate
一个空项目中至少包含两个文件,就是AppDelegate的头文件与m文件。这个类定义了整个项目的委托关系,也就是消息响应的关系。
先在头文件中看这是一个默认的单视图模板的AppDelegate的头文件:
#import <UIKit/UIKit.h>
@class ViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
UIWindow *window;
ViewController *viewController;
}
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *viewController;
@end
首先,要使用其他类的变量,要在头文件中用@class声明,之后再在m文件中用#import导入就可以了。
其次,自己定义的类声明是要用@interface,结束用@end。类名之后的冒号后面表示他的超类(父类,在代码中用super),再之后的< >中表示需要在类中使用的方法委托(具体委托的定义在m文件中写),再之后的{}中写成员变量。
@property关键字表示了属性,即存取方法。用这个关键字定义时,成员变量的名字要与@property相同,在好处就是在代码中可以用“.”操作符,就像C/C++中一样对这个实例中的成员变量进行存取操作。@property关键字之后的(strong, nonatomic)是可选属性,表示实例对象如何对待变量。strong只在定义对象指针时使用,nonatomic意思是非原子操作。
然后看看AppDelegate.m文件的头部定义部分:
#import "AppDelegate.h"
#import "ViewController.h"
@implementation AppDelegate
viewController;
前两行是将头文件导入,第三行@implementation表示定义类实例或者方法的开始。@synthesize之后写之前定义属性的成员变量名称。文件结尾要用@end表示定义的结束
在m文件中有一个重要的函数:
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
UIWindow *window是在AppDelegate类创建时就定义好的,表示了整个项目视图的窗口。而 *viewController是我们自己定义的视图控制类,我们要做的就是将自己定义的视图控制类显示在程序的主界面。
1、 将window初始化并分配内存
2、 将viewController分配内存并初始化(注意initWithNibName:参数,是自己的类名)
3、 将viewController 赋值给window的rootViewController
以上三步就是将自己创建的视图控制器显示在程序启动界面上的步骤。
ViewController
一个程序总要一个界面,视图控制类就是管理界面视图的。一般情况下,一个视图控制类要与一个nib文件相关联,具体方法就是在nib文件中,点击file owner,在右边属性面板里修改所属类名称为相应的视图控制类。先看一下视图控制类的头文件:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
<UIActionSheetDelegate>
{
UITextField *nameFiled;
UILabel *slideLabel;
UISwitch *switchleft;
UIButton *button;
}
@property (retain,nonatomic) IBOutlet UITextField *nameFiled;
@property (retain,nonatomic) IBOutlet UILabel *slideLabel;
@property (retain,nonatomic) IBOutlet UISwitch *switchleft;
@property (retain,nonatomic) IBOutlet UIButton *button;
- (IBAction)textFiledDoneEditing:(id)sender;
- (IBAction)backgroundTap:(id)sender;
- (IBAction)sliderChanged:(id)sender;
- (IBAction)buttonPress:(id)sender;
- (IBAction)switchChanged:(id)sender;
- (IBAction)toggleControls:(id)sender;
@end
相同内容不重复,属性定义:@property (retain,nonatomic) IBOutlet UITextField *nameFiled; retain表示保留该实例,同样,在变量是对象指针时需要定义该属性。IBOutlet是输出口,表示该变量是与视图中的相应控件相关联的(通过链接器链接)。 - (IBAction)buttonPress:(id)sender;是消息相应函数,此函数是最简单的按钮消息相应函数,参数sender就是所按按钮的指针(变量类型是id,作为普通变量使用,其实本身就是指针)。
再看一下m文件头部:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize nameFiled;
@synthesize slideLabel;
@synthesize button;
@synthesize switchleft;
没什么好说的,与刚才的一样。
注意其中几个函数:
- (void)viewDidLoad
{
[super viewDidLoad];
}
此函数是在视图加载完毕后,你需要做什么,通常是做一些初始化的工作,如同VS中的OnInitialDialog()。
- (void)viewDidUnload
{
[super viewDidUnload];
}
此函数是在视图卸载完毕后需要做什么,一般是将类中定义的指针赋值为nil。
- (void)dealloc
{
[super dealloc];
}
此函数是在类被清理之前需要做什么,在我理解起来就是析构函数作用差不太多,一般是将类中定义的指针release掉。