iOS 实战开发课程笔记

本贴目的在于作为对极客班 《iOS
开发实战》第肆期期课程录像重新学习的笔记。
对象是创立贰个比较完好的 iOS
开发知识点框架以及高速手册,小编想找工作……所以,打结实点基础,你们懂的。
对一一内容的详实研讨会在读书已毕后打开新贴浓厚探索。
简书小编不了解怎么添加目录,所以自身以为说不定在乐乎上看会更清晰点……篇幅过长。
这是自作者的今日头条博客账号,欢迎各位同学吐槽。
http://blog.csdn.net/mubinhuang/article/details/50649650
该贴仍在不断完善中。

0 导论


0.1 技术帮忙

0.1.1 苹果技术协理

0.1.2 其余技术帮忙

  • stack overflow 社区
  • OurCode 社区
  • Cocoa China 社区
  • V2EX 社区
  • GitHub (指出查看学习 awesome iOS 系列)

0.2 学习格局

0.2.1 方法

  • 认真看视频。
  • 整治笔记。
  • 达成磨练示例。

0.2.2 参考书

  • ios 9 programming fundamentals with swift
  • ios 7 programming fundamentals (Objective-C)

0.2.3 App Programming Guide for

  • 界面基础

View Controller Programming Guide
View Controller Catalog
View Programming Guide
UIKit User Interface Catalog
Event Handing Guide

  • 图片和卡通片

Drawing and Printing Guide
Concurrency Programming Guide
Quartz 2D Programming Guide
Core Animation Programming Guide

  • 网络与储存

Network & Internet Starting Point (知道个趋势)
Networking Overview (通晓个概念)
Data Management Starting Point (知道个样子)

  • 其他

Auto Layout Guide
Scroll View Programming Guide
Table View Programming Guide
Collection View Programming Guide

<br />

1 Hello Word


1.1 创立新工程

  • Create a new Xcode project
  • File -> New -> Project [shift + command + N]

1.2 选用工程模板

可以选用种种各个的工程模板,包含 iOS, OS X, watchOS, tvOS 一般采用 iOS
-> Single View Application。

1.3 工程音讯

  • Project Name:产品名称
  • Organization Name:组织名称
  • Organization Identifier:新产品唯一名,一般把公司域名反过来写。
  • Language:运转语言
  • Devices:运转设备(通用,华为,华为平板)
  • Use Core Data:是或不是拔取数据存储
  • Include Unit Tests:测试模块
  • Include UI Tests:UI测试模块

1.4 Git 仓库

版本控制
Source Control:Create Git repository on My Mac
接二连三版本控制有尤其篇幅。

1.5 Xcode界面叩问

1.6 Storyboard

  • 图层识别
    当选图层之后,可以在 libraries -> identity inspector ->
    Document -> Label 中安装图层名称,可以变更图层在 Storyboard 的
    Document Outline 中的名称。以造福识别。
  • 组件 library
    可以拖动那里的各个零部件到 canves 或内部对应的图层上。
  • 设置 Document Outline 显示名称
    当选组件 -> Indentity inspector -> Document -> Label
  • 设置 ViewController 尺寸
    选中 ViewController -> Attributes inspector -> Simulated
    Merices -> Size

1.7 模拟器

  • 来得尺寸调节
    Window -> Scale -> … [command + 1-5]
  • 设备操作
    Hardware -> …
  • 回到出厂设置
    Simulator -> Reset content and Settings…

1.8 真机调试

  • 加上调试账号
    Xcode -> Preferences -> Accounts -> +
  • 设置调试账号
    Workspace -> General -> Identity -> Team 举行抉择 -> Fix
    issues
  • 运行
    首次运营会提醒错误,需求真机验证
    真机 -> 设置 -> 通用 -> 描述文件 -> 选中信任 -> 回到
    Xcode 再一次运行

1.9 App 基本概念

  • iOS App 代码结构(那是 Objective-c 语言,斯维夫特 有所分裂,main
    文件会被隐形)

    • main()
    • UIApplicationMain()(生成3个 UIApplication
      对象并安装成为该使用的代理。)
    • UIApplication 对象
    • UIApplicationDelegate
  • iOS App 运维环境
    • Sandbox
    • 获取目录 NSHomeDirectory()
  • iOS 应用皆以三个 Bundle
    • Bundle: 带有 Info.plist 字典的目录
    • 经过 NSBundle 类访问其中的财富
    • 重若是通过 mainBundle
    • resource bundle 和 framework(可举办动态库)
  • 查看 App Bundle
    设置栏中挑选设备 -> Generic iOS Device -> command + B 构建-> Workspace -> Products -> xxx.app -> 右键 查看文件
    -> 右键 显示包内容

<br />

3 Button – Storyboard 与代码之间联系方式


介绍最常用的 Interface 组件之一 UIButton,以及它的施用方法。
故而介绍 Outlet Action 等概念。

3.1 UIButton

3.2 IBOutlet

  • IBOutlet Connection
    把 Nib object 与 代码中的 IBOutlet 变量相连接

    • 在 Storyboard 少校组件与代码中的 IBOutlet 变量举办连接后,会在
      Storyboard 代码中多出去这么一段连接表达

      <connections>
          <outlet property="okLabel" destination="QJt-2z-ban" id="mhJ-Nu-TIR"/>
      </connections>
      // property 变量名称
      // destination 界面上的组件名称
      // id 标志这个连接本身
      
    • 运作时调用
      由于 xib
      中储存的是界面模板,所以在同意的时候,类实例代码会触发界面的实例化方法。
      最终调用 [UINib instantiateWithOwner:options:]
      方法实例化界面。
      Owner 实际上是调用了三个按名字绑定的习性。
      [owner setValue:uiObj forKey:outlet.property]

事实上我自身都看不懂那段在说怎么……大概是说 outlet connection
其实是标注了界面与代码之间的关系,然后在程序运维的时候,会通过一多级
runtime
方法调用这种关涉,并基于界面模板实例化界面组件,从而生成组件绘制吧。

  • Action Connection

    • 界面事件连续 IBAction

      <connections>
          <action selector="buttonAction:" destination="BYZ-38-t0r" eventType="touchUpInside" id="BQA-pw-9f8"/>
      </connections>
      // selector 方法名称
      // eventType 事件类型
      

<br />

4 Image


图片流:界面全体由现成的图片构成。耗内存,可是简便。
代码流:界面全体由代码绘制而成,省外存,适应性高。

4.1 UIImage

  • 图形加载

  • 图片动画

    let anmiationImage = UIImage.animatedImageNamed("ImageArrayName", duration: 2.0)
    // ImageArrayName 是动画图片的前缀,动画图片资源应该按照该名称后面加数字来命名。
    // duration 是总时长。
    // KeyNote 可以导出动画的每帧图片。
    

4.2 Assert Catalog

  • Assert Catalog 介绍

    模板会暗中同意生成3个 Assert Catalog 文件同时其中有 Appicon 以用于给
    App 提供系统图标。
    一贯用图形名字的点子加载图片,固然方便,可是出于那样的做法会把图片缓存在内存中,在图纸较多尺寸较大时会照成内存压力。

  • Assert Catalog 功能

    • 添加图片:直接将图片财富拖入 Asset Catalog,或许上边的 + 号。

    • 财富属性:逐个图片能够有多个尺码以提须求差距的显示器尺寸使用。还能设置适用各个设备和各样特定尺寸
      Attributes -> Devices。

    • 图表切片:点击图片 -> Attributes -> Slicing -> Slices
      -> …

  • 适用矢量图片

    • 停放对应的图片格式进去 Assert Catalog 之后,然后设置其性质。

    • Attributes -> Devices -> Scale Factors -> Single Vector

<br />

5 第一个 App


5.1 须求分析

  • 详见询问应用必要,必要适度明白用户想要的是何许。
  • 详尽规划利用的逻辑流程,种种模块效率的原故和去向。

5.2 程序设计

平衡设计原则:设计程序时为前途大概的急需做好准备。但是那种办法有好有坏,有时候考虑太多,就会促成当前业务难以已毕。假如完全只考虑当下,就或然增添今后重构的次数。中间的度须求靠程序员把握。

  • 走通流程图,确认游戏逻辑
  • 认可静态数据结构

5.3 示例代码结构

逐条代码模块之间的联系和涉嫌的肯定。

5.4 Keynote 课件呈现

<br />

6 View Controller


6.1 简单的设计情势介绍

6.2 UIViewController

  • UIViewController 介绍

  • 获取 ViewController

    • 创建 rootViewController
      • Info.plist 中的 UIMainStoryboardFile, NSMainNibFile
        指定了根控制器的发源。
      • UIApplication 会通过调用
        _runWithMainScene:transitionContext:completion: 方法。
      • 然后调用 _loadMainInterfaceFile 来取出 Info.plist 中
        UIMainStoryboardFile 或者 NSMainNibFile 信息。
      • 纵然是前者,则再调用
        _loadMainStoryboardFileNamed:bundle:
      • 假如是接班人,则再调用 _loadMainNibFileNamed:bundle:
    • 加载好 rootViewController 之后就把那几个视图控制器赋值给
      appDelegate.window.rootViewController。
    • 若果上述方法早先化界面战败,则会调用
      UIApplicationDelegate didFinshLaunch
      方法来给程序员二个用到程序起先化界面的机会。最初步时,也是只有那些方式来初叶化界面的。
    • 假设以上二种艺术都不曾给 appDelegate.window.rootViewController
      赋值,则那个应用的 window 就会为 nil 呈现黑屏.
  • 获取 ViewController 的 View

    • 自定义 ViewController 装载进程
      • 调用 [UIViewController loadView]
        假如有落到实处,调用之后就不会调用后边的措施了。假若是暗许完成则会调用上面的其余方法。
      • 调用 [UIViewController nibName] 如果是暗中同意模板,则 nibName
        应该是缘于 Storyboard。假诺是代码调用 initWithNibName
        则由程序员指定 nib. 倘诺两岸都不是,则会调用上面的艺术。
      • [UIViewController exisitingNibNameMatchingClassName:bundle:],它会基于
        ViewController 方法臆度并且查找
        Nib,假诺都查找不到,系统会成立2个空手视图。
    • 要点
      • isViewLoaded 判断 ViewController 的 View 是还是不是早已加载好了。
      • loadView 中无法调用 super.

6.3 View Controller Lifecycle

6.3 多个 View Controller

  • 弹出新视图的方法 presentViewController:animation:completion:

    • UIViewController 的 modalPresentationStyle
      是安装弹出控制器风格的个性。
    • UIViewController 的 modalTransitionStyle
      是安装弹出动画风格的习性。
  • iOS 8+ 之后新情势 showViewController:sender

  • 释放控制器 dismissViewControllerAnimated:completion:

  • 回传数据:把父控制器作为子控制器的代办,通过回调函数来传递数据。并且由父控制器来控制子控制器的放飞,而不是子控制器自个儿调用
    dismissViewControllerAnimated:completion: 方法。

<br />

7 Storyboard


Storyboard 也是三个 xib 文件,只是它其中不只是放 View,而是放置
Scene.
可以点击 ViewController 然后平素拖出 Segue 到别的 ViewController
当中,从而开创没有组件触发事件的 Segue。

7.1 Storyboard Segue

  • 动用代码进行 Segue 跳转

    func segueAction() {
        // 0 以 Segue 跳转
        performSegueWithIdentifier("SegueIdentifier", sender: nil)
    
        // 1 获取 ViewController
        if let nextViewController = storyboard?.instantiateViewControllerWithIdentifier("ViewControllerIdentifier") {
            showViewController(nextViewController, sender: nil)
        }
    }
    
  • Segue 传值

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // 每次有 Segue 被触发就会调用此函数,以提供传值时机。
    }
    
  • Storyboard Segue 回退

    @IBAction override func unwindForSegue(unwindSegue: UIStoryboardSegue, towardsViewController subsequentVC: UIViewController) {
        // @IBAction func unwindFuncName(segueName: UIStoryboardSegue) { }
        // 名称可以随意,参数至少要有一个 UIStoryboardSegue。用来作为 Storyboard 回退触发事件。
    }
    

7.2 多 Storyboard

  • 实地景太多的时候,能够把 Storyboard
    分成五个文件。场景之间的连通,可以通过两种方法落到实处。

    • Storyboard Reference 组件,跟 ViewController 组件一样能够拖动到
      Canvas 上。并且可以安装它指向的 Storyboard 文件,Reference
      ID(假如不点名就是 initial View Controller)。
    • 入选要求停放在新 Storyboard 上的 ViewController,然后点击 艾德itor
      -> Refactor to Storyboard。然后就会成立新的 Storyboard
      文件,并将入选的 ViewController 放置到内部。
  • 得到其余 Storyboard

    func muchStoryboard() {
        // 根据名称获取 Storyboard
        let storyboard = UIStoryboard(name: "StoryboardName", bundle: NSBundle.mainBundle())
    }
    

<br />

8 App Lifecycle


8.1 应用运行

  • main – 运维程序

  • UIApplicationMain() – 运转应用代理

  • UIApplication – 运转音信循环

  • APPDelegate – 生成选择代理

  • 按照 Storyboard 可能代码成立的 ViewController 加载
    rootViewController

8.2 用户互动

RunLoop Mode: [source] 其实就是事件源。

  • main run loop 循环关切事件源。接收事件。

  • 收取到事件就传递给 Application object。

  • Application object 对事件开展分发。

  • 事件依据代码逻辑反馈到视图上。

8.3 AppDelegate

  • 出生

    • application:willFinishLaunchingWithOptions: 事件
      UI 已经加载出来了。RootViewController
      已经创建好,只是还没访问它的 view 方法。
      应用级的起头化工作最好都置身这些任务,不过毫无在此间做太耗时的事件。

    Options 会提供运行状态音讯。
    App Programming Guide for iOS 文档中的 Preserving Your App’s
    Visual Appearance Across Launches 中有详实的表达。

    • application:didFinishLaunchingWithOptions: 事件
      界面已经恢复生机过了,不过 UI
      还未曾放置到界面上。那时候代码已经上马履行,不过界面看不见,也不会举办响应。
      反之亦然是使用级其余起首化机会。

    Options 会提供运维状态消息。
    * applicationDidBecomeActive: 事件
    运用已经要起来活动了的空子。

  • 进入不活跃状态

    • applicationWillResignActive: 事件
  • 跻身后台状态

    • applicationDidEnterBackground: 事件
      那是壹个短跑的时机,私自认同是 5 秒内成功。不过足以经过
      beginBackgroundTask 方法可以取得大概 10 秒钟的后台运营事件。
      若是还索要更长的轩然大波,要求编制后台运转程序。详细查看文档。
  • 应用关闭

    • applicationWillTerminate: 事件
      万一您的运用刚好被挂起没有多长期,然后就被关闭了,就会接到到这么些事件。倘若你已经被吊起在后台了,那在闭馆的时候就不会接受那个文告。
  • 行使复活

    • applicationWillEnterForeground: 事件
      采纳即将重临前台的事件。

8.4 移动采用的特征。

移步采纳的运用会那些的碎片,会在各类情状中来回切换。

<br />

9 Navigation


9.1 Navigation Bar

9.2 UINavigationController

  • Navigation Controller 的结构(属性)
    • viewControllers
      (视图控制器数组,管理着导航控制器的兼具视图控制器。)

      • topViewController (最顶上的视图控制器,绝半数以上时候跟
        visibleViewController 是同贰个,但也不相对。)
      • visibleViewController (当前呈现的视图控制器。)
    • navigationBar
    • toolbar
    • delegate

  • 给现有的 ViewController 添加 NavigationController

    • 选中 ViewController -> Editor -> Embed In -> Navigation
      Controller
    • 拖动 NavigationController 到 Canvas -> 设置 ViewController
      成为其 rootViewController
  • 应用 UINavigationController 的 Delegate
    方法时机来拓展导航时的数额传递(不过尽量仍旧用 Segue
    方法来进展多少传递)

    • navigationController:willShowViewController:animated:
      (一般数量传递会在那里展开。)
    • navigationController:didShowViewController:animated:

9.3 在代码中选择 NavigationController

并不推荐使用代码创立,终究用 Storyboard 就很方便了。
setViewControllers:animated: 比较有机遇意义,可以让导航不用每一回都从
rootViewController 开端。特别灵活。

9.4 自定义导航栏

打探以下顺序类的属性,并基于实际须求自定义。
苹果有提供 Customizing
UINavigationBar

的代码示例,里面有丰盛多采的自定义方法。

  • UINavigationBar
  • UIBarItem
    • UIBarButtonItem
  • UIToolBar

导航栏标题之上的小字在 Navigation Item -> Prompt 中安装。

<br />
iOS 实战开发课程笔记

本贴目的在于作为对极客班 《iOS
开发实战》第陆期期课程视频重新学习的笔记。
目的是确立二个相比完整的 iOS 开发知识点框架以及高效手册。
对各种内容的详实研商会开启新贴长远探索。
该贴仍在不断完善中。

0 导论


0.1 技术支持

0.1.1 苹果技术支持

0.1.2 其余技术辅助

  • stack overflow 社区
  • OurCode 社区
  • Cocoa China 社区
  • V2EX 社区
  • GitHub (提出查看学习 awesome iOS 系列)

0.2 学习情势

0.2.1 方法

  • 认真看视频。
  • 收拾笔记。
  • 形成锻炼示例。

0.2.2 参考书

  • ios 9 programming fundamentals with swift
  • ios 7 programming fundamentals (Objective-C)

0.2.3 App Programming Guide for

  • 界面基础

View Controller Programming Guide
View Controller Catalog
View Programming Guide
UIKit User Interface Catalog
Event Handing Guide

  • 图表和卡通片

Drawing and Printing Guide
Concurrency Programming Guide
Quartz 2D Programming Guide
Core Animation Programming Guide

  • 网络与仓储

Network & Internet Starting Point (知道个方向)
Networking Overview (驾驭个概念)
Data Management Starting Point (知道个趋势)

  • 其他

Auto Layout Guide
Scroll View Programming Guide
Table View Programming Guide
Collection View Programming Guide

<br />

1 Hello Word


1.1 创设新工程

  • Create a new Xcode project
  • File -> New -> Project [shift + command + N]

1.2 采用工程模板

可以采取八种多样的工程模板,包蕴 iOS, OS X, watchOS, tvOS 一般采纳 iOS
-> Single View Application。

1.3 工程音讯

  • Project Name:产品名称
  • Organization Name:社团名称
  • Organization Identifier:新产品唯一名,一般把集团域名反过来写。
  • Language:运维语言
  • Devices:运维设备(通用,金立,surface)
  • Use Core Data:是不是拔取数据存储
  • Include Unit Tests:测试模块
  • Include UI Tests:UI测试模块

1.4 Git 仓库

版本控制
Source Control:Create Git repository on My Mac
三番五次版本控制有特别篇幅。

1.5 Xcode界面打听

1.6 Storyboard

  • 图层识别
    入选图层之后,可以在 libraries -> identity inspector ->
    Document -> Label 中装置图层名称,可以变动图层在 Storyboard 的
    Document Outline 中的名称。以福利识别。
  • 组件 library
    可以拖动那里的种种零件到 canves 或内部对应的图层上。
  • 设置 Document Outline 彰显名称
    当选组件 -> Indentity inspector -> Document -> Label
  • 设置 ViewController 尺寸
    选中 ViewController -> Attributes inspector -> Simulated
    Merices -> Size

1.7 模拟器

  • 来得尺寸调节
    Window -> Scale -> … [command + 1-5]
  • 设施操作
    Hardware -> …
  • 回到出厂设置
    Simulator -> Reset content and Settings…

1.8 真机调试

  • 加上调试账号
    Xcode -> Preferences -> Accounts -> +
  • 安装调试账号
    Workspace -> General -> Identity -> Team 举办拔取 -> Fix
    issues
  • 运行
    第四回运营会提醒错误,必要真机验证
    真机 -> 设置 -> 通用 -> 描述文件 -> 选中信任 -> 回到
    Xcode 再次运转

1.9 App 基本概念

  • iOS App 代码结构(那是 Objective-c 语言,斯威夫特 有所不一样,main
    文件会被埋伏)

    • main()
    • UIApplicationMain()(生成壹个 UIApplication
      对象并设置成为该应用的代办。)
    • UIApplication 对象
    • UIApplicationDelegate
  • iOS App 运转条件
    • Sandbox
    • 拿到目录 NSHomeDirectory()
  • iOS 应用都以一个 Bundle
    • Bundle: 带有 Info.plist 字典的目录
    • 因此 NSBundle 类访问其中的能源
    • 驷马难追是经过 mainBundle
    • resource bundle 和 framework(可进行动态库)
  • 查看 App Bundle
    设置栏中甄选设备 -> Generic iOS Device -> command + B 营造-> Workspace -> Products -> xxx.app -> 右键 查看文件
    -> 右键 突显包内容

<br />

3 Button – Storyboard 与代码之间联系方式


介绍最常用的 Interface 组件之一 UIButton,以及它的采纳形式。
为此介绍 Outlet Action 等概念。

3.1 UIButton

3.2 IBOutlet

  • IBOutlet Connection
    把 Nib object 与 代码中的 IBOutlet 变量相连接

    • 在 Storyboard 上校组件与代码中的 IBOutlet 变量举行延续后,会在
      Storyboard 代码中多出来这么一段连接表达

      <connections>
          <outlet property="okLabel" destination="QJt-2z-ban" id="mhJ-Nu-TIR"/>
      </connections>
      // property 变量名称
      // destination 界面上的组件名称
      // id 标志这个连接本身
      
    • 运行时调用
      鉴于 xib
      中存储的是界面模板,所以在同意的时候,类实例代码会触发界面的实例化方法。
      末了调用 [UINib instantiateWithOwner:options:]
      方法实例化界面。
      Owner 实际上是调用了贰个按名字绑定的性质。
      [owner setValue:uiObj forKey:outlet.property]

事实上小编要好都看不懂那段在说怎么……大致是说 outlet connection
其实是标注了界面与代码之间的关系,然后在程序运转的时候,会由此一文山会海
runtime
方法调用那种涉及,并依照界面模板实例化界面组件,从而生成组件绘制吧。

  • Action Connection

    • 界面事件三番五次 IBAction

      <connections>
          <action selector="buttonAction:" destination="BYZ-38-t0r" eventType="touchUpInside" id="BQA-pw-9f8"/>
      </connections>
      // selector 方法名称
      // eventType 事件类型
      

<br />

4 Image


图片流:界面全部由现成的图样构成。耗内存,但是简便。
代码流:界面全部由代码绘制而成,外省存,适应性高。

4.1 UIImage

  • 图形加载

  • 图表动画

    let anmiationImage = UIImage.animatedImageNamed("ImageArrayName", duration: 2.0)
    // ImageArrayName 是动画图片的前缀,动画图片资源应该按照该名称后面加数字来命名。
    // duration 是总时长。
    // KeyNote 可以导出动画的每帧图片。
    

4.2 Assert Catalog

  • Assert Catalog 介绍

    模板会专擅认同生成3个 Assert Catalog 文件同时其中有 Appicon 以用来给
    App 提供系统图标。
    平昔用图片名字的主意加载图片,就算方便,但是出于这样的做法会把图片缓存在内存中,在图纸较多尺寸较大时会照成内存压力。

  • Assert Catalog 功能

    • 添加图片:直接将图片财富拖入 Asset Catalog,可能上面的 + 号。

    • 财富属性:每一种图片可以有多少个尺码以提要求差其余显示屏尺寸使用。还足以设置适用各类设备和种种特定尺寸
      Attributes -> Devices。

    • 图片切片:点击图片 -> Attributes -> Slicing -> Slices
      -> …

  • 适用矢量图片

    • 停放对应的图片格式进去 Assert Catalog 之后,然后设置其属性。

    • Attributes -> Devices -> Scale Factors -> Single Vector

<br />

5 第一个 App


5.1 需要分析

  • 详尽摸底应用需求,要求适量精通用户想要的是何等。
  • 详见布署利用的逻辑流程,各种模块作用的来头和去向。

5.2 程序设计

平衡设计原则:设计程序时为以后说不定的急需做好准备。不过那种措施有好有坏,有时候考虑太多,就会促成当前业务难以达成。若是完全只考虑当下,就可能增添现在重构的次数。中间的度要求靠程序员把握。

  • 走通流程图,确认游戏逻辑
  • 肯定静态数据结构

5.3 示例代码结构

逐一代码模块之间的维系和关系的门到户说。

5.4 Keynote 课件显示

<br />

6 View Controller


6.1 不难的设计形式介绍

6.2 UIViewController

  • UIViewController 介绍

  • 获取 ViewController

    • 创建 rootViewController
      • Info.plist 中的 UIMainStoryboardFile, NSMainNibFile
        指定了根控制器的来自。
      • UIApplication 会通过调用
        _runWithMainScene:transitionContext:completion: 方法。
      • 下一场调用 _loadMainInterfaceFile 来取出 Info.plist 中
        UIMainStoryboardFile 或者 NSMainNibFile 信息。
      • 如果是前者,则再调用
        _loadMainStoryboardFileNamed:bundle:
      • 万一是后世,则再调用 _loadMainNibFileNamed:bundle:
    • 加载好 rootViewController 之后就把那么些视图控制器赋值给
      appDelegate.window.rootViewController。
    • 假设上述措施初步化界面失利,则会调用
      UIApplicationDelegate didFinshLaunch
      方法来给程序员三个选择程序初阶化界面的火候。最开端时,也是唯有那三个措施来起先化界面的。
    • 比方以上二种方法都并未给 appDelegate.window.rootViewController
      赋值,则这几个应用的 window 就会为 nil 显示黑屏.
  • 获取 ViewController 的 View

    • 自定义 ViewController 装载过程
      • 调用 [UIViewController loadView]
        若是有落到实处,调用之后就不会调用前面的不二法门了。假使是默许完毕则会调用上边的其他办法。
      • 调用 [UIViewController nibName] 即便是默许模板,则 nibName
        应该是缘于 Storyboard。即使是代码调用 initWithNibName
        则由程序员指定 nib. 如若双方都不是,则会调用下边的形式。
      • [UIViewController exisitingNibNameMatchingClassName:bundle:],它会依照ViewController 方法揣度并且查找
        Nib,纵然都查找不到,系统会创立3个空白视图。
    • 要点
      • isViewLoaded 判断 ViewController 的 View 是还是不是已经加载好了。
      • loadView 中不恐怕调用 super.

6.3 View Controller Lifecycle

6.3 多个 View Controller

  • 弹出新视图的点子 presentViewController:animation:completion:

    • UIViewController 的 modalPresentationStyle
      是设置弹出控制器风格的质量。
    • UIViewController 的 modalTransitionStyle
      是设置弹出动画风格的属性。
  • iOS 8+ 之后新点子 showViewController:sender

  • 刑满释放控制器 dismissViewControllerAnimated:completion:

  • 回传数据:把父控制器作为子控制器的代办,通过回调函数来传递数据。并且由父控制器来控制子控制器的放出,而不是子控制器自个儿调用
    dismissViewControllerAnimated:completion: 方法。

<br />

7 Storyboard


Storyboard 也是一个 xib 文件,只是它里面不只是放 View,而是放置
Scene.
可以点击 ViewController 然后直接拖出 Segue 到任何 ViewController
当中,从而开创没有组件触发事件的 Segue。

7.1 Storyboard Segue

  • 接纳代码举行 Segue 跳转

    func segueAction() {
        // 0 以 Segue 跳转
        performSegueWithIdentifier("SegueIdentifier", sender: nil)
    
        // 1 获取 ViewController
        if let nextViewController = storyboard?.instantiateViewControllerWithIdentifier("ViewControllerIdentifier") {
            showViewController(nextViewController, sender: nil)
        }
    }
    
  • Segue 传值

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // 每次有 Segue 被触发就会调用此函数,以提供传值时机。
    }
    
  • Storyboard Segue 回退

    @IBAction override func unwindForSegue(unwindSegue: UIStoryboardSegue, towardsViewController subsequentVC: UIViewController) {
        // @IBAction func unwindFuncName(segueName: UIStoryboardSegue) { }
        // 名称可以随意,参数至少要有一个 UIStoryboardSegue。用来作为 Storyboard 回退触发事件。
    }
    

7.2 多 Storyboard

  • 实地景太多的时候,可以把 Storyboard
    分成五个文本。场景之间的交接,可以经过三种艺术落到实处。

    • Storyboard Reference 组件,跟 ViewController 组件一样可以拖动到
      Canvas 上。并且可以安装它指向的 Storyboard 文件,Reference
      ID(假使不点名就是 initial View Controller)。
    • 入选必要停放在新 Storyboard 上的 ViewController,然后点击 艾德itor
      -> Refactor to Storyboard。然后就会成立新的 Storyboard
      文件,并将当选的 ViewController 放置到内部。
  • 得到其它 Storyboard

    func muchStoryboard() {
        // 根据名称获取 Storyboard
        let storyboard = UIStoryboard(name: "StoryboardName", bundle: NSBundle.mainBundle())
    }
    

<br />

8 App Lifecycle


8.1 应用运转

  • main – 运转程序

  • UIApplicationMain() – 运转应用代理

  • UIApplication – 运维音讯循环

  • APPDelegate – 生成选拔代理

  • 据悉 Storyboard 只怕代码创制的 ViewController 加载
    rootViewController

8.2 用户互动

RunLoop Mode: [source] 其实就是事件源。

  • main run loop 循环关切事件源。接收事件。

  • 收取到事件就传递给 Application object。

  • Application object 对事件进展分发。

  • 事件按照代码逻辑反馈到视图上。

8.3 AppDelegate

  • 出生

    • application:willFinishLaunchingWithOptions: 事件
      UI 已经加载出来了。RootViewController
      已经创办好,只是还没访问它的 view 方法。
      应用级的伊始化工作最好都位于那一个岗位,不过并非在此地做太耗时的轩然大波。

    Options 会提供运维状态消息。
    App Programming Guide for iOS 文档中的 Preserving Your App’s
    Visual Appearance Across Launches 中有详尽的印证。

    • application:didFinishLaunchingWithOptions: 事件
      界面已经苏醒过了,然而 UI
      还未曾放置到界面上。那时候代码已经初始实践,可是界面看不见,也不会展开响应。
      照例是运用级其余初阶化机会。

    Options 会提供运维状态音信。
    * applicationDidBecomeActive: 事件
    运用已经要起来活动了的空子。

  • 进入不活跃状态

    • applicationWillResignActive: 事件
  • 跻身后台状态

    • applicationDidEnterBackground: 事件
      那是二个短暂的机会,暗许是 5 秒内到位。然而可以因此
      beginBackgroundTask 方法可以博得大致 10 分钟的后台运营事件。
      万一还索要更长的轩然大波,须要编制后台运维程序。详细查看文档。
  • 运用关闭

    • applicationWillTerminate: 事件
      设若你的使用刚好被挂起没有多短期,然后就被关闭了,就会吸纳到那个事件。倘使你已经被高悬在后台了,那在关闭的时候就不会收下那几个公告。
  • 利用复活

    • applicationWillEnterForeground: 事件
      运用即将再次回到前台的轩然大波。

8.4 移动应用的特色。

挪动应用的利用会特别的散装,会在种种气象中来回切换。

<br />

9 Navigation


9.1 Navigation Bar

9.2 UINavigationController

  • Navigation Controller 的结构(属性)
    • viewControllers
      (视图控制器数组,管理着导航控制器的享有视图控制器。)

      • topViewController (最顶上的视图控制器,绝超过一半时候跟
        visibleViewController 是同3个,但也不相对。)
      • visibleViewController (当前来得的视图控制器。)
    • navigationBar
    • toolbar
    • delegate

  • 给现有的 ViewController 添加 NavigationController

    • 选中 ViewController -> Editor -> Embed In -> Navigation
      Controller
    • 拖动 NavigationController 到 Canvas -> 设置 ViewController
      成为其 rootViewController
  • 动用 UINavigationController 的 Delegate
    方法时机来拓展导航时的数量传递(但是尽量照旧用 Segue
    方法来开展多少传递)

    • navigationController:willShowViewController:animated:
      (一般数量传递会在此地举办。)
    • navigationController:didShowViewController:animated:

9.3 在代码中利用 NavigationController

并不推荐应用代码创制,毕竟用 Storyboard 就很便宜了。
setViewControllers:animated: 相比较有机会意义,可以让导航不用每一趟都从
rootViewController 起先。越发灵敏。

9.4 自定义导航栏

打探以下顺序类的性质,并依照实际要求自定义。基本上都以 Storyboard
中的操作,太简单狂暴了不可以言语讲述。
苹果有提供 Customizing
UINavigationBar

的代码示例,里面有各个各类的自定义方法。

  • UINavigationBar
  • UIBarItem
    • UIBarButtonItem
  • UIToolBar

导航栏标题之上的小字在 Navigation Item -> Prompt 中装置。

<br />

10 TabBarController


10.1 UITabBarController 的结构

Tab Bar Item 一般不领先八个,否则会被埋伏。

  • tabBar

    • UITabBarItem
    • .moreNavigationController
  • viewControllers

    • customizableViewControllers
  • selectedViewController

  • delegate

    • UITabBarControllerDelegate

10.2 UITabBarItem

属性对应样式。

10.3 在代码中采用 UITabBarController

铭记在安装之时要安装好 ViewController 的 tabBarItem 属性。

10.4 自定义 TabBar

图标的运用请严酷按照系统定义来用,否则会让用户混乱。

  • 简简单单定制

  • 中档按钮

    放置 5 个页面。然后接纳三个新的视图覆盖中等的百般按钮。

    @implementation MyTabBar
    - (void) viewWillAppear:(BOOL)animated {
        [self addCenterButtonWithImage:[UIImage imageNamed:@"camera"] highlightImage:nil];
    }
    
    // 计算按钮的位置并且放置到中间
    -(void) addCenterButtonWithImage:(UIImage*)buttonImage highlightImage:(UIImage*)highlightImage
    {
        UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin;
        button.frame = CGRectMake(0.0, 0.0, buttonImage.size.width, buttonImage.size.height);
        [button setBackgroundImage:buttonImage forState:UIControlStateNormal];
        [button setBackgroundImage:highlightImage forState:UIControlStateHighlighted];
    
        CGFloat heightDifference = buttonImage.size.height - self.tabBar.frame.size.height;
        CGPoint center = self.tabBar.center;
        center.y = center.y - heightDifference/2.0 - self.tabBar.frame.size.height/3.0;
        button.center = center;
    
        [button addTarget:self action:@selector(middleButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
    
        [self.view addSubview:button];
    }
    
    // It is OK to replace IBAction with void here.
    -(IBAction)middleButtonTapped:(id)sender {
        [self showViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"middlepopvc"] sender:self];
    }
    
  • 更敢于的变迁

    定制 UITableViewController,具体查看代码完成。( VerticalBar )

      ![](http://upload-images.jianshu.io/upload_images/721097-ff083038d253a2c2?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    

<br />

11 UITableView


UITableView
是平凡开支应用最频仍的机件之一。由于自家以前已经做过不少施用,所以听课的时候很多相比较不难的东西就平素不举行记录了。提议依然要多做多少个德姆o 举行演习,并且多看文档。熟稔 UITableViewDataSource 以及
UITableViewDelegate 的各个法子。
如若急需中度定制,还索要精晓一下 UIScrollViewDelegate
的方法,UITableViewDelegate
协议也一而再自它,所以它的艺术也一样有用,这样可以让您的 TableView
尤其灵敏特性。

  • 认识 UITableView

  • 二个 TableView 要求的效能。

  • iOS 中的 UITableView 结构

    • UITableView
    • UITableViewCell
      • UIView
    • UITableViewDataSource
    • UITableViewDelegate
    • NSIndexPath
      • row
      • section
  • UITableView 学习路线

11.1 UITableView 的中坚拔取

datas 是 [[String]] 格式的演示数据。

  • 设置 UITableView 的风格:.style

  • 设置 .dataSource 实现 UITableViewDataSource 中的常用方法。

    // MARK: - UITableViewDataSource
    // 设置表格 Section 数量
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return datas.count
    }
    // 设置各个 Section 的 Row 数量
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return datas[section].count
    }
    // 设置每个 Cell 的具体内容
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("CellIndetifier")!
        cell.textLabel?.text = datas[indexPath.section][indexPath.row]
        return cell
    }
    // 设置表格表头文字
    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return "Header"
    }
    // 设置表格表尾文字
    func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? {
        return "Footer"
    }
    
  • 设置 .delegate 实现 UITableViewDelegate 中的常用方法。

    // MARK: - UITableViewDelegate
    // 设置表格各个 Section 的表头视图。
    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        return nil
    }
    // 设置表格各个 Section 的表尾视图。
    func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        return nil
    }
    // 选中某 Row 时触发的事件。
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // ...
    }
    

11.2 UITableViewCell

留神:prepareForSegue 事件触发时,目标 ViewController 还没调用
ViewDidLoad

  • Cell 数据传递
    didSelectRowAtIndexPath 方法中调用 performSegueWithIdentifier
    的话,能够一贯把 indexPath 作为 sender 参数传递到
    prepareForSegue 中。那样就能够把对应数据传递给下贰个ViewController 了。
  • Cell 高度
    • 全部行都一样高则设置 tableView.rowHeight 会通过
      UITableViewAutomaticDimension 自动再推算调整一下。
    • 可观都不可同日而语则透过 UITableViewDelegate
      tableView:heightForRowAtIndexPath: 方法开展安装。
    • 也可以透过安装 tableView.estimatedRowHeight
      来设置多个预估中度。
  • 定制 Cell – Prototype Cell

    • 能够在 Storyboard 中的 cell 举行自定义设计。

    • 通过 xib 创建 Cell

      let nib = UINib(nibName: "CellXibName", bundle: nil) // nil is UIBundle.mainBundle()
      tableView.registerNib(nib, forCellReuseIdentifier: "CellIdentifier")
      
    • 经过全代码设置 Cell,然而必须要在自定义 Cell 类中重载
      initWithStyle 方法。

      tableView.registerClass(CustomCell.self, forCellReuseIdentifier: "CellIdentifier")
      

11.3 UITableViewController

RefreshControl 的使用。

  • 下拉刷新协助

  • 多少刷新

11.4 UITableView 交互

  • 选中

  • 支配表格滚动

  • 报表编辑帮忙

  • 编纂格局处理进程

  • 带索引的报表

  • 目录本地化

  • 高亮与菜单

  • 报表与寻找

<br />


<br />


<br />

参考资料


知乎:品雪

发表评论

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

网站地图xml地图