前述:4部分
(1)建立两个UIViewController子类
(2)RootViewController.m
(3)SecondViewController.m
(4)AppDelegate.m
注意:一个父类可以被多个子类所继承,但是一个子类只能继承一个父类
下面的变成主要是显现画面的跳转,现在App.m的文件中创建一个视图控制器Root并添加在window窗口中,此视图控制器Root设置成主视图控制器.而一些画面则在Root.m文件中设置.如果要跳转到下一个画面那么我们还是需要另外建立一个SecondViewController试图控制器添加在Root的视图上(此处要记得在Root上引Sencond的头文件.同理在App上引Root的头文件).而设计的画面则在Second中设置.
AppDelegate.m
AppDelegate相当于整个工程的代理人,所以我们现在要减少它的工作,而我们现在添加视图控制器就是为了减少它的工作,让它的界面上只有一个视图控制器.其余各个内容都是在各个试图控制器上实现.
(1)我们要想有点击return回收键盘那么我首先签署协议.
在AppDelegate.h中签署协议
@interface AppDelegate : UIResponder<UITextField>
此处应该注意如果还有要签的协议,将新协议名用逗号隔开
在AppDelegate.m
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
NSLog(@"测试return按钮");
//这句话是实现回收键盘的关键
[textField resignFirstResponder];
return YES;
}
(2)-(void)dealloc{
[_window release];
[super dealloc];
}
(3)下面方法是告诉应用过程序以准备好可以随时使用window内容
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
(4)下面我们就在此方法中设置我们的视图控制器
创建一个RootViewController对象,分担AppDelegate的工作,让它制作分内的事情,视图部分有视图控制器.
RootViewController *rootVc-[[RootViewController alloc]init];
给window设置根视图控制器,而这个视图控制器创建的时候就创建一个与window一样大小的view
self.window.rootViewControlller=rootVc;
[rootVC release];
RootViewController.m
此类首先会有引SecondViewControlller的头文件.
我们在viewDidLoad进行编写
-(void)viewDidload
{
//didLoad视图加载完成
[super viewDidLoad];//监控视图
self.view.backgroundColor=[UIColor yellowColor];//设置试图控制器的视图背景颜色
NSLog(@"%s",__FUNCTION__);
//意思是:依次打印执行的方法名
//铺三个视图,视图的创建和铺设都子viewdidLoad方法中进行
铺设三个textField
UITextField *textField1=[[UITextField alloc]initWithFrame:CGRectMake(100, 200, 150, 30)];
textField1.layer.borderWidth=1;
textField1.layer.cornerRadius=10;
[self.view addSubview:textField1];
textField1.delegate=self;
[textField1 release];
UITextField *textField2=[[UITextField alloc]initWithFrame:CGRectMake(100, 300, 150, 30)];
textField2.layer.borderWidth=1;
textField2.layer.cornerRadius=10;
[self.view addSubview:textField2];
textField2.delegate=self;
[textField2 release];
UITextField *textField3=[[UITextField alloc]initWithFrame:CGRectMake(100, 400, 150, 30)];
textField3.layer.borderWidth=1;
textField3.layer.cornerRadius=10;
[self.view addSubview:textField3];
textField3.delegate=self;
[textField3 release];
铺设button
UIButton *button=[UIButton buttonWithType:UIButtonTypeSystem];
button.frame=CGRectMake(100, 500, 150, 30);
button.layer.borderWidth=1;
[self.view addSubview:button];
[button setTitle:@"下一页" forState:UIControlStateNormal];
[button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
button.layer.cornerRadius=10;
}
设置click,在click里实现跳转及跳转到下一个画面的动画效果
-(void)click:(UIButton *)button{
先创建一个secondVC对象
SecondViewController *secondVC=[[SecondViewController alloc]init];
设置跳转时候的动画效果
[secondVC setModaTransitionStype:UIModaTransitionStypeCoverVertical];
进行跳转:第一个是要去的地方,第二个参数:是否显示这个效果,第三是个block直接回车就好
[self presentViewController:secondVC animated:YES completion:^{
}];
[secondVC release];
}
注释:
//四种动画效果
// UIModalTransitionStyleCoverVertical = 0,
// UIModalTransitionStyleFlipHorizontal,
// UIModalTransitionStyleCrossDissolve,
// UIModalTransitionStylePartialCurl---翻书效果
下面的这个方法是当输入框被键盘挡住时输入框向上移动.
//只要输入框被激活,就会触发这种方法.整体向上移动
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
if(textField.frame.origin.y>self.view.frame.size.height/2){
//只改变坐标不改变大小
//做差值
CGFloat height=textField.frame.origin.y-self.view.frame.size.height/2;
self.view.center=CGPointMake(self.view.center.x, self.view.center.y-height);
}
return YES;
}
等编译结束的时候,让其回到原位
//整个是在移动self.view,父视图的移动会让多有的子视图一同石洞,而且相对父视图的坐标位置不会发生变化,所以可以沿用上一个方法的判断
//移动的是父视图的位置text的位置没变只是view的变化
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
if (textField.frame.origin.y>HEIGHT/2)
{
//只改变坐标部改变大小
//先做一个差值
CGFloat height=textField.frame.origin.y-HEIGHT/2;
self.view.center=CGPointMake(self.view.center.x, self.view.center.y+height);
}
return YES;
}
SecondViewController.m
(1)在ViewDidLoad方法里创建对象
{
self.view.backgroundColor=[UIColor whiteColor];
UIButton *button=[UIButton buttonWithType:UIButtonTypeSystem];
button.frame=CGRectMake(100, 100, 100, 30);
button.layer.borderWidth=1;
button.layer.cornerRadius=10;
[self.view addSubview:button];
[button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"返回" forState:UIControlStateNormal];
}
(2)设置返回上一个界面
-(void)click:(UIButton *)button{
// NSLog(@"测试一下");
//点击返回,回到前一个页面 第一个动画效果 第二个block
[self dismissViewControllerAnimated:YES completion:^{
}];
}
UIViewController小总结
1.这个空间有自己的延展
2.如果我们将自己的工程拉入这个控件里,首先如果LTV是第三方文件那么我们先找到自己的LTV工程,找到LTV的.m.h文件,将其拖到视图控制器中,然后引LTV的头文件
3.程序是先整体运行完,然后点击方法是你点击它才会触发
4.很多方法没写但首先要写一个初始化方法
5.VC的初始化方法,这个方法一般自己调用,不需要我们额外去调用,会初始化一些容器,比如数组字典
6.在重写父类方法都用super先实现的是我们新加内容,保证原功能不变.在super下面写自己的方法
7.三种注释
(1)#pragma mark 如果想重写父类的方法,首先先用super去调用父类的方法,这样可以保证原功能不变,然后在方法里写新加的功能
(2)#pragma mark这个就是 对方法的解释方便理解例如在RootViewController.m中的下一集它是罗列所有的方法用这方法我们可以知道这个方法是什么加注释
(3)#warning这个方法是视图已经出现的意思 手动爆黄与#progma mark的用途相同
8.几种视图方法
(1)视图将要出现
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"%s",__FUNCTION__);
}
(2)视图已经出现
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"%s",__FUNCTION__);
}
(3)视图将要消失
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
NSLog(@"%s",__FUNCTION__);
}
(4)视图已经消失的方法
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
NSLog(@"%s",__FUNCTION__);
}