创制控制器的章程、控制器加载view进程、控制器view的生命周期、多控制器组合

前言
Java从大二开头读书到现行反革命大四也有大概两年了,但是由于以前一贯在玩,没有认真学过,直到未来才起初重新学习。也是很凑巧,看到了黄勇先生的《架构探险》,于是便开始上学写Java
Web框架。

在介绍第四次全国代表大会目的的那篇博客中,能够着力驾驭到程序运转的进度:

1.开发工具
《架构探险》书中涉及说AMDliJ
IDEA(简称IDEA)是产业界最牛的Java开发工具,可是它有八个版本,三个社区版不花钱,属于开源的个人版,不过效果不健全,另二个是完全版,属于收费的商店版,作用完善。于是本人本着要用就用最好的的宏旨,毅然下载了收费版的,在装置进程中也发现了那款开发工具的贰个小Bug,因为这一个工具收费版有30天的试用期,大家能够在装置在此之前把电脑系统时间修改到推后7个月,比如未来是2016年二月,大家可以改成前年一月,这样设置到位后它的试用期就会到前年十八月,之后先关闭软件再把系统时间改回来就OK了,它的试用期依旧是前年二月。

main–>UIApplicationMain–>创设UIApplication的实例和app代理AppDelegate的实例并设置好代理—>在程序运行后,也正是开发银行画面显示之后,
AppDelegate成立UIWindow(能够是半自动成立的,也能够手动创制)

图片 1

当今谈论的难题是,怎样成立控制器并安装为UIWindow的根控制器,然后加载出控制器中的view并显示出来。

其后的安装进度就比较简单了,提示一点的是,最好不要改的太多,推后的时刻在一年以内,当先一年安装会有报错。

本文目录

2.做三个小项目
在开首正儿八经工作在此之前,先做二个Hello
World(好像有所支出都离不开这一步)。一是百发百中一下Maven,二是复习一下Servlet和JSP。开首!!!

1.开立三个Maven的品种
Maven
是3个品种管理和创设自动化学工业具。可是对此程序员而言,更注重它的门类塑造成效。可是对于使用IDEA作为开发工具,也不用单独下载、配置Maven,因为IDEA暗中认可将其构成了。使用IDEA创设Maven项目很简短:
  a.点击右上角工具栏的File/New/Project。
  b.在弹出框选拔Maven,然后Next。
 
c.在接下去的窗口中,那多个是必填的,很重点的事物。GroupId提议为网站域名的倒排格局,确认保障唯一性,类似于Java的包名;ArtifactId是模块名称,这么些自动起名。
  d.继续Next,输入Project name,然后Finish。
到此,Maven项目就创办实现了。

-1.创办控制器的两种办法)

2.配置Maven
打开Maven配置文件pom.xml,之后举办一名目繁多的配备,配置完毕后的旗帜:

1.创造控制器的两种方式

1> 间接通过alloc + init的方法开创
2> 通过加载storyboard文件来创建一个控制器
3> 通过点名的xib文件来创设控制器

方法一:

// 1.创建window self.window是强指针
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
// 2.创建控制器,并设置为window的根控制器
MKOneViewController *oneViewController = [[MKOneViewController alloc]init];
self.window.rootViewController = oneViewController;
// 3.设置self.window为主窗口, 并显示
[self.window makeKeyAndVisible];

方法二:

// 1.创建window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.通过storyboard加载控制器,并将initialViewController设置为window的根控制器
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Two" bundle:nil]; // sb加载
MKTwoViewController *twoViewController = [sb instantiateInitialViewController]; // 用sb初始化initialViewController
self.window.rootViewController = twoViewController;
// 3.设置window为主窗口并显示
[self.window makeKeyAndVisible];
注意如果想加载的不是initialViewController,而是sb文件中的其他controller,根据控制器的Storyboard ID来创建:
[storyboard instantiateViewControllerWithIdentifier:@"vmid"];

方法三:

是让整个xib文件中的控件都让controller管理,xib中没有控制器,而是设置xib的files owner为指定的控制器,控制器用initWithNib创建
// 1.创建window
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
// 2.使用xib加载控制器,并设置为window的根控制器
MKThreeViewController *threeViewController = [[MKThreeViewController alloc]initWithNibName:@"MKThreeView" bundle:nil];
self.window.rootViewController = threeViewController;
// 3.设置self.window为主窗口,并显示
[self.window makeKeyAndVisible];

接纳xib要求专注的是:

要是成立控制器的时候,
没有明了钦赐xib文件(也等于运用那样的代码创造[[MKThreeViewController
alloc]init]),
那么暗中同意系统回去寻找一个与控制器名字如出一辙的(可是去掉后缀Controller,相当于MKThreeView.xib)的xib文件,
要是找了则动用那个xib中的view作为控制器的私下认可view(前提是现已将view连线,即使没有设置files
owner也是能够的)。

假诺找不到则尝试去找一个与控制器名字同样的xib文件(MKThreeViewController.xib),
然后选取这么些xib文件中的view作为控制器默许的view。就算都找不到,
那么就创制1个晶莹剔透的view(空的view)。

提出将那样的xib起名为带controller后缀的,因为它的功能就也就是一个controller,类似于sb中的八个controller。

 

 

 

-控制器的view的创造进度)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">             
   <modelVersion>4.0.0</modelVersion>    
   <groupId>org.smart4j</groupId>    
   <artifactId>chapter1</artifactId>    
   <version>1.0.0</version>
   <properties>    
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   <build>    
     <plugins>        
       <!-- Compile -->        
       <plugin>            
          <groupId>org.apache.maven.plugins</groupId>            
          <artifactId> maven-compiler-plugin</artifactId>            
          <version>3.3</version>            
          <configuration>                
            <source>1.8</source>                
            <target>1.8</target>            
          </configuration>        
       </plugin>        
       <!-- Test -->        
       <plugin>            
         <groupId>org.apache.maven.plugins</groupId>             
         <artifactId>maven-surefire-plugin</artifactId>            
         <version>2.18.1</version>            
         <configuration>                
           <skipTests>true</skipTests>            
         </configuration>        
       </plugin>        
       <!-- Tomcat -->        
       <plugin>            
         <groupId>org.apache.tomcat.maven</groupId>            
         <artifactId>tomcat7-maven-plugin</artifactId>             
         <version>2.2</version>            
         <configuration>                
            <path>/${project.artifactId}</path>            
         </configuration>        
       </plugin>    
     </plugins>
   </build>

   <packaging>war</packaging>  

   <dependencies>        
     <!-- Servlet -->        
     <dependency>            
       <groupId>javax.servlet</groupId>            
       <artifactId>javax.servlet-api</artifactId>            
       <version>3.1.0</version>            
       <scope>provided</scope>        
     </dependency>        
     <!-- JSP -->        
     <dependency>            
       <groupId>javax.servlet.jsp</groupId>            
       <artifactId>jsp-api</artifactId>            
       <version>2.2</version>            
       <scope>provided</scope>        
     </dependency>        
     <!-- JSTL -->        
     <dependency>            
       <groupId>javax.servlet</groupId>            
       <artifactId>jstl</artifactId>            
       <version>1.2</version>            
       <scope>runtime</scope>        
     </dependency>    
   </dependencies>  
</project>

2.控制器的view的创导进度

回到顶部

控制器的负责它管理的view的成立,view到底是什么开始展览创办的吗,一般的话view的创设和控制器的始建立模型式是有涉及的,控制器的view有以下三种创立的法子:

  1. 经过storyboard创制, 创设完控制器后,
    自动调用loadView方法,成立控制器的view。
    ** 此时自定义的控制器, 因为从没”重写”(“实现”)loadView方法,
    所以loadView方法内部就是依据storyboard文件中的view来创立View的。

  2. 通过xib文件创设, 成立完控制器后, 自动调用loadView创制控制器的view。
    ** 此时自定义的控制器, 因为尚未”重写”(“完成”)loadView方法,
    所以loadView方法内部正是依照xib文件中的view来成立View的。

3.
经过重写(达成)UIViewController的loadView方法重写。(自身通过代码来创设控制器的View)
*** 控制器的loadView方法便是用来自定义View的。
** 假诺要为控制器自定义View, 要写在loadView中,
不要写在viewDidLoad中。
*** 借使重写(完结)loadView方法中调用了[super loadView],
那么还是会接纳私下认可的措施来加载。
***
重写ViewController的loadView方法,用来自定义View,当自定义view的时候,
就毫无调用[super loadView]了。
[super loadView];约等于履行了瞬间代码

if (是否是根据storyboard来创建的控制器) {
   self.view = storyboard中的控制器中的view;
} else if (xib) {
   self.view = xib中的view;
} else {
   self.view = 透明的一个view
}

“ ** 注意:无论是通过加载xib创设view、storyboard成立view,
最后都凭借于loadView方法来创建。那一个点子分明了最终的view。

** 注意:修改了花色文件(比如:xxx.xib等,要先Product -> Clean,
然后把软件从模拟器中卸载, 然后再运营。)

** 控制器的loadView方法哪一天调用?
**
在急需用到控制器的view的时候才调用(当调用UIWindow对象的makeKeyAndVisible方法时,就须求出示该view了,
此时就表示用到View了。), 那些就称为”延迟加载”。
** 比如当使用self.view.backgroundColor ,
要设置控制器的view的背景象时(那时需求用到view了),
那么此时才会起来创建该控制器的view, 也正是说要调用loadView方法了。所以,
假如在loadView方法内部调用self.view.backgroundColor, 就时有发生死循环了。

** 能够通过调用控制器的self.isViewLoaded
方法来判定当前控制器的view是或不是业已加载达成了。

** 并且当控制器的view加载达成后, 会调用viewDidLoad方法(系统和谐调用)。

 

 

 

-Controller的view的生命周期)

第③是安顿编码格式为UTF-8:

3.Controller的view的生命周期

上面是代表控制器视图的生命周期的几个方法

  1. viewDidLoad
  2. viewWillAppear
  3. viewDidAppear
  4. viewWillDisappear
  5. viewDidDisappear
  6. viewWillUnload
  7. viewDidUnload
    上边是那么些艺术的调用顺序图:
    图片 2 假留存四个控制器:
    次第运维后:OneController的viewDidLoad—>OneController的viewWillAppear—>OneController的viewDidAppear

跳转到第2个界面:Two的viewDidLoad—>One的view威尔Disapear—>Two的viewWillAppear—->
One的viewDidDisappear—>Two的viewDidAppear

再次回到第①个界面:Two的view威尔Disapear—>One的view威尔Appear—->
Two的viewDidDisappear—>One的viewDidAppear
(one的view不需再一次创设)

重新跳到第二个界面:和第①遍一样,two的view需求创设。

 

 

 

-4.导航控制器的运用)

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>

4.导航控制器的选取

回来顶部

导航控制器自个儿和其余控制器没什么太大不相同,可是导航控制器能够承担页面包车型地铁条状,用来保管一组控制器,那么些被管理的控制器成为它的子控制器(一定和子类的概念差异开)

** 使用手续:
1> 创造、初阶化二个导航控制器: UINavigationController.
2> 设置UIWindow的rootViewController为UINavigationController.
3> 通过调用push方法添加子控制器到UINavigationController。
** 注意:哪个人是末了一个push进来的,当前来得的正是哪位ViewController,在-
(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中

UINavigationController *nav = [[UINavigationController alloc]init];
self.window.rootViewController = nav; // 设置为window的根控制器  

MKOneViewController *oneVC = [[MKOneViewController alloc]init]; 
[nav pushViewController:oneVC animated:YES]; // 将页面跳转到oneVC的view

一般的应用程序中,要是有导航控制,会在开立导航控制器的时候钦赐它的始发控制器,而不是接纳push的主意将开头控制器入栈push:

OneViewController *oneVC = [[OneViewController alloc]init];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:oneVC];
self.window.rootViewController = nav;

NavigationController以下多少个措施也正如常用:

[nav popViewControllerAnimated:YES]; // 弹出栈顶的控制器, 返回

[nav popToRootViewControllerAnimated:YES]; // 依次弹出栈顶控制器,直到显示根控制器的view

要想设置导航条的片段性质,需在导航控制器的子控制器中分别设置:
在各类控制器的viewDidLoad方法中设置当前控制器的navigationItem属性。
navigationItem属性的具体内容:
* title属性
* titleView属性
* leftBarButtonItem本性:只可以设置左上角的2个按钮
* leftBarButtonItems性情: 可以设置左上角有四个按钮
* rightBarButtonItem质量:只好设置右上角的一个按钮
* rightBarButtonItems品质: 能够安装右上角有多少个按钮
* backBarButtonItem品质: 设置下三个控制器,
左上角的按钮。默许情状下,该按钮文字与上3个控制器的title文字相同。
万一采用storyboard设置导航栏和它的字控制器,必要小心的是:导航控制器向子控制器连线的时候选拔的是relationship
segue:view controllers。

 

 

 

-5.UITabBarController的总结利用)

下一场配置JDK为1.8(这些看个人,因为本身电脑里JDK版本为1.8)和汤姆cat为7:

5.UITabBarController的简便利用

归来顶部

大概与navigationController的创立方式一样
添加子控件的时候能够动用
viewControllers属性可能setViewControllers:方法添加贰个控制器数组
可是无法选择childViewController属性,那是三个只读的天性,下边是三个大约的运用例子:

// 1.创建self.window
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
// 2.创建tabBarController控制器并设置它的子控制器,同时设置为window的根控制器
UITabBarController *tab = [[UITabBarController alloc]init];

OneViewController *one = [[OneViewController alloc]init];
TwoViewController *two = [[TwoViewController alloc]init];
ThreeViewController *three = [[ThreeViewController alloc]init];

//    [tab setViewControllers:@[one, two, three]];
tab.viewControllers = @[one, two, three];

self.window.rootViewController = tab;
// 3.将window设置为主界面并显示
[self.window makeKeyAndVisible];

经过storyboard设置导航栏,是在导航栏显示的时候将拥有的按钮都展现了出去,而不像针对每种子控制器设置的领航那样延迟加载。
注意连线时,选取的是relationship
segue

-6.TabBarController>>NavigationController>>ViewController主流框架)

<build>    
   <plugins>        
   <!-- Compile -->        
   <plugin>            
      <groupId>org.apache.maven.plugins</groupId>            
      <artifactId> maven-compiler-plugin</artifactId>            
      <version>3.3</version>            
      <configuration>                
         <source>1.8</source>                
         <target>1.8</target>            
         </configuration>        
   </plugin>        
   <!-- Test -->        
   <plugin>            
      <groupId>org.apache.maven.plugins</groupId>             
      <artifactId>maven-surefire-plugin</artifactId>            
      <version>2.18.1</version>            
      <configuration>                
         <skipTests>true</skipTests>            
      </configuration>        
   </plugin>        
   <!-- Tomcat -->        
   <plugin>            
      <groupId>org.apache.tomcat.maven</groupId>            
      <artifactId>tomcat7-maven-plugin</artifactId>             
      <version>2.2</version>            
      <configuration>                
         <path>/${project.artifactId}</path>            
      </configuration>        
   </plugin>    
 </plugins>
</build>

6.TabBarController>>NavigationController>>ViewController主流框架

回来顶部

脚下的大多数程序都使用了TabBarController>>NavigationController>>ViewController主流框架,window的根控制器是一个UITabBarController,其子控制器为三个UINavigationController,各样NavigationController能够segue或许modal出任何的控制器。

再然后配置打包类型为war包:

<packaging>war</packaging>

末尾布署Servlet、JSP、JSTL(Maven三坐标必须提供,之后的Servlet和JSP因为汤姆cat自带有相应的jar包,故scope设置为provided;而JSTL是在运行时要求,编写翻译时不需求,故scope设置为runtime):

<dependencies>        
   <!-- Servlet -->        
   <dependency>            
      <groupId>javax.servlet</groupId>            
      <artifactId>javax.servlet-api</artifactId>            
      <version>3.1.0</version>            
      <scope>provided</scope>        
   </dependency>        
   <!-- JSP -->        
   <dependency>            
      <groupId>javax.servlet.jsp</groupId>            
      <artifactId>jsp-api</artifactId>            
      <version>2.2</version>            
      <scope>provided</scope>        
   </dependency>        
   <!-- JSTL -->        
   <dependency>            
      <groupId>javax.servlet</groupId>            
      <artifactId>jstl</artifactId>            
      <version>1.2</version>            
      <scope>runtime</scope>        
   </dependency>    
</dependencies>

到此,Maven的布局也做到了(确实比Eclipse之类的布署简单的多)。

3.转换为Java Web项目
只需3步,轻松消除,
a.在main目录下新建webapp目录。
b.在webapp目录下新建WEB-INF目录。
c.在WEB-INF目录下新建web.xml。
此时,荧屏右下角会有个提示:

图片 3

那正是说表示,web项目已经创办达成。

4.编写Servlet类和JSP页面
在main目录下的java目录下新建包,包名,然后新建3个Servlet(HelloServlet),该Servlet负责页面跳转,并且将眼下时光更换为专业格式传递到页面当中。(在那边有一些,作者照着黄勇先生的步骤在Servlet页面跳转时候的途径是”/WEB-INF/jsp/hello.jsp”,不过页面平昔报错提醒404,后来自个儿查找资料才找到,页面不可能写在”/WEB-INF”目录下,于是改成下边这么些样子就能够显示了):

package org.smart4j.chapter1;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet{    
      @Override    
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        
       DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        
       String currentTime = dateFormat.format(new Date());        
       req.setAttribute("currentTime", currentTime);        
       req.getRequestDispatcher("/jsp/hello.jsp").forward(req, resp);   
   }
}

此后新建二个承担展现的JSP页面,该页面收取Servlet传递过来的参数并因而JSTL表达式展现:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
 <head>
  <title>Hello</title>
 </head>
 <body>
  <h1>Hello!</h1>
  <h2>当前时间为:${currentTime}</h2>
 </body>
</html>

5.配置Tomcat
写好页面和Servlet之后就须求配备一个服务器,把写的东西在能够显得出来。在那里肯定是要安顿汤姆cat服务器了:
  a.点击右上角工具栏中的“艾德it Configurations…”(这是三个下拉框)。
  b.点击左上角的“+”按钮,选用“汤姆cat Server/Local”。
  c.Name自身起个名字,然后去掉勾选的After launch。
  d.点击Application
server左侧的“Configure…”按钮,配置汤姆cat(那几个会自动帮您寻找你电脑上的汤姆cat)。
 
e.切换成Deployment选项卡,点击左侧“+”按钮,采取“Artifact…”选项,在弹出框中甄选“项目名:war
exploded”,点击OK,然后在Application context中输入项目名。
  f.切换回Server选项卡,在On frame deactivation下拉框选取“Update
resources”选项,点击OK。
到此,汤姆cat配置达成。

6.上传到git
本人照着书上的主意上传时候一向提示错误:“fatal: The current branch master
has no upstream
branch.”。后来自家又重新从git上先clone下来,然后把仓库导入项目根目录下
之后才健康提交,或然是自己操作有标题,然则本人也平昔尚未找到难点在何方,只能用最笨的方式了。。。。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图