Tag: 教程

什么是PlistBuddy?

PlistBuddy是mac内置程序,可帮助用户编辑.plist文件。 当您使用CFBundleXXXX文件时,它对于编辑很有用。 与其他程序不同, PlistBuddy未设置为默认路径。 如果需要运行PlistBuddy ,则需要运行usr/libexec/PlistBuddy 。 检查帮助菜单 键入/usr/libexec/PlistBuddy –help显示PlistBuddy帮助菜单。 菜单不是很长,您可以看看。 (检查下图) 2种不同的编辑模式 使用PlistBuddy编辑plist文件时,有2种不同的编辑模式。 我使用“ 编辑模式”和“ 直接模式”来命名它们。 并且,我们将首先使用“ 编辑模式”来解释命令。 之后,我将列出直接模式命令。 编辑模式 :进入编辑模式,如vi编辑,如果要应用更改,必须最后保存。 (更容易,cmd输入最少) 直接模式 :在终端中键入cmd,它将立即将更改应用到文件。 让我们打开终端并开始键入命令。 编辑模式 1.创建.plist /usr/libexec/PlistBuddy /info.plist 2.添加键值对 添加:version字符串1.0 3.打印列表内容 打印 4.添加数组 添加:student arr 添加:student:字符串tom 添加:student:字符串可能 添加:student:字符串约翰 5.添加字典 添加:活动字典 添加:activity:swim字符串10-6 添加:activity:运行字符串9-6 6.保存 保存//保存文件 7.删除元素,数组或字典 删除:version 删除:学生 删除:activity:swim 删除:活动 8.还原 恢复//恢复到最后保存的文件 9.退出 退出//退出编辑模式 […]

Swift中的内存管理:了解强引用,弱引用和未引用

在我们正在执行的所有编码的背后,您可能在编写代码时注意到一些变量,它们引用了strong , weak或unowned 。 他们到底是什么意思? 通过以strong为参考声明所有变量,是否会使您的变量更强? strong , weak或unowned的用法实际上与Swift中称为自动引用计数(ARC)的内存管理有关。 让我们放慢一点,尝试了解这里的含义。 因此,ARC实际上会进行自动引用计数。 在计算机科学的定义中, 引用计数是一种将引用,指针或句柄的数量存储到资源(例如对象,块或内存,磁盘空间或其他资源)中的技术。 简而言之,ARC实际上有助于将引用存储到内存中,并有助于在不使用引用时进行清理。 另外,在这种情况下,引用计数仅适用于类的实例,不适用于结构和枚举,因为它们都是值类型,而不是引用类型。 在进一步介绍之前,为什么内存管理这么重要? 由于内存管理在分配内存中起着巨大的作用,因此程序确实可以在用户的​​请求下执行,并且在不再需要时可以免费重用,因此这确实是一个大问题。 但是,如果您耗尽内存,会发生什么呢? 该任务将停止执行,这意味着您将无法执行任何任务。 该任务可能不会继续执行,但会继续运行,直到达到极限并且程序崩溃为止。 您可能不希望用户使用越野车程序。 什么是自动引用计数(ARC)? 如官方文档中所述, 内存管理在Swift中“行之有效”,您无需自己考虑内存管理。 当不再需要类实例使用的实例时,ARC会自动释放它们。 ARC还跟踪信息,例如了解代码之间的关系,因此ARC能够有效地管理内存资源。 ARC如何工作? 每次通过init()创建类实例时,ARC都会自动分配一些内存来存储信息。 更具体地说,该内存块保存实例以及属性值。 当不再需要该实例时,将调用deinit()并且ARC将释放该实例的内存空间。 使用下面的代码,这很容易解释,但是我仍然希望您了解代码的作用。 这是带有Person实例和Gadget实例的两个类的示例, Gadget具有init方法,该方法将设置实例的属性,这意味着将任何信息分配到内存中。 同样,在deinit ,我们将看到实例被释放,这意味着包含信息的内存将在我们的情况下释放。 强vs弱vs无主-事实 通常,在创建属性时,除非引用被声明为weak或unowned否则引用为强。 将属性标记为weak ,它将不会增加引用计数 介于两者之间的是unowned引用,它们既不是强引用,也不是可选类型。 编译器将假定对象没有被释放,因为引用本身仍然保持分配状态。 强大的参考 让我们看下面的例子。 我们有一个Person类型的变量,其引用为“ Kelvin”,一个Gadget类型的变量,其引用为“ iPhone 8 Plus”。 查看控制台消息。 您应该看到两个变量都已正确初始化。 现在,添加以下代码kelvin分配iphone并设置iphone的owner 。 在将kelvin和iphone设置为nil之前,请确保插入代码: 好的,在Playgrounds中再次运行代码。 您应注意,控制台仅显示有关初始化的消息。 […]

迅捷的Grundlagen#1-Variablen und Konstante

Swift计划的初级工程师和Anderen Schreiber的工程师,Varigen und Konstante的初级工程师。 变数 修女是我的变本征吗? 劳特维基百科: 在 程式化的 可变 内因行为学中,韦尔奇因弗内夫·莱因普罗泽 塞斯· 奥夫特里特。 我的正常 下落与 变量是 Quelltext的名称, 名称是 地址,而地址是 Speicher的名称。 Nun wenn Ihr gerade in dersten Schritten der Programmierung steckt,带来了极大的痛苦,Text reht wenig,也使人们难以理解。 在Swift Macht中,一个人死了,是因为: var Geld = 10 哈本·维尔·尼姑也盖坦吗? Wier haben eine可变的ertert mit dem Wort“ var”,haben dieser einen Namen gegeben“ Geld”和dann einen Wert zugewiesen。 Wunderbar […]

如何在iOS应用中集成图像识别

这些天实际上是“几乎不可能的”。 至少这个xkcd-strip的主题是。 在这个简短的教程中,我将介绍如何使用Microsoft Custom Vision构建CoreML模型以能够识别照片中的对象以及如何在iOS应用程序中使用它。 您需要对iOS开发和Swift都有基本的了解,然后才能继续学习本文。 首先,我们需要创建CoreML模型。 让我们开始看看如何使用Microsoft Custom Vision。 首先登录customvision.ai并创建一个新项目。 输入名称,描述,并将项目类型设置为分类 。 将分类类型设置为多标签 ,将域设置为常规(紧凑)。 选择紧凑型的原因是因为我们要将模型嵌入到我们的应用程序中。 您以后可以随时更改这些设置。 下一步是上传我们希望能够识别的对象图像,并用对象名称标记它们。 使用multilabel,我们可以在图像上使用多个标签。 当我们有大量的图像时,我们可以开始训练模型。 我们还可以通过使用快速测试按钮来测试模型是否运行良好,您可以在其中上传图像以测试图像是否与您训练的模型匹配。 获取CoreML模型 训练完模型后,我们需要下载模型并将其导入我们的Xcode项目。 要下载模型,请转到性能选项卡以CoreML格式导出。 然后,您可以将文件添加到XCode项目文件夹中,在该文件夹中将自动生成一个类以供以后使用。 设置摄像头设备并查看 我们将从创建UIViewController开始。 该视图是我们要显示iPhone相机反馈的地方。 为了输出实时视频,我们必须添加AVCaptureVideoDataOutputSampleBufferDelegate协议。 加载视图时,我们创建一个AVCaptureSession并定义一个用于向会话输入数据的设备。 在这种情况下,我们选择视频的默认设备。 我们还创建了一个AVCaptureVideoDataOutput,我们的captureSession将从该AVCaptureVideoDataOutput输出将在captureOutput方法中可用的视频帧。 我们要做的最后一件事是创建一个AVCaptureVideoPreviewLayer,以便我们可以在应用程序中预览摄像机的输出。 然后,将预览层作为填充整个框架的子层添加到我们的主视图中。 捕获视频输出 要处理输出并进行图像分类,我们必须实现由协议AVCaptureVideoDataOutputSampleBufferDelegate定义的captureOutput方法。 为了能够分析输出中的图片,我们从CMSampleBuffer中获取了CVPixelBuffer。 然后,我们需要为每个帧指定要执行的图像分析请求。 首先,我们必须使用从Custom Vision下载的经过训练的CoreML类来创建VNCoreMLModel。 您的名字将不同于_92ed7d5fe39f4438b1ef3e98e3ce80c3_1! 对于每个结果,我们检查结果是否具有足够高的置信度以及是否具有标识符。 在此示例中,我仅检查一个特定的标识符。 标识符是我们在CustomVision中添加到图像的标签。 如果我们有足够高的信心,则可以确定标识符是正确的标识符,然后停止捕获并将结果分派到主线程。 在这种情况下,我只创建了一个带有消息的简单信息窗口。 这是在iOS应用中实现摄像头,预览和图像识别所需的全部代码,并且您的应用现在可以在识别摄像头前的对象时做出反应。

在macOS上创建菜单栏应用

菜单栏应用程序是指位于macOS菜单栏(即状态栏)上的应用程序。 它提供对关键功能的即时访问,以及在登录会话期间始终可访问的功能。 创建状态栏项目 我们使用NSStatusBar.system().statusItem(withLength: -1)从系统请求状态栏项目。 请注意,如果状态栏已经包含许多其他状态栏项目,则可能会失败(返回nil)。 成功获取状态栏项后,您将获得一个NSButton作为要放在菜单栏上的UI元素。 您需要通过提供图像以及设置按钮的目标和操作来对其进行配置。 所有这些都应在应用启动期间完成,因此在应用委托中,我们具有: 请注意,必须使用强引用来保留系统返回的状态栏项目对象。 否则,它将在以后释放,并且菜单栏上将不会显示任何内容。 显示菜单 要显示菜单,您需要提供放置菜单对象的参考点,在这种情况下为状态栏按钮。 然后,我们创建一个鼠标事件,并使用popUpContextMenu(_:with:for:)出菜单。 信息清单设置 如果您的应用程序仅是菜单栏(类似于Dropbox macOS客户端),则需要在Info.plist中设置Application is agent = YES ,以便省略Dock的应用程序图标和左上角的应用程序菜单。 下载样例项目

iOS教程:使用ARKit和Vision框架进行人脸检测

在脑子里集思广益,跳上ARKit潮流并找到了一个快速致富的方案时,我想到了一些事情,其中​​涉及到在使用ARKit时查找iPhone前置摄像头上显示的所有面孔。 经过几天的实验,并看到其他人在网上完成了一些工作,我能够做到这一点,因此我决定编写一个有关它的快速教程。 我将向您展示如何使用ARKit和Vision框架扫描面部并在屏幕上获取其当前CGRect框架。 首先使用Xcode的默认工具包创建一个ARKit项目。 或者,您也可以根据需要在包含运行ARSession的任何AR视图的UIViewController中实现所有逻辑。 就是这样了。 对于您个人项目的需求,您可以保留对已翻译CGRects的引用,而不必使用它们来构建视图。 但是现在您将能够分辨出一张人脸在ARScene视图中的确切位置。 您可以在此处找到演示项目。 感谢您的阅读,并在评论中留下您的想法和想法以进行改进。

了解Swift 4中的泛型函数和类型

编写可维护的代码应该是每位软件工程师都应该意识到的一个问题,因为从长远来看,它具有回报。 通常,为了尽快完成工作,我们倾向于重复自己。 这通常涉及复制和粘贴我们可能对函数的类似实现,并进行调整以适合我们想要的内容。 复制在某种程度上增加了复杂性并阻塞了可读性。 一个好的方法总是尽可能多地采用DRY(不要重复自己)原则。 在我们的代码中,考虑如何设计API和适应的应用架构非常重要,因为从长远来看,这会影响代码的可维护性。 因此,回到讨论主题。 Swift中的泛型。 使用通用代码,我们可以编写可重用的函数和数据类型,这些函数和数据类型可以与匹配我们定义的约束的任何类型一起使用。 目的是排除共享功能并减少样板代码。 我们有约束和不受约束的泛型。 对于不受约束的泛型,我们不能对它们做太多事情。 受约束的泛型用协议表示。 我们所知道的协议在其符合类型上声明了一组要求。 在这一点上,让我们通过具体示例更深入地探讨实际问题。 解释够了吧? 是的,让我们这样做。 我们将使用Xcode Playground。 因此,随着我们的前进,请随时在操场上测试代码。 我们将从无约束的泛型开始,但是我们不会浪费时间,因为我们不能真正地对无约束的泛型做很多事情。 上面的参数化函数可以接受任何类型的输入。 我们可以将输入值复制到局部变量,然后从函数返回它。 我们也可以将函数传递给另一个函数。 这就是我们可以使用此不受约束的泛型函数所能做的事情。 因此,现在让我们看看受约束的泛型函数。 首先,我们将在不使用泛型的情况下进行常规实现。 然后,我们将使用泛型来排除共享功能并减少样板。 我们的示例将通过decodable协议从网络中获取数据并解码json响应。 我们将从https://jsonplaceholder.typicode.com/获取数据,其中包含用于测试的虚拟数据API。 通过仔细查看上面的函数,我们可以轻松地看到fetchPosts和fetchComments函数有很多共同点。 它们之间的唯一区别在于不同的Post和Comment模型对象,这些对象符合我们传递给JSONDecoder的可解码协议。 因此,这是一个很好的地方,我们可以使用泛型来避免代码重复。 注意:我们正在从上述函数同步获取数据。 在生产代码中,建议异步获取数据,以避免在等待下载完成时冻结UI。 因此,让我们继续提取通用函数,我们可以轻松地重用它们而无需重复自己。 因此,使用泛型,我们已经能够提取两个功能之间的共享功能。 因此,使loadResources可重用。 我们将该函数限制为可解码协议,以帮助我们根据分别来自用户特定函数loadPosts和loadComments通过完成处理程序传递的模型对象类型来解码json数据。 编译器将能够在运行时根据我们传递给完成处理程序的类型来推断参数类型。 在总结泛型之前,还有一件事是看一下泛型类型或数据类型 。 我们将实现一个通用类型,以执行与从网络中获取数据相同的操作,但是这次,我们将使用 结构 。 就像函数一样,结构也可以是泛型的。 通过以上操作,我们设法减少了postResource和commentResource实例,以描述资源所在的位置。 我们已经将网络部分完全分离出来了。 因此,使用这种方法,测试变得更加简单,因为我们可以轻松地测试该结构的实例以了解其是否完整形成。 从以上代码中,我们还有两个功能,一个功能同步执行资源加载,另一个功能异步执行操作。 基本上,除了使用URLSession异步API外,两者之间的区别是在异步函数中使用了注释关键字@escaping 。 这样做是为了确保完成处理程序转义方法的范围,因为我们正在处理异步请求。 因此,最后,我们已经能够解释如何在Swift中实现泛型函数和类型。 我知道现在您对自己今天学到的东西感到高兴。 […]

构建像Lego这样的应用程序-教程1

创建一个应用模板 1.简介 我们所有人每天都在使用应用来简化和丰富我们的生活,但是构建它们似乎是一项巨大的挑战。 如果您对应用程序有一个想法-甚至是一个非常简单的想法-雇用某人创建它可能会花费数千美元。 实际上,开始并不难。 在本系列中,我将演示您可以像创建乐高积木一样轻松地创建应用程序。 我们将共同努力: 可视地创建真正的工程组件。 像乐高积木一样组装它们。 在iPhone上运行该应用。 LEGO®是LEGO Group of Companies的商标,并不赞助,授权或认可本教程系列。 我们构建的应用程序将真正做到“原生”。 我们将使用Apple的工具集来构建iOS平台“原生”的应用程序。 这将是一个真实的应用程序,而不是使用某些原型工具构建的,也不是设计为看起来像应用程序的网页。 该应用程序将如下所示: 您可以在Tutorial Index上达到顶峰,但是您需要从本教程开始按顺序进行学习。 要继续学习本教程系列,您不需要成为专家。 您只需要: 能够运行最新软件的Mac。 Xcode(我们将在第一个教程中一起下载)。 有关如何使用Mac的实用知识,例如如何:启动应用程序,双击,拖动文件,按住Shift键,控制单击,复制和粘贴以及选择多个对象。 渴望学习如何构建应用程序。 如果您是寻找最佳原型和应用程序设计工具的设计师,请先通读: 像Lego一样构建应用程序-设计师简介 2.安装Xcode 首先,您将需要Apple的Xcode软件。 免费。 在本教程中,我将展示Xcode 10.1。 尽管下载量较大(6GB),但这是因为它包含构建iPhone,iPad,Mac和Apple TV应用程序所需的一切。 Mac在Mac上,启动App Store并搜索Xcode 。 下载并安装。 根据您的Internet连接和Mac的速度,这可能需要一两个小时。 因此,您可能想吃午饭或继续吃点别的东西。 👉启动Xcode。 code首次启动Xcode时,可能会要求许可以安装更多组件。 允许它这样做。 准备就绪后,您将看到“欢迎使用Xcode”窗口。 3.创建一个新项目 好。 现在我们准备构建一个应用程序。 👉单击Create a new Xcode project 。 code […]

构建像Lego这样的应用程序—教程11

动态尺寸 1.简介 在教程10中,我们完成了“新闻”单元格中的属性。 当我们在运行时查看单元格时,详细信息文本和图像都被截断并且没有显示其全部内容。 在本教程11中,我们将采用一些机制来允许内容增长,并使单元自动设置其大小。 2.默认像元高度 创建NewsTableViewCell布局时,我们在顶部和底部边距处都包含了约束。 这使单元可以确定显示所有内容所需的高度(即“内部内容大小”)。 如果文本或图像变大,则单元格知道它需要更高的高度。 默认情况下,表格视图将自动确定其单元格的高度以适合其内容。 👉选择“新闻”场景中的两个单元格。 一种方法是单击一个单元格,然后在单击另一个单元格的同时按住shift键。 选择大小检查器(标尺图标)。 Size在“大小”检查器中的“ Row Height标签旁边,关闭“ Custom复选框。 Row Height字段将更改为Default 。 画布中的单元格缩小到44点高。 您将不再看到内容。 👉运行应用程序。 在运行时,表格视图动态设置单元格的高度以匹配内容。 但是,在设计时,仅看到单元格高44点并不能为我们提供有用的预览。 这是一个难题。 如果我们使用自定义高度,则设计时间单元格是有用的高度,但是它们不会在运行时进行调整。 如果使用默认高度,则在设计时压缩单元格内容,但在运行时动态调整。 幸运的是,我们可以选择将单元格的高度设置为Interface Builder中看起来不错的值(即在设计时),并修改视图控制器以动态设置每个单元格的高度以适合其运行时的内容。 3.查看控制器单元的高度 如前所述,每个场景都有一个“视图控制器”,其中包含运行它的代码。 顾名思义,视图控制器在运行时控制场景内的所有视图(包括单元格的高度)。 我们需要视图控制器中的代码来动态调整像元高度。 幸运的是,这些代码已经在BFWControl框架中为我们编写了。 首先,让我们将Interface Builder中的单元格恢复为有用的预览高度。 👉切换回Xcode。 在仍选中两个单元格的情况下,在“大小”检查器中,将“ Row Height输入为220 。 我们可以输入我们喜欢的任何行高,以便合理地预览情节提要中的单元格。 我们也可以像以前一样通过拖动单元格的底部手柄来调整它们的高度。 其次,我们将告诉视图控制器在运行时设置每个单元格的高度,以匹配其内容的固有高度。 我们只需要将News视图控制器更改为AdjustingTableViewController并打开其intrinsicHeightCells属性即可。 clicking通过单击标题栏中的黄色图标来选择表视图控制器。 在右侧面板中选择“身份检查器”。 👉在Identity Inspector中的“ Class字段中,键入Adj然后从弹出菜单中选择AdjustingTableViewController 。 点击Return或Tab (在键盘上)。 Xcode应该以BFWControls自动输入Module […]

iOS教程:创建完整的演练

使用开源Sejima框架创建iOS应用演练组件。 什么是Sejima框架 这个全新的框架提供了常用的用户界面组件,以减少开发时间并大大减少代码重复。 Sketch app用户也可以使用它,因为框架存储库包含Sejima.sketch文件,其中包含所有可用组件以帮助设计人员构建应用程序屏幕。 总览 本教程旨在构建以下演练组件,我们几乎只能使用Storyboards在大多数现代移动应用程序中找到它。 创建xCode项目 启动xCode并创建一个Single View App然后键入“ Next”按钮并将项目命名为“ Walkthrough”。 使用椰子 您可以使用Cocoapods或Carthage安装框架。 让我们为本教程选择Cocoapods。 如果您的计算机上尚未安装该软件,请打开您喜欢的Terminal应用程序并运行以下命令。 须藤宝石安装cocoapods 一旦安装了Cocoapods,请使用终端转到您的项目路径,然后键入以下pod命令来设置项目工作区。 cd桌面/演练/ 荚初始化 吊舱安装 如果一切正常,您应该在终端中看到以下内容。 分析依赖关系 下载依赖项 生成豆荚项目 整合客户项目 [!]从现在开始,请关闭任何当前的Xcode会话,并对该项目使用`Walkthrough.xcworkspace`。 发送统计 吊舱安装完成! Podfile有0个依赖项,总共安装了0个pod。 关闭您的xCode项目,然后如上所述,在xCode中打开Walkthrough.xcworkspace 。 安装Sejima框架 从Pods项目中打开Podfile ,然后添加Sejima框架依赖项。 豆荚’Sejima’ 返回终端并输入install命令,以确保将Sejima框架添加到您的项目中。 吊舱安装 分析依赖关系 下载依赖项 安装Sejima(0.1.6) 生成豆荚项目 整合客户项目 发送统计 吊舱安装完成! Podfile有1个依赖项,总共安装了1个pod。 让我们来构建一下演练 页面控制 现在项目已准备就绪,我们可以开始对演练进行“编码”。 打开Main.storyboard文件,并添加具有自定义类MUPageControl的UIView以及下面显示的布局约束。 横向寻呼机 要使本演练页面具有多个屏幕可滚动,请添加具有以下布局约束的自定义类MUHorizontalPager的UIView 。 从“ […]