Tag: cs193p

CS193P:使用Swift讲座4笔记开发iOS应用

今天,我们将讨论自定义视图,特别是工程图视图。 什么是视图? 基本上,我们使用这些分层的矩形视图来构建UI。 视图可以有许多子视图 ,但只能有一个子 视图 。 如果您从计算器应用程序中回想起,我们的堆栈视图包含按钮的子视图,甚至其他堆栈视图。 我们可以使用Xcode中的界面生成器来构建视图,也可以通过编程方式来构建视图。 UIViewController中有一个重要的属性,称为view ,它是窗口中的顶级视图。 请注意,当该视图旋转时,其边界将改变。 然后,我们就有机会更改此视图中的所有子视图。 此功能使我们可以根据设备的方向或大小指定视图的关系。 通常,尽管我们不需要此视图,因为我们倾向于将视图添加为可以直接使用的出口(@IBOutlet)。 那么我们如何初始化UIView? 好吧,如果您还记得在Swift中,类的初始化有很多规则,那么我们会尽量避免使用它们。 但是,如果我们不能避免它们,则有两种初始化UIView的方法,我们应该注意。 初始化(框架:CGRect) 如果我们以编程方式创建视图,则使用上述初始化。 如果我们选择使用接口构建器在Xcode中创建视图,则可以使用以下初始化: 初始化(编码器:NSCoder) 这个编码器是关于什么的。 好吧,我们使用界面生成器创建的所有视图都被编码为XML文件。 当我们运行程序时,该XML文件将被加载,并且基本上包含有关如何创建这些对象的说明。 如果我们需要一个视图初始化器,则需要实现这两种方法,以便无论是在代码中还是在Xcode中创建视图都可以初始化。 设置我们的视图的另一种方法是awakeFromNib ,该视图只有在界面构建器中创建后才能起作用。 每当我们在视图中处理与绘图有关的任何事情时,我们都会使用CGFloat类型。 CG代表核心图形。 CGRects还有很多其他便利方法,我们应该很好地熟悉它们。 让我们看一下坐标空间。 我们将看到它不是笛卡尔坐标系。 在笛卡尔系统中,上升意味着增加y坐标的值。 在这里是不同的。 请注意,我们处理的是点 ,而不是像素 。 像素就像是可以在屏幕上显示的最小的光线。 一些设备的每个点有很多像素,这意味着像素被密集地包装。 这很棒,因为这意味着当我们查看曲线(如字体)时,它们不会出现锯齿状的边缘。 想想Retina显示屏上当前的Macbook和iPhone。 由于每个点压缩了多少像素,我们不能使用像素作为绘图单位,因为在密集压缩的像素设备上,我们的绘图看起来非常小,而在轻度压缩的像素上,绘图或图像会显得更大。 因此,我们得出了结论。 所有UIView中最重要的属性是 bounds 。 其余两个属性 center 和 frame 与边界混淆了,但是它们与绘制位置(边界)无关。 框架和中心与我们所处的位置有关。 底线是永远不要使用框架和中心绘制。 它们仅应用于将您置于您的超级视图中。 […]

CS193P:使用Swift Lecture 2 Notes开发iOS应用程序

什么是MVC? MVC基本上不适合我们将应用程序分为3个不同的阵营,即Model,View和Controller 。 该模型与您的应用程序做什么有关。 它与应用程序的显示或在屏幕上绘制的方式无关。 对于计算器应用程序, 模型可能是进行计算的部分。 控制器与模型的显示方式或在屏幕上的显示方式有关(UI逻辑)。 视图是您的控制器的奴才。 这些是Controller用来在屏幕上放置诸如按钮,标签,表格等之类的东西以显示Model中的内容以及从用户那里获取输入以更新Model的东西。 知道如何将代码分为这三个阵营是一回事,但难题的关键在于它们之间的通信。 也就是说,什么是允许的,什么是不允许的。 Controller必须完全控制Model ,并且可以随时与它对话。 它需要完全访问权限,因为它的工作实际上是向用户展示此模型中的内容,并根据用户输入来更新模型。 Controller需要能够使用其奴才,但是它想显示Model 。 在大多数情况下, 控制器和视图之间的连接是通过插座进行的 。 在Xcode中,它显示为@IBOutlet 。 例如,我们在计算器中用于显示的标签是控制器用来显示Model中执行的数字和计算结果的插座。 该模型是独立于UI的,而View是完全UI的。 他们绝对不应该互相交谈。 视图可以与控制器对话吗? 是的,没有。 View的问题在于其中的所有奴才都有通用对象,例如UIButton和UILabel 。 它们是由Apple几年前创建的,对您正在构建的应用程序(在本例中为计算器)一无所知。 但是,有时需要将UI中的更改传达给Controller 。 然后, View与Controller的通信方式必须“盲目”和“结构化”。 沟通是盲目的 ,因为视图中的对象不知道它们正在与哪些类进行交谈。 例如,按钮对CalculatorViewController一无所知。 之所以构成这种通信,是因为由于不了解对象的两端,因此它们必须以定义良好的预定义方式进行通信。 视图可以与Controller进行通信的结构化方式有哪些? Target-Action:这非常简单,因为Controller可以通过定义方法将目标挂起。 @IBAction。 然后,当View要与Controller对话时, View会调用此方法。 制作touchDigit函数时,我们在计算器应用程序中使用了“ 目标:操作 ”通信方式,因为我们希望按下按钮以调用计算器中的方法并告诉我们按下了哪个按钮。 有时, 视图需要传达比“被感动”更复杂的东西。 例如,作为通用View仆从的ScrollView可能需要告诉Controller某人开始滚动,或指示某人放大了特定的缩放比例。 也就是说,它想通知控制器,因为控制器可能希望对此做出反应。 放大或缩小时, 模型可能会更改。 此外,也许ScrollView需要确保做某事是否可以。 可能需要问控制器一个问题:“我现在应该允许垂直滚动吗?”。 我们有很多消息涉及到诸如Mins […]

CS193P:使用Swift讲座1注释开发iOS 10应用

这些基本上是我本次iOS课程的笔记。 从许多方面来说,笔记都是教授所说的逐字记录。 讲义幻灯片也是iTunes U上该课程的资料部分中提供的那些幻灯片。这些注释确实对我有用,但对其他参加该课程并且希望有一种方法来刷新自己对本教程中发生的事情的人可能有用。讲课而不必重新观看讲课,或作为对讲课的补充。 我将在各个领域添加自己的意见,并提供示例或其他见解,以进一步理解课堂上讲授的概念。 我希望这些说明不仅对我有帮助,对其他有志成为优秀iOS开发人员的人也有帮助! 该课程确实有一些前提条件,可以满足这些前提条件。 主要的是在面向对象编程 (OOP)方面的经验。 满足要求的相关斯坦福课程为CS106A&B , CS107 , CS108或CS110 。这是斯坦福大学的高级CS课程。 我本人并不满足所有先决条件,但不会因此而阻止我追求目标。 可以将它们视为四层,其中最底层靠近硬件,而最顶层靠近用户。 核心操作系统在硬件附近,而可可触摸在用户附近。 iPhone正在运行UNIX ,因此它具有完整的多任务处理和文件系统。 构建应用程序时,您可以使用所有这些功能。 特定于移动设备的是Power Management和Keychain Access之类的东西(以确保人们不会访问他们不应该访问的东西。)这些API几乎都是用C编写的,我们将不在这一层做任何工作。 UNIX上的面向对象层是 核心服务层,因此我们可以使用Networking , Multithreading或Preferences和SQL数据库。 此层中没有用户界面 (UI)。 该层称为基础。 具有讽刺意味的是,这个(多媒体)层非常重要,我们不会花太多时间。 该层包括视频,各种不同的音频框架,静态图片(如JPEG),用于2D绘图的Quartz API,用于3D绘图的OpenGL等。 在顶层,我们将花费大部分时间在此处,这是Cocoa Touch 。 它是用于构建用户界面的面向对象的API。 这些用户界面不仅限于屏幕上的按钮和滑块。 例如,它们包括摇动手机时的操作以及使用手机的方向作为输入。 它还包括动画。 我们没有时间来遍历该层中的所有对象,但是我们的想法是,我们了解的一些对象将具有使用它们的范例,这些范例可以应用于我们不熟悉的对象。 我们所做的一切都将在Xcode 8(或更高版本)中进行,我们将使用相对较新的编程语言Swift来完成所有工作。 与框架同样重要的是一种称为Model-View-Controller(MVC)的设计策略或方法。 Model-View-Controller是一种将面向对象应用程序中的所有类划分为三个不同组的方法。 Model组是我们程序执行的,独立于UI。 对于计算器,这将是所有的计算。 如何添加,划分,平方根等。 视图是用户与之交互的用户界面。 它通常由通用用户界面元素(如按钮和滑块)制成。 对于计算器,这将是按钮和显示。 控制器是模型和视图之间的粘合剂 。 它是侦听UI中发生的事情,做出决策,更新模型或由于模型中的某些更改而更新UI的事物。 […]

IOS:CS193p fall2013任务2:添加一个button让用户重新启动游戏

我正在学习课程CS193P(IOS开发)在iTunes上,我刚刚开始assignment2。 我被困在要求我重新开始游戏的任务上。 在项目上的一点点背景:我正在为我的CardGameViewController中的重新启动button新添加的操作方法的代码。 我有两个私人的属性: 游戏和甲板 。 我使用CardGameViewController中的延迟初始化来初始化它们,当用户第一次触摸一个button时(翻转卡片)(教授在课堂上讲过的原始项目只是UI上的一些卡片,用户可以翻转它们并匹配它们,没有重新启动function,这是我要求在作业中添加的。)为了让用户重新启动游戏,我想我需要重新初始化上面提到的两个属性并更新UI。 我尝试了下面的代码,但是当我触摸我刚刚添加的button时程序崩溃了: – (IBAction)touchRestartButton:(UIButton *)sender { self.game = nil; self.theDeck = nil; // Maybe I also need to initialize the two properties again here using some code which I cannot figure out right now…. [self updateUI]; } 任何人都可以向我解释如何在objective-c中重新初始化一个属性吗?(我也试过[self.game release],但编译器阻止我这样做,因为它说它是在ARC模式下)还是有其他方法完成这个重新开始的游戏任务?

IBOutlet属性返回“Can not unwrap Optional.None”错误

我遇到了一些代码,在我的代码中带有可怕的“Can not unwrap Optional.None”错误。 我正在关注iTunes U斯坦福大学的Shutterbug代码。 这是Objective-C为其中一个类提供的代码。 http://pastebin.com/LG2k3BBW 和我在Swift中提出的一样。 http://pastebin.com/pGtSzu6z 在追查这些错误之后,这些线路似乎给我带来了问题 self.scrollView.zoomScale = 1.0 和 self.image = nil 有什么问题在这里的任何意见? 我最初把所有的setter放在ViewDidLoad函数中,并且收到了同样的错误。

IOS CS193p – 为什么IBAction连接拖到.m文件而不是.h?

我注意到,在Stanford CS193p课程的计算器演示中,IBOutlet连接被从标签拖放到头文件。 但是,IBAction连接直接在.m文件中创build。 我尝试阅读文档并在Google上search,但无法find背后的原因。 我会争辩说,IBAction digitPressed方法也应该在头文件中声明(不应该是接口的一部分?)。 我显然是相当新的目标C(主要在Java中工作),所以我相信我缺less一些基本的东西。 谁能解释一下吗?

_BSMachError运行斯坦福的CS193p Smashtag应用程序

我从课程网站下载了Smasthag演示程序。 项目build设很好(在Twitter,TwitterRequest等类的小改动,因为我使用最新的Xcode 7b4),并在模拟器上工作正常(我也必须添加NSAppTransportSecurity键到info.plist ),但不是在设备上 – 它doesn不要取推文。 我使用iOS 9 Public Beta和iOS 8使用iPad 2对iPhone 6进行了testing。 此外,当应用程序在模拟器中运行,我改变hashtagsearch,整个tableView重新加载新的推文,但在控制台,我得到这个: 2015-07-23 03:24:15.560 Smashtag[25991:4344251] _BSMachError: (os/kern) invalid capability (20) 2015-07-23 03:24:15.560 Smashtag[25991:4344251] _BSMachError: (os/kern) invalid name (15) 应用程序仍然运行良好,但这个错误错误我。 我不能在谷歌(只有一个孤独的印度尼西亚鸣叫)这个_BSMachError罚款。 我也不明白为什么应用程序不会在设备上获取推文。

为什么UILabel没有初始化?

代码来自Stanford CS193p。 我添加了一个NSLog检查出来。 标签似乎没有被初始化。 任何想法? @interface AskerViewController() <UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UILabel *questionLabel; @property (weak, nonatomic) NSString *question; @end @implementation AskerViewController @synthesize questionLabel = _questionLabel; @synthesize question = _question; – (void)setQuestion:(NSString *)question { _question = question; self.questionLabel.text = question; NSLog(@"label is %@", self.questionLabel); } @end NSLog的结果是: 2012-07-31 01:56:45.177 Kitchen Sink[23931:f803] label is (null)

我如何创build一个全局UIManagedDocument实例每个文件在磁盘上由我的整个应用程序使用块共享?

我想devise一个帮助器方法,它将检索一个UIManagedDocument,然后打开并返回它,以便我可以从我的应用程序中的几个地方访问相同的UIManagedDocument。 我对这种asynchronous性质有困难,因为我对块不太熟悉。 理想情况下,事件的顺序是这样的: X类调用帮助器方法来检索UIManagedDocument,并包含一个代码块,以在打开的文档返回时运行。 类方法检索UIManagedDocument,并根据需要调用openWithCompletionHandler或saveToURL,并包含一个在打开的文档返回时运行的代码块。 openwithCompletionHandler或saveToURL完成他们的任务,并返回成功=是,并在其代码块中运行代码 类方法完成其任务,并返回一个打开的UIManagedDocument并在其代码块中运行代码 我可以通过原始块通过某种方式吗? 这是我的代码到目前为止。 任何想法非常感激,谢谢。 // This is a dictionary where the keys are "Vacations" and the objects are URLs to UIManagedDocuments static NSMutableDictionary *managedDocumentDictionary = nil; // This typedef has been defined in .h file: // typedef void (^completion_block_t)(UIManagedDocument *vacation); // The idea is that this class method will […]