不会代码也可以看这个视频,如果学习swift非常受挫,不妨看看这个视频学习xcode,能提高自己的兴趣,更容易让自己坚持下去。

金沙娱樂城 1

iOS 实战开发课程笔记

xcode还是非常有意思的一个开发环境的,其中的故事板Storyboard比较直观的设置各个界面。

1445501965993069.png

本贴旨在作为对极客班 《iOS
开发实战》第五期期课程视频重新学习的笔记。
目标是建立一个比较完整的 iOS
开发知识点框架以及快速手册,我想找工作……所以,打结实点基础,你们懂的。
对各个内容的详细研究会在学习完毕后开启新贴深入探究。
简书我不知道怎么添加目录,所以我觉得也许在网易上看会更清晰点……篇幅过长。
这是我的网易博客账号,欢迎各位同学吐槽。
http://blog.csdn.net/mubinhuang/article/details/50649650
该贴仍在不断完善中。

这二十个视频讲的内容有:

1.如何使用apple官网的开发文档(IOS Developer
Library)来学习开发IOS。这个是最重要的,不管老师是否讲解某个知识点,最起码知道去哪里能获得最权威的帮助。2.Xcode软件里的各部分介绍3.何使用模拟器以及功能4.MVC模式和main函数介绍。5.Storyboard:场景Scene,Scene上添加组件,组建与代码连接outlet/action,不同Scene直接连接使用Segue.6.如何使用apple官网的开发文档(IOS
Developer
Library)来学习开发IOS。这个是最重要的,不管老师是否讲解某个知识点,最起码知道去哪里能获得最权威的帮助。7.Xcode软件里的各部分介绍8.如何使用模拟器以及功能介绍9.MVC模式和main函数10.Storyboard:场景Scene,Scene上添加组件,组建与代码连接outlet/action,不同Scene直接连接使用Segue11.各个uikit的介绍12.各个controller的介绍。尤其是介绍了tableview
controller,这个在后面是专门有27个视频来讲解的,可见这个controller的重要性。不过我觉得navigation
controller更重要,在商业应用的APP中,这个组件比tableview
controller出现的频率多得多而且重要的多。13.组件布局Laout。如果使用一套布局满足各个尺寸的设备?这个对开发者还是比较重要的,花最少的时间达到最好的效果。毕竟apple的设备有ipad、iphone、iPod,还是比较复杂的(当然了,再复杂也没有安卓复杂)//使用Use
Auto Layout和Use Size
Classes14.应用程序生命周期和视图控制器生命周期。这两个周期听不懂没有关系,继续往下学,等做完练习项目后再回来看看,发现会有更深刻的理解的。15.做一个自己的todoList待办事项的程序。非常简单的一个界面,但是会给自己带来成就感,也能激励自己去学习更复杂的代码,例如函数、类、结构体等。当然了,这个要是没有完全学会也没有关系,后面还有专门的专题来解决这个知识点。

本文由CocoaChina译者小袋子(博客)翻译原文:Storyboard
Reference, Strong IBOutlet, Scene Dock in iOS
9
在这个教程中,我想要聊一些有关于Xcode 7中Interface
Builder的新特性,我相信这将会改变你对Storyboards的看法。
Strong 引用的 IBOutlet
Apple已经对Xib和Storyboard文件做了很多优化。并且由于这些优化,你现在可以将IBOutlet定义为strong,而不是weak。Apple曾在上一届的WWDC上指出这一点,因此让我们来看一下其中的更多细节。你可以从
这个文档
中找到管理Nib文件中对象生命周期的章节:
Outlet一般来说应该为weak,除了在nib文件 ( 或者iOS中,storyboard scene)
中的File’s
Owner的顶级对象,这个对象可以是strong。你创建的Outlets应该为weak,原因如下:
你创建的一个 view controller 视图的子视图或者 window controller
窗体视图的 Outlets,是对象之间的弱引用,不应该有依赖关系。

0 导论


TIPS小技巧:

1.每个Scene需要和代码关联,多个scene的可以先新建Controller代码文件,Cocoa
Touch Class,以.swift结尾的文件。

2.关联Scene使用ctr拖拽法,就可以有Segue关联了

3.要选择好第一个Scene,启动场景是哪个

1.刚刚介绍了组件布局Laout,结果在做最后一个todolist时,却没有使用这个功能,说以后再解决,这里没有使用此方法,没有增强记忆,之前学到的没有得到巩固,结果在以后的视频中再接触时都有点忘记了。毕竟前几集刚刚讲解了这个知识点,对于这个知识点如何使用还没有十足的把我,这时候更应该在接下来的练习代码中展示这个知识点,来看一下自己的想的和老师做的有哪些差距

2.在使用navigation
controller时,使用了push方法,也说明这个方法不在被苹果推荐了,那为什么还要学习呢?苹果不推荐的将来就会被抛弃的,连语言我们都在讲解最新的swift了,为啥动画效果还在使用老方法呢?这个过时的方法并没有帮助我,反而让我在学习navigation的时候更加困惑了。因为我更想知道的是:苹果推荐的方法是什么?当然了,在后面的专题中也讲解了这个,但是完全不如在第一次接触时就告知最正确的,因为第一印象最重要,最先学会的方法更容易被人使用。这是一个败笔。

strong的outlet通常是特殊的framework类(如:UIViewController 视图的
outlet,或者 NSWindowController 视窗的 outlet)。

0.1 技术支持

正如这个段落所解释的一样,view controller视图的子视图 outlet应该为
weak,因为这个视图已经被nib文件的顶级对象所拥有了。然而,当一个Outlet被定义为weak指针时,ARC会在编译期间调用以下函数:

0.1.1 苹果技术支持

  • 技术文档打开方式 <br />Xcode软件 -> Help ->
    Documentation and API Reference<br
    />文档是在网上读取的,如果想要更加快速,可以先进行下载。旧版本的模拟器也在这里安装。
    <br />Xcode -> Preferences -> Downloads
  • 开发者社区
    https://developer.apple.com
  • iOS文档库
    https://developer.apple.com/library/prerelease/ios/navigation/
  • WWDC 视频
id objc_storeWeak(id *object, id value);

0.1.2 其他技术支持

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

这个函数把对象的值作为key,并把它添加到table中。这个table被称为weak
table。ARC使用这个table去存储应用中的所有的weak指针。现在,当对象被deallocated时,ARC将会指向weak
table并且将weak引用置为nil。同时,ARC将会调用:

0.2 学习方法

void objc_destroyWeak(id * object);

0.2.1 方法

  • 认真看视频。
  • 整理笔记。
  • 完成练习示例。

紧接着,注销这个对象并再次调用objc_destroyWeak:

0.2.2 参考书

  • ios 9 programming fundamentals with swift
  • ios 7 programming fundamentals (Objective-C)
objc_storeWeak(id *object, nil);

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 />

这种weak引用关联的生命周期是strong引用的2-3倍。所以,通过避免简单地定义outlets为strong,使用弱引用是一种运行期间的通用做法。
我想这个决策与已废弃的viewDidUnload方法有关。直到iOS
5,这个方法被用于清空在低内存环境下的视图。正如文档中解释的那样:
在iOS 5之前,当发生低内存警告或者当前view
controller的视图不被需要时,在视图被释放之后,系统会选择性地调用这个方法。这个方法让你可以进行最后的清理工作。如果你的视图存储了视图或者其子视图的单独引用,你应该使用这个方法去释放这些引用。
在那时,定义一个属性为weak是有意义的,因为这就不用在viewDidUnload额外地释放对象。但是在iOS
9中,我相信我们已经有足够的时间去避免使用这个方法。因此,在IBOutlets定义weak是没意义的。
现在 Storyboard 的几个限制
Apple是在iOS 5中开始引入storyboards的。在此之前,使用Interface
Builder的nib文件是创建UI的唯一途径。在iOS开发中,单个文件中操纵多个nib文件是很普遍的。然而,为了理解应用流以及view
controller如何连接在一起,开发者需要去每一个view
controller类内去找出跳转到下一个界面的桥接点。这是一个非常耗费时间的工序,尤其当你不是应用的原始开发者时。
Apple提出Storyboards用以简化这个过程,并帮助开发者能够对整个应用程序流有完全的控制。除此之外,storyboards允许你在一个文件中拥有一个view
controller视图(通过添加
.storyboard文件)。用这种方式,你可以看到整个程序的流状态,并且能够方便地理解view
controller的连接关系。然而,storyboards也引出了一些问题。把所有的nib文件都放在一个文件中显然是非常便利并且能完美工作,但是这只是在你为单人开发的前提下。只要你的团队扩大了,你会使用版本控制,例如git或者subversion,这时你就会讨厌storyboards。因为,当把修改合并到一个通用的git
branch时,就会产生冲突,而解决此类冲突是很头疼的。在编译期间,nib会被编译成XML文件。所以,为了解决合并冲突,你需要比较两个巨大的XML文件,并且要尝试理清哪部分是你修改的,哪部分是你同事修改的。此外,Apple经常修改这个文件格式。所以,试图去理解并且反转storyboard格式是非常浪费时间的。
例如,在iNVASIVECODE(这是作者所在的公司),我们倾向于使只用storyboards去构建app原型。我们的设计师能够在几个小时内设计出一个能够在iOS设备上运行的原型,有时候只需要几分钟。这样可以在不写一行代码的情况下使用storyboards。所以,storyboards对于构建原型来说是非常方便的,但是不建议在开发期间使用。
另一个storyboard的重要局限是不能添加不属于一个场景体系的视图。我个人认为跟前面所说的合并问题相比,这是一个更为致命的限制。只要能够使用,我必定会使用IB。我喜欢这个,因为这可以避免写代码。但是使用storyboards,不能添加场景体系以外的视图。因此,当我需要额外的视图时,我就强迫自己去使用nib。
Storyboards还有一个额外的局限就是转场动画问题。在iOS 7及之后的iOS
8,Apple提出了在两个view
controller之间定制一个转场动画的新方法。当你运行一个segue时,这个新方法需要创建不能使用storyboard的特殊对象。所以,如果你想要添加定制转场动画的方法到你的view
controllers,你要避免使用storyboards。
但是猜猜看!Xcode 7和iOS 9为我们解决了所有的这些问题。
Storyboard Reference
在Xcode
7中,我们有一个在多个storyboards中组织scenes的新方法,并且能对它们进行引用。让我们来看一个实践的例子。下载
这个我已经准备好的例子。打开它,并且选择Main.storyboard文件。我已经为了准备好了一系列组织在一个tab
bar controller下view controller。每一个tab包含一个navigation
controller。下面的图片强调了示例项目的storyboard部分。

1 Hello Word


金沙娱樂城 2

1.1 创建新工程

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

1445502506602936.png

1.2 选择工程模板

可以选择多种多样的工程模板,包括 iOS, OS X, watchOS, tvOS 一般选择 iOS
-> Single View Application。

正如你所看到的那样,tab bar controller包含了三个navigation
controller。每一个navigation
controller控制着不同的视图控制器。现在,想象一下在这个项目里和其他开发者一起工作。正如我前面描述的那样,使用同一个storyboard文件是非常令人头疼的,因为你们每个人都会修改它。你可以把着三个navigation分支分割成三个storyboard文件。然而,当你准备在运行期从一个storyboard跳转到另外一个时,你必须加载相应的storyboard文件。这需要增加额外的代码。
xcode
7允许你创建多个storyboards,并且可以方便地操纵它们。选择顶部的navigation
controller 以及两个view controller,如下图所示:

1.3 工程信息

  • Project Name:产品名称
  • Organization Name:组织名称
  • Organization Identifier:新产品唯一名,一般把公司域名反过来写。
  • Language:运行语言
  • Devices:运行设备(通用,iPhone,iPad)
  • Use Core Data:是否使用数据存储
  • Include Unit Tests:测试模块
  • Include UI Tests:UI测试模块

金沙娱樂城 3

1.4 Git 仓库

版本控制
Source Control:Create Git repository on My Mac
后续版本控制有专门篇幅。

1445502568715361.png

1.5 Xcode界面了解

选择好之后,打开菜单栏的Editor,然后选择Refactor to Storyboard(如图)

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

金沙娱樂城 4

1.7 模拟器

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

1445502615641502.png

1.8 真机调试

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

为新的storyboard取一个名字(如图)。我将它命名为First.storyboard。

1.9 App 基本概念

  • iOS App 代码结构(这是 Objective-c 语言,Swift 有所不同,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 />

金沙娱樂城 5

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


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

1445502671957526.png

3.1 UIButton

点击保存。正如你所见到的那样,一个新的storyboard已经被添加到你的项目中了。让我们回到Main.storyboard,你将会看到如下的对象。

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 />

金沙娱樂城 6

4 Image


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

1445502704634152.png

4.1 UIImage

  • 图片加载

  • 图片动画

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

这个称之为Storyboard
Reference,它确实为新建的First.storyboard的引用,并且替换了先前选择的三个view
controller。最棒的是如果你双击storyboard引用,Xcode
7会打开所引用的storyboard。因此,当你想要控制应用流时,你可以方便地导向不同的storyboard。在运行期间,当segue指向的一个Storyboard
Reference被执行时,这个被引用的storyboard中的初始化view
controller会被加载。此外,Storyboard
References还能够引用相同的storyboard。
另外,你也可以手工创建一个新的storyboard,然后添加一个Storyboard
Reference到起始的storyboard中。让我们来试一下。
创建一个新的storyboard并命名为Third.storyboard。在Main.storyboard文件中,从Object
Library中添加新的Storyboard Reference。选择Storyboard
Reference并且打开相应的Attributes Inspector。如下图所示:

4.2 Assert Catalog

  • Assert Catalog 介绍

    模板会默认生成一个 Assert Catalog 文件并且其中有 Appicon 以用于给
    App 提供系统图标。
    直接用图片名字的办法加载图片,虽然简便,但是由于这样的做法会把图片缓存在内存中,在图片较多尺寸较大时会照成内存压力。

  • Assert Catalog 功能

    • 添加图片:直接将图片资源拖入 Asset Catalog,或者下面的 + 号。

    • 资源属性:每个图片可以有三个尺寸以提供给不同的屏幕尺寸使用。还可以设置适用各种设备和各种特定尺寸
      Attributes -> Devices。

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

  • 适用矢量图片

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

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

<br />

金沙娱樂城 7

5 第一个 App


1445502735552734.png

5.1 需求分析

  • 详细了解应用需求,需要确切了解用户想要的是什么。
  • 详细规划应用的逻辑流程,各个模块功能的来由和去向。

在这个字段中,选择你想要引用的storyboard(在我们的例子中是Third)。如果这个字段为空白,则被引用的storyboard是定义的Storyboard
Reference。Reference
ID指向在目的storyboard中的一个特定scene。如果你置空的话,初始化view
controller会加载。

5.2 程序设计

平衡设计原则:设计程序时为未来可能的需求做好准备。但是这种办法有好有坏,有时候考虑太多,就会导致当前事情难以完成。如果完全只考虑当前,就可能增加未来重构的次数。中间的度需要靠程序员把握。

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

金沙娱樂城 8

5.3 示例代码结构

各个代码模块之间的联系和关系的明确。

1445502798712409.png

5.4 Keynote 课件展示

<br />

最后,Bundle字段需要被置为包含目的storyboard的bundle。如果你留空的话,就会使用源storyboard的bundle。
在Third.storyboard文件中,你需要添加一个新的view
controller并将其作为初始化的view controller。之后,只要view
controller是Main
storyboard的一部分,你可以都可以运行app并且导航到那里。
所有,现在你可以在多个文件里组织你的storyboard,并且可以保持这些storyboard的引用。此外,每一个storyboard能够被分配给一个不同的开发者,而你不需要去考虑view
controller间的连接组合。这真是非常方便。
Scene Dock and Extra Views
这是我最喜欢的特性。现在,我能够在storyboard中添加在scene体系外的视图。为了让你明白它使如何工作的,我们先创建一个新的项目。将其命名为ExtraView,打开Main
storyboard,在顶部的First
Responder和Exit之间添加一个新的view。如下图所示(这个叫做Scene
Dock):

6 View Controller


金沙娱樂城 9

6.1 简单的设计模式介绍

1445502912235844.png

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,如果都查找不到,系统会创建一个空白视图。
    • 要点
      • isViewLoaded 判断 ViewController 的 View 是否已经加载好了。
      • loadView 中不能调用 super.

把这个view的大小调整为 1500×120 像素。然后在这个view的顶层添加一个大小为
240×112 的小view。把这个视图放到大视图的中心,然后增加顶部和底部的约束
(constants = 8),宽度约束(constant = 240)
以及水平居中的约束。然后添加一个scrollview到view
controller中,将其居中,并添加trailing和leading space约束 (constant =
0),高度约束(constant=128),最后增加垂直居中约束。在ViewController.swift中,添加下列两个outlet:

6.3 View Controller Lifecycle

@IBOutlet  var externalView: UIView! 
@IBOutlet  var scrollView: UIScrollView!

6.3 多个 View Controller

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

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

  • 释放控制器 dismissViewControllerAnimated:completion:

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

<br />

Author

发表评论

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