[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]