[Powered by Google Translate] [讲座] [IOS：编写应用程序像老板]
[和汤米MacWilliam] [哈佛大学]
这是CS50。[CS50.TV]
>> 好吧，大家好，欢迎到iOS：编写应用程序，像老板。
本次研讨会将重点上写的iPhone应用程序
，从而编写应用程序的iPad，所以我们基本上要穿行
一对夫妇不同的例子，如何使一个应用程序，一个简单的游戏，如井字，
或者，如果你更感兴趣的是一个应用程序，如某种形式的新闻阅读器
的东西，我会谈谈，以及与互联网交互。
这里我们简要的议程。
>> IOS应用程序是用的语言叫Objective-C的，
所以这是有点类似C，但没有真正的所有，
因此，我们会说一点点关于语言本身
那么如何来构建iPhone应用程序使用名为Xcode这个应用程序，
如果你还没有下载，还觉得现在开始下载。
这是几千兆字节。
在App Store上应该是免费的，所以你需要有一个苹果
理想情况下运行最新版本的OS X。
如果你没有，没有问题。
我们有在科学中心提供的Mac电脑供您使用
安装了XCode，所以随意使用这些发展。
如果你想使一个应用程序，但不会有一个苹果，不用担心。
有大量的校内资源，为。
这样的话，我们要去不同的应用程序，你可以覆盖更大的例子。
Objective-C是技术上被称为C的一个超集
这意味着，任何C代码是有效的Objective-C代码。
这意味着，我们种管上一些额外的功能，C.录音
这些功能包括一些没有写的malloc再次，感谢上帝，
不必担心那些愚蠢的指针，并释放他们和所有的东西
你恨C，和它的种了，在Objective-C。
>> 现在，Objective-C的标准库有一个更大的，
所以你的Objective-C的免费内了更多的功能。
记住，当我们在写PHP，我们注意到，我们就从
这个最小的语言，所有这些疯狂的事情你可以做的巨大的图书馆。
同样的事情发生在iOS。
有对象的东西，如佛历，真的什么
你可能认为在Objective-C的实现可能已经存在。
Objective-C的目标的一部分，被引用的东西
所谓的面向对象编程。
这是一个新的概念，但我们实际上大多学会
这些概念已经有很多。
面向对象编程背后的想法是，你要构建
您的代码周围有很多这些东西称为类，
这些类的真正荣耀的结构。
内部的结构，我们基本上可以说这里是一个东西，
这个东西可以有成员。
例如，一个链接的列表中的一个节点可以有其他的事情
像的值，在列表中的下一个节点的指针，
在一起的指针，该值由一个结构的一个实例。
类是非常相似的，除了
类也有他们内部的功能。
当我们宣布一个结构，我们只能说整数n或节点*未来。
>> 现在用的Objective-C实际上，我们可以把功能
里面的那些东西。
类可以做的另一件事是，他们可以从其他类继承的数据。
例如，我们将着眼于一堆内置的Objective-C类。
其中一个可能的类，它代表一个屏幕的视图，
，所以说，我要实现我自己的看法
我们基本上说对在苹果的人，可能是非常好的人，
为我写了这个类，它处理的事情，比如显示按钮
或呈现在屏幕上，我们将是非常痛苦的
实现所有的功能我们自己，所以通过简单的
继承的数据，我们可以说，在这个类中的一切，你做的
我也希望我的类的内部，然后我会做一些其他的东西，
即实现一个应用程序。
这是什么字继承的意思。我们会看到一个更具体的例子。
>> 最后，与面向对象编程的关键是，
它会导致数据的封装。
我们在一些问题设置，我们可以有这些大的，全局变量
和全局无处不在，这就是我们会保持跟踪状态。
带类，我们就可以开始封装内的对象的信息。
如果我们有我们的应用程序的一个屏幕上，我们并不真正需要的任何数据从
在我们的应用程序内的，另一个屏幕，
等封装在类的东西，这实际上导致
到更好的代码设计，这是可能的，与一些附加功能。
Objective-C的。
预警，为Objective-C的语法是香蕉。
这是什么之前，我们已经看到，
所以它是一点点的学习曲线已经习惯了
这到底是什么意思呢？
但是，一旦你过去，最初的学习曲线，这是真的，真的很光滑
开始编写应用程序。
>> 要声明一个类，这里​​要说的是我的课，它的存在，
也许这里有一些事情，我要定义后，
我会说接口。
我会说接口。我想给我的类的名称。
再后来又在其他地方，我会说结束，
一切都在@接口和@结束的之间的
将是我的课。
这将是我们的。h文件里面有什么。
就像在C h文件，从根本上说，这里有一些事情，会存在。
我不一定告诉你他们还做什么，
但编译器需要知道它们的存在。
后来我们。米内的文件，因为m的Objective-C的
我们要定义这些类的。
就像我们的文件，我们提供功能的实现。
在我们的m文件，我们要在这里说的是什么的全部功能
里面的我的课，他们都做。
最后，内部的结构，我们可以说，这些花括号内
INT n或节点*下，
在Objective-C，我们要使用关键字@财产，
这是怎么回事定义属性，
非功能的一部分，我的课。
>> Objective-C中调用函数是香蕉。
当我们宣布我们说了些什么，如int foo的功能在C
和开放的括号，然后把它的参数列表。
这是声明的方法或函数看起来像在Objective-C的。
如果我要声明一个函数或方法
我说的方法实际上是一个函数，这是一个类的成员，
因此种可互换的，但不是真的，
里面有我的方法，我想创建一个新的方法。
这将返回任何结果，所以这将是void类型。
这是我的函数的返回类型。
现在，我们有括号括住在这里，因为我不知道。
下一步将是我的函数的名称，
最后，我们有一个分号，就像我们在C.
什么是新来的，是这家伙在这里。
这连字符实际上是必要的，这说的是，
这种方法必须调用类的一个实例。
>> 当我们宣布我们的结构，我们可能是这样说：
结构节点n，和实际创建
或实例化这些结构，这样我就可以真正开始工作
它里面是什么，所以这个破折号意味着我们必须
实例化的类，就像我们实例化结构
之前，我们可以调用这个方法就可以了。
如果我要开始我的方法添加参数
它变得更加香蕉。
这里是我的方法的名称。
然后我有一个冒号，这个冒号后，这里说的几个参数。
这种方法需要一个参数。
其参数的类型是int，这样的说法和名称
，我要开始使用里面的方法或变量叫我。
再次，这是方法。它接受一个参数。
>> 如果你想开始添加更多的参数，得到更多的香蕉
中，我们有这个冒号在这里说来我的参数列表。
第一个参数是一个整数。
现在，这个说法很有趣。
我的变量，将使用在我的功能
被称为F，所以在我的功能，我可以说
F + = 1或东西。
这件事情在这里基本上是一个关键，参数或参数。
就像我们的键值对的东西，如JSON或关联数组
Objective-C的说，没关系，只要它确实是明确的决定
当你调用一个方法，所有这些参数是什么
实际上，我到他们的名字。
当你调用一个方法，你实际上会说andFloat的，
然后你会通过它。
>> 有趣的是，这个人是没有被命名，但所有的其他参数，
因此，如果我们有一个第三个参数我可以说andFloat的
和另一个浮动等。
当我把这些方法当然香蕉，
所以，如果我有一个对象，我定义了一个名为foo的方法，
我想打电话给它，而不是说foo的打开/关闭括号
我要打开一个支​​架。
下面是我的方法的名称。
我要关闭支架，​​这是我调用它的对象。
请记住，所有这些方法都存在于类
因为类可以有定义的方法内的。
>> 在这里，我随意创建某个类的一个对象，
这是这样做的语法。
有2个步骤创建一个对象。
第一步是说，我要分配空间。
这相当于一个malloc。我们没有说的malloc了。
我们放弃了米，它的alloc，取代的。c。米。
后，我们的alloc东西的，我们就需要对其进行初始化。
基本上，当你创建对象，你可能想有一些逻辑
执行时，他们创建的，所以你可以通过一些默认值
或类似的东西，所以这个init（）方法实际上是创建对象。
我们第一次分配空间，就像我们在C，
然后我们将它初始化，可能会或可能不会做很多。
然后，我们回到这件事情的对象o。
这里有一个明星，因为从技术上讲，这是一个指针，
不过不用担心，指针是不是什么大不了的事在Objective-C了。
>> 现在，我们已经实例化这个类NSObject的，
而这仅仅是一个随机的类，苹果。
我们已经实例化了，现在我有这个类的一个实例
在这个对象o，所以这意味着，如果我定义
这些方法，我可以打电话给他们这个样子。
同样，如果我想用一个参数来调用一个方法，
所以这是酒吧的方法，它有一个参数，
这里是巴兹：QUX方法，所以这需要两个参数。
这是调用这个对象o上的一个功能。
有意义吗？
它的语法意义，但你种习惯。
>> 好吧，让我们来谈谈几件事情中内置的Objective-C的
不一定C建成。
在C语言中，我们种的，因为这些愚蠢的字符数组与字符串处理，
真的很讨厌。
Objective-C的全部建成，对我们来说，它是建立在
使用这个类称为NSString的。
当我想创建一个NSString我们有更艰涩难懂的语法。
而不是说：“CS50”我们说：“CS50”
而这仅仅是声明字符串中的Objective-C的语法。
这是非常容易忘记，所以不要。
现在，一旦我有这个，这是一个字符串，但要注意
它实际上是一个对象。
我说的NSString，这意味着我实例化的类
所谓的NSString，别人写的我，
和他们是很不错的了，所以现在
我可以调用它的方法。
如果我调用该方法的对象s的长度
它会回到我这里来的字符串的长度。
这是一样的strlen C.
这将返回4。
>> 同样，我可能要关心的是另一种方法这个characterAtIndex。
这是一个方法，说这个字符串s
我希望你能得到零级人物，
，所以这将返回到我的字符c，
有一大堆以上的这些方法，你可以在Google真的很容易。
苹果的文档是伟大的，我们就来看看，在一个位。
这些都是字符串。
我们也有内置的可变大小的数组
请记住，在C时，我们声明数组
我们不得不说，你有5个元素，故事的结尾。
当我们到了JavaScript和PHP，我们可以开始
做的事情，如添加元素或移动元素。
我们可以做同样的Objective-C中。
在正常的C方式，而不是创建一个数组
我们再次调用另一个类的NSMutableArray。
还有的NSArray，
这是怎么回事，基本上封装了一些阵列。
这是说我想要做的第一件事情是我想分配
为新阵列的空间，并在我分配
然后，我需要对其进行初始化。
同样，调用这些方法。
现在，这意味着这个对象内部的一个
我有一个空数组坐在那里。
如果我要添加到这个数组中的东西，我可以调用AddObject方法。
我想补充一个对象数组a，我想补充的字符串CS50。
如果我想反过来删除，我可以说，我要
删除对象在阵列上的第一个地方或物件。
>> 有意义吗？
好了，你种习惯了这方括号内的事情。
顺便说一下，里面有很多苹果的图书馆，你会看到这个NS。
NS实际上代表的下一个步骤，这是史蒂夫·乔布斯最早的公司之一，
而这也正是他真的开始写了很多的代码
作为一种适用于Mac OS X和所有其他的东西的基础，
所以这NS是这个漂亮遗留下来的一种喊出来较早的公司之一
回来时，苹果公司第一次开始了。
它无处不在。
让我们来看看一个更全面的Objective-C的例子。
在这里，我在里面的Xcode。
到这里，我第一次从App Store下载的XCode，
打开它，然后我去到文件，
在这里，新的，然后项目。
当我这样做，我有所有这些选项是什么，我想创建，
所以我们就来看看这些选项后，
但在这个例子中，因为我们实际上没有去有一个应用程序，
我来到这里，和我说的命令行工具，
这是一个应用程序，我可以在命令行中运行
就像我们已经从C
这就是我创造了这个项目，所以现在我在这里，
让我们先来看看这个文件，这应该很熟悉。
我有一个int的名称。还有我的朋友，我的其他哥们ARGV的argc。
因此，我们可以看到，这是我的第一个Objective-C的应用程序的入口点。
在这里，我们可以忽略这个现在。
这基本上是一些内存管理的东西，你不会真的
以往任何时候都不必担心。
>> 让我们来看看这首块。
这第一行，如果我说学生爱丽丝= [[学生的alloc]初始化]那是什么做的？
这首先这里的学生，这可能是一个类。
这是不是一个类，苹果写的，但它是一个类，我写的。
我想要做的第一件事情是，我想新的学生分配空间，
然后我想将它初始化，所以这让我回
这个新的学生对象，我存储在一个叫爱丽丝的变量。
那类从何而来？
那么，在这里的左侧，这些都是我的项目里面的不同的文件。
我们可以看到，在这里我有一个Student.h和Student.m。
h文件，记住，是我宣布所有的事情
将存在于类。
>> 让我们来看看在那。
好了，在这里，我们有这样的@接口，这说来
一切都将存在于我的课的声明。
然后，我有一个冒号。然后，我有这样的NSObject的事情。
这的结肠表示，继承位，我们的讨论早一点。
这是说一NSObject可以做的一切
NSObject的是别人写的这个类，
这的NSObject的可以做的一切，我想是能够做到这一点。
他说：NSObject的，这意味着我基本上
继承另一个类的所有的功能。
这真的给了我一大堆，我可以用不同的方法和属性。
在这里我创建2个属性。
这意味着我的学生，如果这是一个结构，这将是两件事情
我的结构内，使每一个学生都有一个名字
这是一个字符串，和学生也有一个档次，
这是一个int。
>> 最后，在这里我要为我的学生创建一个方法。
我打电话给我的方法，initWithName，它需要一个参数，
该参数是一个字符串，我把它叫做命名。
现在，让我们来看看我们如何实现这个类。
在这里，我现在是我的m文件里面，
m的实施，我猜。
我有我的实现，我的目的，这里是什么地方，我实际上是在定义
什么initWithName。
我有initWithName，我的参数的名称，然后将此
实际上，我创建一个学生，
所以这是一个有点神秘的，但是这是种样板
要包括在你的构造函数。
在这里，这个初始化函数initWithName，是一个类型的构造函数。
你基本上是兴建一座新的学生对象
也许它内部的数据发送一些。
我想要做的第一件事情是我要调用init这超级事情上。
>> 请记住，当我回到这里。h文件
这一切的NSObject的学生也有。
这意味着，当我创建了一个学生，我还需要做的是
确保NSObject的，我继承所有的数据
正确初始化。
我需要说的是，这个超级实际上是指父类
我继承的，所以我想确保我初始化
一切，我根据之前，我开始尝试使用它。
然后，如果正确初始化这就像说如果malloc
没有返回null，然后我就可以开始设置一些属性。
>> 在JavaScript和PHP，我们有这个关键字叫这个，
这是指一类的当前实例。
在Objective-C中，我们称这种自我。
当我说self.name，这意味着该对象
我刚刚创建时，我说，学生的alloc初始化，
将会给我回一个对象。
这意味着我要设置该对象的名称
无论我刚刚传入
就像在C中，我们访问这个点，
所以self.name说的学生对象的名称
现在不管你刚刚传入
所以最后，我可以返回它，所以我得到的东西回来。
>> 有问题吗？
好了，所以这个自我=超初始化的，
如果你不完全理解继承的东西，不要担心。
只知道，如果你想使自己的init（）方法只是
做到这一点，你会好到哪里去。
是啊。>> [学生]是什么，如果自我平均？
这意味着，当我们的malloc的东西，我们总是检查，如果它等于空，
如果它是空的，然后我们退出。
这是同样的事情，因为如果此方法返回null，那么我们很可能要赛格故障
如果我们开始试图操纵它。
这是我们的学生类。
这意味着我们可以初始化我们的学生在以下两种方法之一。
如果我说学生的alloc初始化，我没有使用这种方法，我只写了，
不是我可以简单地说alice.name，
现在我要设置该属性的名称。
>> 同样，如果我想使用，initWithName方法
我可以简单地说ALLOC，然后，而不是说的init
我要调用该方法，我刚刚创建的，我要通过在鲍勃。
在这一点上，此对象鲍勃具有名称等于给Bob。
好了，在这里我使用NSMutableArray里，我们前面介绍过。
我我分配space.Then的我一个新的数组初始化。
我要的东西给它加2。
现在，此数组保存学生对象。
请注意，没有在哪个地方，我不得不说这是一个数组的学生。
我说，它是一个数组期。
然后，我可以把任何在它里面，我想。
在这里，我有两个对象。
>> 最后，我有另一个对象，这个TF。
在TF.h在这里基本上是同样的事情。
我从NSObject继承的方式，
创建类时，这一切都为你做，
这种接口的样板。
它有一个属性的学生。
我有一对夫妇的方法在这里并不真正做了一大堆，
因此，这意味着创建这个TF对象后，
我可以调用此方法的档次上是这样的。
Objective-C语法上的任何问题，然后才开始迁入一些更
有趣的应用程序开发的东西吗？
>> 好吧，让我们的实际上是一个iPhone应用程序。
核心类，你会在你的iPhone应用程序使用被称为视图控制器，
一个视图控制器基本上是一个单一的屏幕
你的应用程序里面，所以如果我的音乐应用程序，例如，
一个视图控制器可以代表我的视图中查看所有歌曲在我的iPhone。
另一种观点控制器可以当我点击一首歌曲，开始播放
我深入到艺术家。
这些不同的画面中的每一个都可以表示为一个不同的视图控制器，
一个视图控制器类实际上只是一个说，这个屏幕是如何工作的。
里面的东西的一个视图控制器，我们要的属性，
这样的事情像一个按钮，将是我们的视图控制器的属性。
>> 我们也有方法，这些都是基本的事件处理程序。
这种方法说，当你按下这个按钮时，
我想要做的事情，最后，再次，
我们将使用这种自我关键字来访问当前实例。
要建立在iOS界面实际上是真的，真的很容易。
他们有这个漂亮的叫Interface Builder中的拖放界面，
和2线的核心概念，你的Objective-C的界面生成器
IBOutlet和IBAction。
一个IBOutlet简单地说，如果你声明一个属性，这是一个按钮，
你想要把它挂在您的实际UI的东西，
你会说，这是一个出口。
同样，如果你想表示一个事件处理程序
那么你会说这是一个行动。
>> 要真正连接的图形表示
你的代码是真的，真的很简单。
如果你想附加一个IBOutlet，所有你所要做的是控制点击，
我们会看到一个例子，这是真的快。
您可以控制​​点击它说 - 视图 - 控制器。
你要拖动到界面，或者相反，
如果你想连接的事件处理程序，你要拖动的界面
在另一个方向上。
让我们来看看在一个非常简单的iOS的例子。
>> 让我们创建一个新的项目。
我要来这里申请，
我要“的单一视图应用程序。
我要点击下一步。我会给你我的项目的名称。
我会打电话给它喂。
有趣的是，苹果公司不承担您要创建一个产品
这样就可以卖它，他们就可以赚钱。
在这里我会说，这是一个iPhone应用程序。
您可以创建一个iPad应用程序，或者如果您想创建这些应用程序之一
支持这两种设备可以做到这一点。
这是你想要看起来像你的复选标记。
>> 您要使用的故事板，我们将在后面看到，
你一定要使用自动的引用计数，
这是一个很好的功能，可以防止你说malloc和free。
除非你想调用malloc和free，我将离开这个托运。
我会单击“下一步”，最后，这是怎么回事，问我在哪里，我想将它保存。
我会打造成“，在这里，我们去。
我创建了一个新的项目。
在这里的左边是我的项目内的所有文件，
请注意，我得到了一大堆，我什至没有做任何事情。
IOS是很大的。
>> 例如，在这里ViewController.h，
这将是我的第一个视图控制器，
所以我的应用程序的第一个屏幕内。
现在我们知道这是什么话说。
我们说，我调用这个类的ViewController，
一个ViewController的一切，一个UIViewController，
而这，又是一些类，苹果写道，我们做了很多方便的东西
我想显示在屏幕上。
在这里我可以真正开始界定什么是我的视图控制器，
事实证明，我真的不需要任何。
这是苹果给我免费的样板代码。
我确实需要，第一行，我没有一类，
这样我们就可以摆脱，摆脱这一点。
好了，所以这是我空白的屏幕。
>> 现在，让我们的点击这MainStoryboard.storyboard，
这是它开始变得有趣的地方。
这代表我的应用程序的第一个屏幕。
如果我想在HTML中添加一个按钮，我不得不创建一个按钮，标签。
在Android中，你必须创建一个按钮，标签，
但在iOS中，如果我只是来这里的右下角
，如果我点击，第3个在这里说的对象，
我可以向下滚动，或者我就可以开始搜索按钮。
你看，一个按钮，所以如果我拖动和下降这一权利，
我只是增加了一个按钮，此画面在我的应用程序。
如果我想改变的文字，我可以双击它，
说诱人，如“按我的东西。”
好了，现在如果我运行这个程序，所以我们编译它，
运行，我点击播放按钮在左上角，有我的应用程序。
我没有做任何事情，我有一个甜美的期待的iPhone应用程序。
如果我要阻止它，你可以单击“停止”按钮
因为它更有趣。
>> 比方说，我真正想要的东西发生时，我按下这个按钮。
要做到这一点，我需要做的是，我需要创建
一个新的事件处理程序或行动。
这意味着，我需要创建一些方法，我希望被称为
当我按下按钮，让我们创建一个新的方法。
我里面的ViewController.h。
我需要说的方法存在。
我需要一个连字符，因为我将要调用此视图控制器。
我需要给这个类型。
“这是怎么回事，IBAction的事情，我们在前面看到的。
这是一个事件处理程序，所以它会返回一个IBAction，
这是一个暗示说，到XCode
这是我想要的东西线的东西。
我可以给它一个名字，如buttonPressed，分号。
>> 现在，我宣布我的班级内部的一种新方法。
我说的这个方法存在。
现在，让我们的进入ViewController.m，
让我们说，这种方法可以做什么。
例如，如果我开始打字，（空）buttonPressed
通知XCode是非常好的，对我来说自动完成。
这真是太棒了。
请注意这里面的m文件，我也可以说无效，
这是，因为这，IBAction是不实际的类型。
它实际上包括hashtag定义的是一个空白的地方，
再次，这只是一个提示Xcode中说：
我想这是一个事件处理程序中，我们将看到为什么在短短的一秒钟。
按下此按钮时，我会做一些恼人的
我想显示一个弹出窗口。
>> 要做到这一点，我可以创建一个新的类的实例称为UIAlertView，
这是一类，苹果写道，要显示烦人的弹出窗口。
我们称这个弹​​出警报，我有2个步骤，记住，要创建此对象。
我需要做的第一件事情是分配空间。
我想的UIAlertView。
我想分配空间。这是我的第一种方法。
我的下一个方法是我想要初始化它，
所以我有这个又大又长的方法，称为initWithTitle。
这基本上就是要控制这个弹出窗口说什么。
我的弹出窗口的标题可以招呼。
这个弹出的消息是：“这是iOS的。”
代表的事，我不知道那是什么。
比方说，没什么。
现在的按钮，会出现可以说是“肯定的是，”
和我真的不希望任何其他的按钮，让我们删除，并关闭支架。
>> 好吧，我创建了一个额外的一个。我们走吧。
这就是我如何可以创建一个新的弹出窗口。
如果我要显示的弹出窗口，我想调用Show方法。
要做到这一点，我可以说警报，并显示，
再次，自动完成超好听。
如果我忘了那是什么，如果我只输入S，
我在这里可以通过滚动弄清楚它是什么，
过滤得很好。
现在我创造了这个新的弹出窗口。
我们会回来后，代表意味着什么
现在，我想说，我想这个方法被解雇
当我按下按钮，所以我要回来我的故事板，
我想现在重视这个IBAction。
你想要做的第一件事情就是按一下按钮。
当我按下这个按钮，我想事情发生。
我不会去，按住控制权。
我要单击并拖动按钮
在这里，它说 - 视图 - 控制器。
我们可以看到，它很好地亮起来。
>> 如果我让我的鼠标，我现在有这个弹出，在这里，我有一些选择。
其中之一是我可以注册的事件。
这些都是我宣布我的h文件IBActions这些方法。
这是Xcode如何知道什么应该出现在这个小名单，
所以，这只是一个提示。
如果我按下按钮上按一下，我现在已经注册的事件处理程序。
在JavaScript中，我们不得不说，我有一些代码，注册事件处理程序。
在Objective-C，它真的那么容易。
如果我运行一次
现在当我按下按钮时，要解雇我的事件处理程序，
我要得到这个弹出。
超级，超级简单。
>> 如果你想看到所有已经登记的事件
上一个组成部分，如果我点击此按钮
和我来这里的右侧
第一次在这里你可以看到我喜欢的类型的按钮可以做的事情，
所以如果你想那些我的“添加联系人”按钮
或什么的。
如果我想看到所有的事件，此按钮
如果我远道而来，在这里的右侧
在活动中，我有所有这些不同的事件，我们可以在这里看到。
我可以按按钮，当我放手的按钮，当我双击自来水或任何，
我刚刚注册的是这一事件被称为触摸里面，
说，一旦我的手指离开按钮
该事件要火了，这也正是刚刚发生了什么。
这是一种默认的按钮被按下的事件。
>> 有任何疑问，这么远吗？
好吧，这就是我们可以开始连接起来的东西在我们的代码中
进入里面的东西，我们的接口。
请记住我们必须做的第一件事是找到的代码，
然后我们有线接口的代码，
那是我们的第一个应用程序。
好吧，这真是太酷了，我们创建此按钮。
如果我们不希望有创建一堆的属性
代表这些按钮吗？
例如，在井字我有9个按键，
它会是超级，超级讨厌有拖放9倍
或者如果我不得不做出打井81，而不是9
，我不得不拖放81倍，这就是跛脚。
我们能做些什么，而不是很像一个HTML
当我们有ID和名字一样的东西，我们可以寻找的东西
通过他们的ID，有一个类似的概念在iOS称为标签。
>> 标记是一个唯一的数字标识符的组成部分。
例如，如果我说这有一个标记为0，
如果我创建一个按钮，并给它一个标记为0，我们将看到如何做到这一点在短短的一秒钟，
如果我想要得到这个按钮，我可以简单地说，我要打电话
viewWithTag对象上的方法，在这里，
self.view，它代表了当前的屏幕，例如。
如果我打电话，viewWithTag的方法，我要拉回来的按钮标记0。
让我们一起来看看这款大厦井字。
首先，这是我的故事板。
我已经创建了这10个UI按钮。
请注意，他们都是一样的尺寸。
如果我点击了其中的一个，我在这里在此右侧回来
你会看到我调整了字体在这里，所以我做的字体有点大了，
但我也做了我设置这个标签。
我说，这有一个标记为1，这是最佳的左侧。
>> 现在，如果我点击另一个按钮，这样第二个，
现在，你会看到我的标签2。
每个按钮都有一个唯一的标签，
所以这是以后怎么我要开始交互
我的应用程序。
这是所有里面的一个视图控制器，
但这里是我们所拥有的。
我们这里有3个属性。
第一个和最后一个要代表我的板子的状态。
基本上，这是一个数组，表示其中X和OS。
这等人告诉我们该轮到谁了。
你会发现，我也有这些东西在这里。
在此之前，当我们声明的属性，我们给了他们一个名字和一个类型。
我们也可以给他们一些额外的信息。
这第一个说非原子，这是什么
基本上只有一件事，永远不会试图访问这个变量的时候。
你可以做更复杂的应用程序都是多线程的，
和做回，在Scratch我们有不同的线程，
不同的精灵可以做不同的事情在同一时间。
>> 如果是这样的情况并非如此，它不是什么，我们将着眼于，
如果说非原子，它实际上使事情有点快。
我们也有这样的东西叫分配，强，或弱。
这种分配，只是说，这是一个标准的类型。
这是不是一个对象或者一个指针，因为这仅仅是一个布尔值，
因此，BOOL是内置的Objective-C的。
这是说，不要试图做任何事情看中这里的指针。
这是一个普通的老定标器。
强与弱，弱的说，其实
我想这是被人指指点点的东西在视图控制器。
我不打算实际分配，或init这个我。
Interface Builder的，当我运行的应用程序，要处理所有的初始化。
如果我说弱者，另外一个人说将要创建此。
如果我说强，说，我要一个
创建此板对象，
所以在这里，我在这里有更多的方法，
例如，新的游戏的按钮被按下时，一个动作，
当任何其他的按钮被按下时，一个动作，
等等。
>> 我们不会得到到井字太多的逻辑，
虽然这是非常令人兴奋的，但是让我们一起来看看
一些我们可以做的事情，里面的iOS。
这种新的游戏方法是将被解雇
每当我按新的游戏按键。
要挂钩，我只是过来我的故​​事板。
我点击了新的游戏。
如果我来这里的右侧，我可以看到，
触摸起来里面是有线到的newGame的方法。
这就是为什么这会被解雇。
newGame方法做一些设置。
这是怎么回事，说我要你清除板的状态。
这是一个很好的方法，可变数组。
这是怎么说的，现在轮到X的，
现在，我将充分利用本viewWithTag的事情。
>> 我知道，我的按钮的标签1-9，
这是我随意挑的东西。
如果我要设置每个按钮的文本是空的
因为我刚刚开始一个新的游戏，我不希望任何
XS或操作系统被遗留下来的，我可以做到这一点。
我可以说我想要的标签，1，2，3，4等等。
这将每次拉不同的按钮。
在这里，我打算将它转换为UIButton的。
就像我们投int到彩车，反之亦然
这说，我想投一个UIButton。
这意味着此类型的将是一个UIButton *
因为三分球，但不用担心，他们不再害怕。
>> 一旦我有这个按钮，我要调用一个方法就可以了。
这种方法被称为setTitle forState，所以这说
我想设置的按钮的文本是空字符串，
我希望它是空字符串时，它不是按。
如果我用这个方法，我可以改变文字的按钮
只要有人点击它，但我们想说的按钮时，只是坐在那里，
我想是空白的文本。
最后，我们要初始化我的板，
我要去说，目前一切都在0，
所以这个董事会的成员不变的是一个可变的数组，
这意味着我可以调用AddObject方法，只是它里面的0。
这是发生了什么，当我创建一个新的游戏。
>> 让我们来看看另一个。
这种方法在这里是要被按压的IBAction
每次这些广场之一被按下。
现在我们这里有一些井字逻辑。
我们计算出该轮到谁了，
此基础上，我们要么设置一个X或O，
但我们注意到，我们打算重用相同的事件处理程序
每一个单一的其中一个按钮。
这意味着，我没有的方法的最佳的左按钮，
不同的方法右下角的按钮，但我可以做到这一点。
这不会真的是不错的设计。
实际上，我要确定我在这里做什么
被按下的按钮的标记是什么。
您会注意到，这种打法方法接受一个参数。
这就是所谓的发件人和发送者的发送者要
究竟代表什么时采取行动。
如果我按下一个按钮，发送者将是该UIButton的
我按下，这样就意味着，UIButton的
有一个标记，因为我创建了一个标签。
>> 如果我想要得到的标签，我可以简单地说
我想在标签的发送者，
，我刚刚铸造一个UIButton。
我碰巧知道发送者将是一个UIButton。
它并不总是必须是一个UIButton。
例如，我可以，我注册了相同的事件处理程序
为一个用于一个按钮，一个用于一个滑块。
在这种情况下，我知道他们所有的按钮，所以我说
我想这是一个按钮，然后我就可以得到标签，
从标签我现在知道我在里面的电路板。
然后，我可以简单地设置X或O，可翻转转，
检查谁赢了，等等。
>> 至今有任何疑问？
好了，所有的代码，我们在网上发布，我们不希望进入太多
的的井字逻辑，但现在你可以看到，真正
我们正在做的是，我们遍历这个数组，
因此，我们有一对夫妇的for循环在这里，我们只是比较看
我们有一个匹配的所有行，比赛在一列或类似的东西。
要真正运行这个程序，如果我点击其中一个按钮
玩的方法被解雇了，所以这意味着我只设置
是X的按钮，所以现在这个按钮将是一个O，等等，
所以这是我们如何开始这个单页面应用程序进行交互。
>> 我们将发布的代码，可以随意细读，
但现在，让我们来谈论一些应用程序，更多的不仅仅是一个页面。
井字令人兴奋的是，大量的应用程序里面的iOS
这些钻孔是一种具有多个屏幕下来的东西。
第一个概念，我们需要谈论的协议，
协议就是一组方法
你能答应来定义。
如果我创建这个新的协议有2种方法，第一个，
如果返回类型为void，我把它叫做foo的。
它不带任何参数。我有另一种方法。
它返回一个int。我打电话给它吧，它需要一个参数。
所有这一切协议，这就是所谓的SomeProtocol在这里，
这是一组的人可以实现的事情。
我还没有在本协议说什么foo的。
相反，我只是说如果你想，你可以foo定义。
如果我创建一个视图控制器或创建一个类
我可以在这个类的承诺，以实现
其中的一些方法，所以举例来说，如果说
现在说我在做一个对您的承诺，这里面
这个视图控制器类的，我会为foo和bar的定义。
>> 这是为什么有用吗？
很多内部组件的iOS利用
设计模式叫做代表团，代表团说什么
是，举例来说，如果我有一个文本框
有我的文本框内部的一些事件，可以注册，
而不是创建单独的事件，我能做些什么，我可以说
这个文本框的委托，将某些对象。
当我说，这是一个代表现在这意味着，
当有一些事件将会被解雇，在文本框中
而不必注册或类似的东西
它只是要调用的方法的委托。
例如，在里面我有一个方法，当我按我的文本框
完成后，在右下角的按钮，
等，而不是注册的事件处理程序，我可以说是
文本框，这里是一个对象，我希望你调用一个方法
每次有人按下“完成”按钮，
这意味着，对象必须实现某些协议
说我答应做的按钮操作定义，
因为如果不定义该方法，你按了，
那么它会是混乱。
>> 让我们来看看一个例子。
在这里，我只是有一个文本框，
在这里在此右侧的这个文本框的属性之一是委托。
这是一个属性的类。
我在这里做的是我控制点击，在这里，我拖着这点
到视图控制器，并且说，现在这个文本框的委托，
将是视图控制器。
这意味着，当发生某些行动，而不是登记
我要你把它们发送到委托独立的事件处理程序。
现在，让我们来看看在我的视图控制器。
里面的。h文件中，我已经作出了承诺。
我已经答应来实现本协议内的一些方法
被称为UITextFieldDelegate，并再次，
这仅仅是一些列表的一些事情，我可以选择执行。
>> 如果我来到这里，在我的m文件，我已经实现了这样的一个方法。
我把它称为textFieldShouldReturn
因为这是这是什么所谓的协议内。
现在每当我按下完成按钮，该文本字段内
这是发生了什么事情被调用，所以我没有注册事件处理程序。
我的委托，每次发生此事件被触发
这是将被调用的方法，所以，如果我来这里我的故事板，并运行它
而加载，我们可以看到，这是什么做的。
在我的屏幕上，我有两件事情。
我有这样的文字栏位，我有这样的标签。
我只是说，我想这个标签的文本
等于不管用户键入的文本字段内。
下面这一行，这里是一个简单的方法，我给你打电话
在文本字段说，我希望你能隐藏键盘。
这仅仅是苹果选择的任意方法。
>> 同样，在我做了什么，我不得不将所有东西了，所以我第一次来到这里。
我的视图控制器拖动到文本框中。
我放手，我可以看到，在这里，我可以使这个文本字段属性
因为在这里的视图控制器中，我定义了一个属性
这是一个IBOutlet的文本字段。
这是说，我可以连接属性
我的用户界面中的文本字段。
现在，当我点击这个，我可以开始输入。
现在，如果我点击“完成”按钮，这是怎么回事火
我现在可以响应的事件。
事件处理程序。
这就是我刚做的按钮。
有意义吗？
>> 这是一种设计模式，你可能会不会发现自己
创建自己的协议，但我们知道，有些
不同的iOS组件注册事件以不同的方式。
按钮，例如，使用这些IBActions。
文本字段，另一方面，要使用的代表。
我们可以看到，你可以看看，里面的所有的文件。
顺便说一下，其实有一吨重的为你的iOS内置的UI东西，
例如，在我说在右下角
我选择这个文本字段。
我这边走了过来。
我向下滚动了一下，返回键，
我实际上可以使这一大堆的东西一样，如果我想，说
紧急呼叫，而不是我能做到这一点，这是完全随机的，
我不知道为什么有一个内置的紧急呼叫按钮，
但也有，它说，在非常小的字母紧急呼叫。
你去那里。
>> 绝对探讨所有在iOS这些不同的选择。
代表任何疑问吗？
同样，只是一个有趣的设计模式，你应该知道的。
好吧，让我们的下一代来看看在表视图。
表视图是基本的项目清单，是所有的地方在iOS。
当你翻阅您的所有联系人，你看
设置页面的事情的清单，而这种被称为表视图。
在iOS上实现表视图是非常简单的。
而不是下降，UIViewController的一类
就像我们以前做之前，我们只需要简单地说，而不是
一个UIViewController没有我想要做的一切，
我说一个UITableViewController没有我想要做的一切，
所以，简单地添加一些额外的东西，是完全为我们做了。
我们需要做的很少，基本上填补空白的表内。
>> 为了显示一个表，我需要回答一些问题。
我要回答的第一个问题是表中有多少段？
当你翻阅您的联系人应用程序，你会发现它的种
组织的作为，那么你的家，你有那么一点子标题。
每个这些被称为一节。
您可能会或可能不需要这些。
你需要做的第一件事是实现的方法
所谓的tableView：numberOfSectionsInTableView。
这只是简单地返回你有多少段，
因此，可以说，如果你有一个很大的表视图，返回一个。
接下来的问题是，内部监督办公室需要知道的是你有多少行？
例如，你正在翻阅一表视图。
你有一个固定数量的歌曲，你看或固定数量的接触。
如果你是我，当然，没有那么多，
所以这是如何的iOS知道有多少细胞显示。
>> 同样，这可以说是这样回报3。
我的表视图中有3行。
最后，IOS需要知道每一个细胞看起来像什么，
所以它实际上是做什么的，是这里调用此方法，
的tableView：cellForRowAtIndexPath。
这将调用此方法，你的表上的每一个细胞内。
它是如何知道多少次调用它呢？
好了，你告诉它里面节中的行数。
我们会打电话给我们的细胞，
在这里面，在这里你可以真正喜欢做的事情
设置文本，或者告诉你是什么蓝色的小按钮，在右侧。
的模式，让这些细胞，我们要使用此方法
被称为dequeueReusableCellWithIdentifier。
>> Objective-C的实际上是非常有名的荒谬的长度它们的方法名称，
这确实是一个不错的点的例子。
这种方法确实是这样的，只是说我要你给我一个细胞。
只是iOS的事情。
如果你有像10万首歌曲，在你的iPod
IOS不想要做的是分配100,000个细胞，
因为如果你在列表顶端时，你是否真的需要分配内存
下来是99000行的单元格？
没有，因为当你滚动，你可以种分配，当您去。
这样做是为了你。
您不必担心所有的愚蠢表现的东西。
你说的是你调用这种方法dequeueReusableCellWithIdentifier，
这说，没关系，如果你需要，我会为你创建一个新的细胞。
>> 但是，如果你在表的底部，你已经分配了一些细胞
在表的顶部，你真的不会需要很快
我给你一个，而不是分配一个新的，
所以这是一个不错的性能问题。
您不必分配自己的细胞。
这将会给你回一个细胞。
这将返回给你一个单元格对象。
一旦你有你可以做的东西给它的单元格对象。
此属性的文本标签，您可以设置文本的单元格。
您可以添加在右边的箭头或其他一些随机的东西
这个叫其他财产的accessoryType，等等等等。
>> 让我们来看看现在实际执行的表视图。
当我创造了这个项目
而不是说单一视图的应用程序其实，我这边走了过来
主详细的应用程序，基本上是这样的邮件应用程序
在iPad上的表格视图左侧，然后在右边的内容。
在iPod或iPhone上，这是对应于一个单一的表视图。
这就是我得到了我的启动代码。
>> 让我们先来看看在情节串连图板。
所有这一切都为我所做的，基本上创建的。
此导航栏给我看一个例子细胞可能看起来像，
，我可以双击，更改标题。
任何其他UI问题，我可以处理。
头文件看起来真的很简单。
与其说这是UIViewController的，我们现在说这是一个
TableViewController，所以我们知道我们想要调用的所有表的方法。
接下来，我想创建一个属性的代表
我的表里面的东西。
此表将任意显示
水果的列表，所以我需要创建一些数组
我可以将水果。
我的执行文件的第一件事情里面，我想要做的
我想确保我初始化数组。
>> 我说的alloc初始化，创建我的果实阵列，
，我加入到它的4件事，其中之一是更有争议比其他3。
而现在，我有一个数组大小为4。
我们不停地摇晃，CS50。
我现在有一个数组的大小为4。
现在，我要开始回答这些问题，而实际上，
当我创造了这个应用程序时，所有这一切都已经为我做的。
我没有在表视图中输入的节数。
这是已经存在，而且我填补的空白。
我有多少段？
一。全部完成。
我有多少行？
嗯，我有一个行的每一个水果，所以这个数
说有多大的数组的属性是什么？
这是我有多少行。
最后，我需要说的每一个细胞看起来像什么？
我要说dequeueReusableCellWithIdentifier。
>> 同样，这已经为我写的。
我没有这样做我自己，我要回去
这种细胞在这个位置。
请记住，我们可以将这个同样的方法对每一个细胞，
这种说法在这里，这indexPath参数，
说行我
如果我说indexPath.row在这里
这将是0，那么这将是1，那么它会是2，这是，所以我知道
我目前显示什么样细胞。
我想设置文本的单元格使用此为textLabel属性
里面去我的果实阵列，并得到
对应于每行的对象。
如果这是一个字符串，我现在设置
text属性设置为一个字符串。
我可以做的一件事。
我也注册了一个事件处理程序的每个细胞，
所以，当我点击每个单元格
这didSelectRowAtIndexPath，这是怎么回事打电话给我，
通过简单的定义，我现在可以处理发生了什么
当你点击一个单元格，再一次，我们通过细胞被窃听
所以，我们可以重复使用相同的事件处理程序为我们所有的细胞。
>> 再次，这是IOS是为我做的东西。
让我们显示另一个恼人的弹出
简单地说，你挑的东西在那里的东西
将是该行的对象。
当我运行这个，我要这个漂亮的表视图
一排这些水果，如果我点击
它告诉我发生了什么事。
有意义吗？
让我们建立一个稍微复杂一点的应用程序，
尽可能多的点击你选择了番茄。
很好的情节串连图板
是它的不只是单独来帮助我们设计屏幕，
它也将帮助我们联系在一起，我们的整个应用程序，
所以最终的应用程序，我们将建立新闻阅读器这是很好的运动，
等将有多个屏幕，这样我就可以实际上代表
这些多个屏幕的故事情节，
我可以放大和我的应用程序从一个高的水平。
>> 为了创建一个新的元素里面我的故事板
其实很简单，里面的界面生成器。
如果我想添加另一个屏幕，例如，
我可以先缩小与苹果喜欢这么多的双指缩放，
在这里之前，我搜索一个按钮
我和拖放一个按钮
如果我要创建一个新的画面，我可以实际上只是拖动和下降
整个视图控制器，所以如果我挑了这个，把它在这里，
嘿，还有另一个屏幕，所以现在使用同样的故事板文件
我可以有我的应用程序内的所有的画面，我可以缩小
看看它们如何相互作用。
这些还没有互动。
这2个屏幕互动的方式，就是你定义的关系。
基本上你可以说这屏幕，当您按下此按钮时，
我希望你能滑动到这个新的屏幕。
这意味着有这种关系
第一屏和第二屏。
你会基本上是一个箭头，从该按钮的第二个屏幕
他说，当你按下这个按钮时，这就是我想要去的地方。
就像我们控制点击和拖动来定义这些网点
我们要到做同样的事情，定义这些segues的。
>> 我们将看到一个例子，在我们实际过渡
从一个屏幕到另一个iOS是不够好，调用此方法
被称为prepareForSegue，这是我们可以开始
将数据从一个应用程序到另一个。
在这个例子中，我们将要看看它基本上允许我们
过滤棒球队的联赛和部门。
例如，当我选择一个联赛，我想过渡
我的下一个屏幕，在那里我可以显示所有的部门
该联盟或所有不同的团队。
我需要发送的队伍，你应该显示该屏幕。
要做到这一点，我要采取这种方法的好处在这里。
>> 最后，只是一个随机点在iOS上。
如果你要存储的数据是这东西叫做核心数据，
这实际上是一种复杂的工作。
您也可以使用SQL来存储数据，
再次，是好的，但一种更复杂的一面工作，
但iOS也支持这些属性列表非常酷的事情，
和财产清单仅仅是一个文件，该文件表示键值对。
您定义的键的列表，和你说，这个键是一个数组。
此键是一个字符串，基本上什么可以做，
在JSON中，你可以做里面的一个属性列表，
，所以这真的很好，让我们能有一些数据。
例如，我有这Teams.plist，我创建了。
我创建了一个新的plist文件，我可以向下钻取。
这是一个字典，这是一个字典，这些都是字符串，
所以这是一个很好的图形表示的JSON文件
或只是一组键值对，
所以这是，我会与我的应用程序内的数据。
>> 让我们先来这里。我们现在有更多的文件。
不过，让我们先来这里的脚本。
其实，故事情节在这里，如果我能缩小
现在我们可以看到，这是我的应用程序的流量。
我首先要在此屏幕上开始。
我要向下钻取到这个屏幕，
，我会深入到这个屏幕，我们可以在这里看到的，如果我种
移动这些后，我们可以从这里到这里的箭头，
我定义箭头的方式，如果我在一点点放大，
如果我过来到这个视图控制器，
这里是一个细胞，我想说的是，当你点击一个细胞
我希望你能滑动到另一个屏幕。
我可以简单地按住控制，
多一点点滚动，按住控制，拖动该单元格，并放手。
>> 在这里，我们说什么的过渡要使用的呢？
你想使用该幻灯片的事情，这就是所谓的推吗？
你想从下往上滑动吗？
这就是所谓的模式。
当我点击其中之一，它会为我作出这样的箭头，
这意味着，其实我已经会发生什么，当我按下这个按钮，图形化的处理。
我没有写任何代码就可以从一个屏幕上滑动到下一个。
我定义的界面生成器，这在视觉上内。
如果我点击这个箭头，我们可以看到，我给了这东西的名称。
我把它叫做的showDivisions，这是使我可以知道
发生的转变是什么，我们就会明白为什么在短短几秒钟之内。
这就是我在我的应用程序的不同屏幕有线。
如果这是一个按钮，例如，而不是表视图，
我可以控制的按钮上单击，拖动到下一个屏幕，
这就是我可以做导航的方式。
>> 真的很快，如果我们到MasterViewController来，
再次，我们只是要定义的东西的清单
将显示在表视图。
在这里，我说我要你把那个plist文件，
我希望你能加载它到一个字典，
一旦你有字典，我会再回答这些同样的问题。
这里的节数。
其中，有一排为每一个联盟，每个单元格中的文本
应该是第一个，第一个联赛，联赛第二，等等。
最后，我要使用这种方法，我们只是看到了被称为prepareForSegue，
这是方法，将被解雇，当我点击
在那些行之一，因此激活该过渡
我设立的箭头。
这是说，我可以有多个
从一个到另一个屏幕的关系。
如果我有2个按钮，每个按钮带你到不同的画面
我要为每个按钮有2 segues，1。
但此prepareForSegue是，再次，要被重用
对于每个不同的关系，因此，这意味着，我需要一种方法
确定，如果按下第一个按钮或按下第二个按钮。
>> 还记得当我给Segue公司的名称，这showDivisions，
这就是我现在知道，这是SEGUE被激活。
我想要做的就是我想说的
我想弄清楚什么我只是打，
等拿到，我可以说，我要为选定的行的indexPath，
记得indexPath只是说，我只是点击，
然后我想说，我想弄清楚我要去的地方。
这的destinationViewController，这是一个财产的SEGUE。
这就是我要的画面，
所以我知道我要的屏幕被称为DivisionsViewController
因为我创造了这个类，
所以现在如果我说d.divisions
我现在设置的视图控制器的属性，我去。
这是我发送的数据从一个屏幕到另一个屏幕。
>> 只要看看这DivisionsViewController的
你可以在这里看到。h文件
还有就是物业部门，这就是我基本上填充，
所以这就是我知道我显示对应的部门
我点击的同盟，并再次，
实际的表视图看起来几乎是一样的，只是回答这些
3个简单的问题，以及确定
会发生什么，当你移动到下一个屏幕。
只是一对夫妇，其他的东西在这里。
您会发现在顶部，而不是在这里说的＃include
我现在说的＃import。
这仅仅是一个Objective-C的东西。
的进口基本上是一个更好的版本包括，
例如，我们需要知道这个类是什么，
这样我就可以不只是说DivisionsViewController的。
如果我们不包括hashtag standardio.c内。c文件
编译器不知道printf的是什么。
同样，如果我不导入DivisionsViewController
编译器真的不知道什么DivisionsViewController的。
只要确保这里面不同的m文件，确保导入的
对应的。h文件，使编译器知道这是怎么回事。
>> 最后，什么苹果最终没有被使用Web视图显示一些数据，
一个web视图对象，在其中您可以嵌入
您的应用程序内部的一个小的web浏览器。
所有你需要做的是提供一个URL到您的网页浏览器，
所以我想去mlb.mlb.com，
这是怎么了，我可以访问的主页每个团队，
通过此URL
的web视图可以显示这对我来说，我可以浏览周围，
模拟器是在使用中的一个。
现在，这是从我的plist。
如果我点击这个来自我的plist，滑动处理
定义这些segues。
我点击一多，
现在这里是我的UIWebView的，所以就像
这里的网站，我只是嵌入式的URL，
我没有处理什么疯狂的。
这是如何显示的Web页面。
之类的东西这回按钮，在这里也给我
完全免费的，因为我已经定义了这些关系segues。
>> 有什么问题吗？是啊。
[学生]因此，当你使用alloc，你永远不会有免费的什么？
没错，当你调用alloc和init，你没有释放它。
IOS会为你处理所有这一切。
这是美妙的，而你没有违反任何规则。是啊。
[学生]：如果你有更多的球队，可以在屏幕上显示，
它会自动有一个滚动的选项，或者是，你需要添加的东西吗？
没错，如果我有更多的球队，例如，它会自动处理
对我来说，所有的性能问题的滚动
巨大的表也完全为我处理。
>> 其他问题吗？
所有这些代码将被发布。
我们种更微小的细节，掩盖了一点点，
但诸如此类的web视图设置一些属性
只是事情，你可以通过浏览苹果的文档，
这是真的，真的很好的布局。
他们有很多的示例应用程序和示例用法
不同的API，所以肯定细读如果可以的话。
只是一些有用的链接，你可能想看一看。
这些都是一些有用的文档指南。
网址是巨大的，所以他们缩短。
第一个是整个库文件。
很少有搜索栏，所以如果你开始输入按钮
它会开始给你所有的信息，所有的事情，你可以用一个按钮。
我还包含了表视图编程指南“。
它可以处理更详细的表视图，
做这样的事情如何动态地添加单元格或编辑单元格或删除。
>> 有大量的示例应用程序从苹果公司会告诉你如何做到这一点，
终于，这最后一个是人机界面指南，
这是基本的UI组件的一些讨论，
这样的话不使一个按钮，4个像素，4个像素。
这是一个坏主意，和其他的东西，苹果想要你做的事
鼓励良好的设计。
>> 最后还有什么问题之前，我们完成了吗？
好了，肯定会觉得 - 我们有特殊的标签上讨论。
我们将有一个iOS之一，所以肯定会觉得自由利用这一点。
如果你想与你的同学对项目工作
或帮助找出一些随机的iOS的东西
随时给我发电子邮件，绝对仔细阅读所有网上的代码，因为
的利益的时候，我们只是在掩饰了一种更
细粒度细节的东西。
但是，如果没有，那么在您的iOS项目，好运气，我希望我们能有
在App Store中的应用程序的大量涌入。
[CS50.TV]