文档章节

黑马程序员-16-IOS应用程序初步认识

 明天过后1
发布于 2014/10/10 15:54
字数 1527
阅读 46
收藏 0

---------------------- Java培训.Net培训Android培训IOS培训、期待与您交流! ----------------------

1. 应用界面的结构

    (1) 每一个应用的界面一般有状态栏和该应用程序自己的UIWindow( UIWindow 继承与 UIView )

    (2) UIWindow上面有可以放置很多UIView

    (3) 跟用户进行交互的是UIWindow

      

2. 程序的主体构架

        从上面图片我们很容易想到以下问题 :

            (1) 谁来管理UIView的生命周期?

            (2) 谁来管理UIView之间的切换?

            (3) 谁来给UIView装配数据?

            (4) 谁来监听UIView的事件?

        以上答案都是UIViewController,每一个UIViewController.那么 UIViewController Model(数据源) UIView 三者之间的关系如下 :

            

        这就是经典的 MVC 构架 : UIViewController相当于一个中介者,用来负责管理UIView 和 Model的通信.这种设计模式很好地把各类代码分离,降低了代码维护的难度。


3. 应用程序运行的原理

        从一个简单地singleViewApplication来看,程序的入口为main函数:

            (1) 执行 int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName); 函数 :

        // main.m        
        #import <UIKit/UIKit.h>
        
        #import "MJAppDelegate.h"
        
        int main(int argc, char *argv[])
        {
            @autoreleasepool {
                /*
                 * 参数 1 和 参数 2接受了main函数的两个参数
                 * 参数 3 : 接受一个 继承与 UIApplication 的类的名称字符串,如果为空,则默认使用 NSStringFromClass( [UIApplication class] )
                 * 参数 4 : 接收一个应用程序的代理类的名称的字符串
                 */
                return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
            }
        }

                (2) 通过这个函数首先会创建一个 UIApplication 的单例对象,然后开启一个main loop 消息循环

                (3) 然后根据传入的类名创建和设置UIApplication代理,通过给代理对象发送消息来监听 UIApplication 的生命周期  

                (4) 在UIApplication加载完毕后发送消息给代理完成UIWindow的初始化工作

            // MyAppDelegate.m
            #import "MyAppDelegate.h"            
            
            #import "MyViewController.h"
            
            @implementation MyAppDelegate
            
            - (void)dealloc
            {
                [_window release];
                [_viewController release];
                [super dealloc];
            }
            
            - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions // 在应用程序加载完毕之后调用
            {
                NSLog(@"didFinishLaunchingWithOptions-加载完毕");
                
                // 初始化一个窗口
                self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
                
                // 传入xib文件名来初始化一个控制器
                self.viewController = [[[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil] autorelease];
                
                // 设置窗口的根控制器
                self.window.rootViewController = self.viewController;
                // 上面的代码内部执行了下面代码的操作
                // [self.window addSubview:self.viewController.view];
                
                // 窗口不会默认显示,需要调用方法来显示
                // keyWindow是主窗口,只有主窗口才能跟用户正常交互
                [self.window makeKeyAndVisible];
                // self.window.hidden = NO;
                return YES;
            }
            
            - (void)applicationWillResignActive:(UIApplication *)application                                              // 程序失去焦点的时候调用(不能跟用户进行交互了)
            {
                NSLog(@"applicationWillResignActive-失去焦点");
            }
            
            
            - (void)applicationDidEnterBackground:(UIApplication *)application                                           // 当应用程序进入后台的时候调用(点击HOME键)
            {
                NSLog(@"applicationDidEnterBackground-进入后台");
               
            }
            
            - (void)applicationWillEnterForeground:(UIApplication *)application                                          // 当应用程序进入前台的时候调用
            {
                NSLog(@"applicationWillEnterForeground-进入前台");
            }
            
            // 获取焦点之后才可以跟用户进行交互
            - (void)applicationDidBecomeActive:(UIApplication *)application                                             // 当应用程序获取焦点的时候调用
            {
                NSLog(@"applicationDidBecomeActive-获取焦点");
                
            }
            
            - (void)applicationWillTerminate:(UIApplication *)application                                              // 程序在某些情况下被终结时会调用这个方法
            {
                NSLog(@"applicationWillTerminate-被关闭");
                
            }
            @end


4. UIView事件的绑定

    由于UIView的事件处理是由 UIViewController 来负责处理的,因此成员变量的设定在UIViewController上:

    // MJViewController.h
    #import     <UIKit/UIKit.h>
    
    @interface MJViewController : UIViewController
    
    // UI元素一般用assign即可
    /*
        这些UI元素声明周期已经被UIView很好地管理了,
        而UIView已经作为UIViewController的成员变量它的生命周期已经得到很好地管理了
        因此管理了UIView的声明周期相当于管理了UIView的子元素的生命周期
        因此这里无须额外增加管理生命周期的工作量,使用assign即可
     */
    // IBOutlet 可以让子元素成员变量显示到xib文件中
    @property (nonatomic, assign) IBOutlet UITextField *qq;
    @property (nonatomic, assign) IBOutlet UITextField *pwd;
    
    // IBAction其实就是void
    // IBAction可以让方法名,显示到xib文件右击列表中
    - (IBAction)login;
    
    @end

    a. UIViewController的UIView的赋值

         

     b. 获得UIView子元素的引用

        

    c. UIView点击事件绑定

        

        


5. 点击事件处理

#import "MJViewController.h"

@interface MJViewController ()

@end

@implementation MJViewController

#pragma mark 登录
- (void)login {
    // 获取文本输入框的内容
    NSString *qqText = _qq.text;
    NSString *pwdText = _pwd.text;
    
    NSLog(@"QQ=%@,密码=%@", qqText, pwdText);
    
    // 暂时理解:叫出键盘的那个视图就是第一个响应者(FirstResponder)
    // resignFirstResponder代表这个视图不想当第一响应者了,于是键盘就会退出
    //[_qq resignFirstResponder];
    //[_pwd resignFirstResponder];
    
    // 如果第一响应者存在于self.view里面,就可以退出键盘
    [self.view endEditing:YES];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end


6. 总结

    (1) 应用程序基本构架是 M(数据源),V(视图,UIView),C(UIViewController),UIViewController包含UIView,和数据源,当UIView需要数据来更新界面时候通过UIViewController来收集用户的数据,然后UIViewController把处理好的数据发送给UIView并控制其更新。

    (2) 应用程序启动过程大概经历以下步骤 : 

        1) 执行 UIApplicationMain 函数,传入UIApplication的类名,和UIApplication代理的类名

    2) 开启 main loop 消息循环,创建 UIApplication 对象,并创建代理来监听 UIApplication 的生命周期

    3) 当 UIApplication 加载完毕时候会发送 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 消息给代理

    4) 这时在此方法中完成界面初始化工作 :

        a. 初始化UIWindow对象

        b. 根据xib文件创建UIViewController

        c. 把窗口的控制器成为UIWindow的根控制器(里面至少执行了把 UIViewController 的UIView添加到 UIWindow上 : [self.window addSubview:self.viewController.view];)

        d. 让该 UIWindow 对象成为keyWindow来完成与用户之间的交互。

    (4) 对于事件处理 首先给相应地方法绑定IBAction标志,然后在xib文件中进行绑定

    (5) 要处理UIView元素的数据首先获得其引用(assign策略),然后使用IBOutlet来在xib绑定引用.


---------------------- Java培训.Net培训Android培训IOS培训、期待与您交流! ---------------------- 

 详情请查看:http://edu.csdn.net/heima



© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 23
码字总数 36166
作品 0
佛山
私信 提问
西安活动〡有逼格有技术!西安移动互联社区,邀你免费加入!

西安移动互联社区首秀活动就要开始啦!!! 这是一个有想法、有内容、有行动的社区。在这里,你可以交流技术、谈谈未来、聊聊各自对移动互联网的看法,或许,你会学到新技能、认识新朋友、发...

jobthoughtworks
2016/05/20
57
0
【书坊赠书福利——第二期】《iOS 8开发指南》

本周是人邮IT书坊赠书的第二期,第一期参与度极高,微信君在此感谢你们的支持,第一期获奖赠书已全部寄出。 本周赠品 本周,微信君给大家推荐@人民邮电出版社-信息技术分社 刚刚上架的新书《...

生气的散人
2014/09/23
371
0
如果编程替换成中文就会怎样? 程序员看了表示头疼

如果编程替换成中文就会怎样? 程序员看了表示头疼 2018-06-20 17:50编辑: garace分类:程序人生来源:代码湾 代码编程中文代码 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发工程师...

garace
06/20
0
0
程序员之间的搞笑对话!测试妹子弄得大家好尴尬!

程序员之间的搞笑对话!测试妹子弄得大家好尴尬! 2018-07-30 10:23编辑: 枣泥布丁分类:程序人生来源: 程序员搞笑对话 招聘信息: iOS开发 iOS开发 iOS开发 app开发上架H5技术 app开发技术...

枣泥布丁
07/30
0
0
10个必需的iOS开发工具和资源

界面总不是一件很容易事,尤其是iPhone/iPad的界面,做过iOS开发的程序员,一定会感到开发iPhone/iPad的界面是一件多么不容易的事。下面的文章来自10 Essential iOS Developer Tools & Reso...

长平狐
2012/08/13
83
0

没有更多内容

加载失败,请刷新页面

加载更多

zookeeper配置与使用

一.登录官网下载 不要带后缀的,那是公侧版本,下稳定版,比如3.4.9 二.安装与使用 解压后bin里是启动程序 配置文件:在conf下 复制zoo_sample.cfg改名为为zoo.cfg,打开zoo修改文件...

小兵胖胖
20分钟前
0
0
spring源码阅读笔记(一)

ClassPathXmlApplicationContext 与 FileSystemXmlApplicationContext 用了这么久的框架,是时候搞一下源码了,一般最初接触spring 从以下步骤开始 创建一个bean类 并创建 ooxx.xml之类的spr...

NotFound403
43分钟前
2
0
MySQL主从配置

12月14日任务 17.1 MySQL主从介绍 17.2 准备工作 17.3 配置主 17.4 配置从 17.5 测试主从同步 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单将就是A/B两个服务器做主从后,在A上写...

robertt15
46分钟前
6
0
我的Linux系统九阴真经

在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了。各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行业,共享经济等概念的公...

问题终结者
58分钟前
21
0
Java 使用 gson 对 json 根据 key 键进行排序

引入Google的gson jar <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version>......

yh32
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部