Tag: xcode

Xcode大学—故事板和Segues快速入门

以任何设备查看 不久前,在情节提要中创建新场景时,我们将获得一个500×500的正方形框来表示我们的视图。 老实说-我喜欢它! 它足够抽象,可以构建通用布局,而无需不知不觉地仅针对一个屏幕大小进行设计。 困难的部分是使用iPad上的每个屏幕尺寸,不同方向和分屏进行测试。 今天,我们可以单击屏幕底部的“查看为”,并为每个设备和方向呈现布局,而无需构建和运行项目。 IBDesignable / IBDesignable 是否曾经创建过自定义视图,并且不得不修改一些代码,运行应用程序并转到视图可见的位置,以查看其外观? 真浪费时间。 使用IBDesignable属性,您的自定义视图将立即在情节提要中呈现! 使用IBInspectable ,您可以在属性检查器中为任何自定义UIView或UIViewController类显示属性。 查看Nate Cook撰写的有关NSHipster的快速指南。 何时不使用情节提要 我们证明情节提要很棒,但并不总是如此。 有些事情他们做不到。 例如: 没有一些技巧,就不可能重用自定义视图,因为没有场景就无法创建视图。 当前,我们必须使用一个nib文件。 对于在不同视图控制器中重用的表/集合视图单元格,同样适用。 Segues非常容易,但是对于链式转换来说效果不佳。 立即关闭并显示视图控制器时,由于转换在转换之前已完成,因此显示将失败(带有已记录的警告)。 结论 Tabs vs. Spaces阵营可能永远不会停止战斗,但这并不意味着我们无法做出自己的命运。 故事板,笔尖与代码阵营可以并存,并在一个大型的快乐项目中享受每个阵营的好处。 如果您有任何疑问,请随时与我联系,或者随时在Twitter上与我联系。 不要忘记查看我们的聚会-Swift Coders和Learn Swift LA。 制表符与空格 有用的资源 Marcin Krzyzanowski编写的情节提要代码生成器—该框架将为情节提要创建具体类型,而不是使用字符串标识符。 想要尝试一会儿。 在AdrienCognée的情节提要中使用IBDesignable和可重复使用的Nib文件-我做了非常相似的事情,以便能够在情节提要中呈现自定义视图。 这是“ hacky”,但非常有用。

使用Vapor 2和Swift创建网页

这是“蒸气入门”系列文章的第2部分 在本教程中,我们将利用在第1部分中学到的知识,并使用Vapor的模板系统Leaf创建一些网页。 首先,让我们讨论什么是Leaf。 Leaf是一个模板引擎,旨在使我们能够动态显示信息。 想象一下,您想创建一个HTML页面来显示特定于当前用户的信息,而您不必为每个用户创建新页面。 使用模板,我们可以在多种情况下重用我们的代码。 我们可以使用其他模板系统,例如Mustache和Stencil,但是由于Leaf是使用Swift构建的,因此在本教程中将使用它。 首先,让我们开始生成一个新的蒸气项目。 步骤1 —生成一个新的Vapor项目 打开您的终端并输入vapor new hellopages 。 第2步-生成 .xcodeproj 项目文件 在终端中输入cd hellopages && vapor xcode 。 这将把我们带入hellopage文件夹,并运行vapor命令生成项目文件。 我们一直想生成Xcode项目文件,因为这使我们能够访问Xcode的错误检查和代码完成,这使得使用Swift进行编码变得非常容易。 第3步-为我们的新网页创建一条新路线 首先,打开main.swift文件,并在第一条路线下方创建一条路线。 在第一条路线的正下方输入以下代码。 // 1 drop.get(“ hello”){要求 // 2 返回“ Hello World” } 这将创建对路由hello的GET请求。 如果运行此程序并使用浏览器导航到localhost:8080/hello我们将看到“ Hello World”。 要创建蒸气网页,我们需要更改对路线的响应。 将闭包的返回值更改为以下内容 返回尝试drop.view.make(“ hello”) 此行告诉Vapor查找名为hello.leaf的叶模板并将hello.leaf呈现给用户。 如果您想知道hello.leaf文件在哪里,我们还没有创建它。 您的main.swift文件现在应该看起来像这样。 第4步-创建问候页面。 要创建问候页面,我们将创建一个hello.leaf文件。 .leaf扩展名从上面的第12行中排除,因为Leaf是与Vapor一起使用的默认模板引擎。 模板文件必须放在“ Resources/Views文件夹中。 现在让我们创建文件。 […]

Xcode中的位置模拟

假设您的客户在另一个国家,并且应用程序应该使用位置服务,那么唯一的方法就是模拟位置。 Apple使我们能够在应用程序中模拟位置。 该仿真对设备和仿真器均适用。 要模拟位置,请转到目标 → 编辑方案。 然后在“ 运行”方案下,选择“ 选项”选项卡。 如下图所示,应该启用“ 允许位置模拟”复选框。 然后,您可以从下拉菜单中选择默认位置。 现在,连接设备,然后构建并运行该应用程序(在模拟器中也可以相同的方式工作。)。 假设您从下拉列表中选择了印度孟买,则该应用程序实际上在印度。 调用定位方法后,CLLocationManager将返回您印度孟买的位置。 假设您要模拟位置的国家/地区不在下拉列表中,则可以使用一些在线网站创建一个.gpx文件(GPS交换格式),并将其添加到Xcode中(只是Google如何创建gpx文件) )。 您可以在上图的下拉列表底部看到“ 将GPX文件添加到项目中”选项。 要创建GPX文件,您可以转到 http://gpx-poi.com/并只需填写所需数据。 您不必添加所有与gps相关的数据。 我只希望国家代码为VN ,名称为越南。 因此,添加这两个字段→创建→下载。 注意 :也可以在xcode中创建.gpx文件。 转到文件 → newfile,然后选择gpx文件。 这只是一个包含键和值的xml文件。 只需添加名称,符号(用于国家符号)等标签即可。 xml标记示例(用于国家/地区符号): VN 将GPX文件添加到xcode,现在,您可以在列表中看到新添加的位置名称。 在您的应用程序委托应用程序中放置一个断点:didFinishLaunchingWithOptions:。 运行应用程序,并触发断点时,您将在调试区域的跳转栏中看到“定位服务”图标。 选择您的位置,然后运行该应用程序,位置服务现在将在GPX文件中的模拟位置中运行。 重要说明:在设备上模拟位置时,位置服务已被劫持,直到您在关闭位置模拟的情况下部署应用程序为止。 否则,设备中的所有应用程序实际上都将位于模拟位置。 玩得开心 。 模拟愉快! 如果您喜欢阅读这篇文章,请分享并推荐它,以便其他人可以找到💚💚💚💚💚💚!!!!

调试预建框架

这是我如何解决一个奇怪需求的简短简历,并发现了lldb高级命令的隐藏功能。 在谈论iOS / Mac开发中的框架时,通常会考虑在静态或动态库中构建的一组源代码文件,最终会嵌入一些其他资源。 有很多众所周知的工具(例如CocoaPods和Carthage)可以为您完成这些任务,因此这里没有什么新鲜事物。 最近,我们面临着一种可能被视为相反的方式:在我们的项目中有一个框架,我们有在另一个位置(项目之外)生成该框架的源文件,我们希望能够使用调试器逐步进入框架类。 那到底是为什么呢? 为了优化项目的构建时间,我们有一个特殊的流程,在该流程中,我们可以构建框架并将其提交到我们的仓库中,而不是源文件中。 尽管这有一些缺点可能值得在另一篇文章中讨论,但我们对结果感到非常满意,因为我们将构建时间减少了三分之一以上,从大约7分钟减少到大约2分钟。 此外,将我们的应用程序划分为多个框架迫使我们重新思考整个架构,从而清楚地将我们的依赖项隔离开来,这是一个不错的奖励! 我们构建的框架附带了DWARF调试信息,这些信息可以使用dwarfdump进行解析并转换为人类可读的内容。 该工具的使用真的非常有趣,并且可以提取的内容令人赞叹。 DWARF调试信息按节进行构造,每个编译单元一个节,并且通过调用dwarfdump –debug-info您将获得存储在.debug_info节中的所有信息。 其中包括符号之间的匹配以及源代码文件中的精确位置,如下面的屏幕快照所示。 请注意,源文件的路径是绝对路径,这意味着该文件甚至可能不存在(请考虑在另一台计算机上构建框架的情况)。 对我们来说幸运的是,我们正在不同的机器上构建框架,但是总是从同一路径/ tmp / SubitoFrameworksBuilder构建框架,由于这个假设,这只是重新映射路径的问题。 能做到吗? 是的,事实证明,使用lldb的以下命令确实很容易: settings set target.source-map ” ” 每次启动调试器时都要编写代码,这很繁琐,但是好消息是,每次启动应用程序时,都有一种方法可以通过将上述行添加到~/.lldbinit-Xcode来自动执行。 能够按项目而不是按用户执行此操作会很好,但是不幸的是,有一个开放的雷达坐在那里一段时间。 ~/.lldbinit-Xcode每一行都~/.lldbinit-Xcode执行,从而允许您定义别名和自定义命令。 值得检查一下Facebook已发布的功能非常强大的功能。 回顾一下:通过一个lldb命令,我们现在可以将调试器与我们的预构建框架一起使用,在文件系统中的某个位置具有源代码文件。 😎

将代码呈现为样式化的静态文本

我一直在和几个朋友一起进行一个名为Interview Flash Cards (简称IFC )的宠物项目,此项目旨在为准备即将面试的iOS开发人员提供一种Flashcard工具。 我打算开放该项目的源代码,以便其他开发人员可以参与其中,并添加他们认为可能对iOS社区有益的任何问题和答案,但是……我做起来并不容易。 至少还没有,但是很快。 问题(至少其中之一) 在IFC中,有一个“算法”部分,您会在其中遇到编码挑战,例如 “在整数数组中查找三个最大数字的乘积” 然后,当您翻转卡时,您会看到解决方案。 但是解决方案是在需要时获取存储在AWS上的映像。 这使其他人很难添加算法解决方案,因为他们需要访问我的AWS账户。 此外,随着Swift语言的发展和样式约定的更改,图像将变得过时 。 因此,理想情况下,我们需要一种添加问题和解决方案的方法,以使其易于维护答案。 这种使用静态图像的规则。 可能的解决方案 我意识到,提交PR(算法解决方案只是一个字符串)会使每个人的生活变得更加轻松。 唯一的问题是我需要一种样式化字符串的方式,以便像在Xcode中一样突出显示语法。 这就是Sam Soffes的SyntaxKit出现在🏅中的地方-尽管,对于IFC,我是从 Alexander Hedges的叉子 ,他对其进行了更新以支持Swift 3🙌🏾 SyntaxKit有许多用途,但是对于这种特殊情况,我仅使用其AttributedParser ,它根据初始化器中指定的TextMate语言(tmLanguage)和TextMate主题(tmTheme)接收字符串并设置样式。 样式化的字符串以NSAttributedString的形式返回,并以语法高亮显示。 某些突出显示不是完美的,但是就其突出的功能而言,它应该得到很多好评。 虽然SyntaxKit做了大量的繁重工作,但它仍然将格式留给开发人员-这意味着我需要弄清楚缩进以及何时添加新行。 尝试#1❌ 我尝试使代码示例为字符串,并对其扫描了{},()和[]符号,以确定何时换行或向上移动缩进值。 因此,例如 “ func play(videoGame:VideoGame,players:Int){让武器= [\“ pew \”,\“ pew-pew-pew \”,\“繁荣制造商\”,\“ noob tube \”]…}” 我们必须在第一个{之后添加一个新行,然后确保缩进4个空格,因为我们现在已经进入了第一个缩进级别,然后在定义武器时,我们必须在之后移动到一个新行第一个条目,但标记第一个条目的位置[以便下一行从下一行开始,依此类推。。这太麻烦了,无疑会很慢。 尝试1:失败 。 尝试#2❌ 让用户提交代码示例,只需在需要的地方添加换行符,然后让他们在代码中保留所有空格。 就像是: “ func doIt(){\ n让stuffToDo […]

CircleCI 2.0和iOS代码签名

没有Fastlane比赛 在TechOps中,我们使用CircleCI来测试和部署iOS应用。 最初的CircleCI 1.0很好,但是他们推出了2.0版,并停止了对1.0版以后的Xcode版本的支持。 当我开始迁移到2.0时,我遇到了以下注意事项: 在CircleCI 2.0上,唯一支持代码签名的方法是使用上述文档中所述的Fastlane Match。 我很惊讶。 你惊喜吗? 我喜欢Fastlane。 这是iOS开发工具发生的一件好事。 但是我不想在CI上使用Match,因为: 它需要带有加密证书的单独回购。 好。 但是密码仍然应该存储在CI环境变量设置中。 那么为什么身份不应该呢? 依靠互联网连接的不必要步骤 这是对Google产品的不可预测的依赖; 我们不知道它将活多久 可以说,如果我们转向Match,那么我们将不再依赖CI提供者。 但是事实并非如此,迁移文档建议使用特殊操作: 尽管其他快速通道操作可以轻松地与一组xcodebuild命令互换,但“匹配”步骤提供了一种处理签名身份和配置文件的概念,这些概念有时可能会过时。 无论如何,我已经弄清楚了如何在不使用Match的情况下使用代码签名。 解 TL; DR:很难说,但是您必须将证书和配置文件编码为base64表示形式,将其设置为env,然后将其解码回文件。 macOS钥匙串 将证书和私钥导出为p12文件,设置证书密码。 从Apple Dev Center获取配置文件(使用该身份签名)。 编码文件 在macOS Terminal中,将Certificates.p12编码为base64,然后将结果复制到剪贴板: $ base64 -i Certificates.p12 | pbcopy 并使用相同的命令来解码.mobileprovision文件。 CircleCI上下文 要在2.0中存储环境值,我们必须使用上下文。 转到组织设置→上下文→资源→添加资源。 添加具有某些名称的变量(例如Certificates ),然后将先前复制的值粘贴到Value字段中。 CircleCI配置YAML 现在,我们需要取回这些文件。 在.circleci/config.yml使用以下步骤: 现在,我们将证书和个人资料放在正确的位置。 进口证明书 现在,我们需要将签名身份添加到CI钥匙串中,CircleCI上不再存在。 我提到了setup_circle_ci特殊操作,我们将使用它来创建钥匙串,正如我们从其源代码中知道的那样。 我们必须添加以下before_all通道: […]

Criando uma Pokedex com Swift零件:1/3

Instalando o CocoaPods 口袋妖怪在宠物小精灵上的宣传很不错。 Vamos criar uma lista(Pokedex)dos 881 pokemons que temos atualmente。 出售产品和服务的方法是将uma API作为亚伯大·奎·维特拉·托泽斯的信息,作为信息。 pokéapi–神奇宝贝RESTful API Pokeapi Pokemon RESTful API pokeapi.co uma API的Chamada Alamofire的Antes de tudo precisamos。 Elairános ajudar com作为HTTP的要求。 Alamofire / Alamofire Alamofire – Swift github.com中的优雅HTTP网络 可以使用Alamofire vamos或CocoaPods,也可以使用gerenciadordedependências,也可以使用faal mais dele nesse post。 CocoaPods.org iOS和Mac项目的依赖管理器 cocoapods.org Nessa primeira parte irei mostrar como instalar o […]

告别Xcode / project.pbxproj合并!

上周,我决定解决困扰我很长时间的问题,即Xcode的project.pbxproj merge。 每个曾经作为iOS开发人员工作的人都知道,单个文件可能产生多少挫败感。 它是文件,几乎负责Xcode项目中发生的所有事情,开发人员进行的每一次更改,每一次不同的配置,每一次删除或添加都会影响该全能文件。 话虽这么说,这类合并经常发生并且使情况变得更糟,但这并不是通常容易做到的合并,这已经不是什么秘密了。 我并不是说它们很难,但是在大多数情况下,它们确实是一个痛苦。 那么我们能做些什么呢? 上周,我第一次尝试了Xcake,它是解决问题的红宝石。 从他们的github页面: 您用一个简单的文本文件描述您的项目:Cakefile。 Xcake基于此创建您的项目,包括导入所有文件并创建组以匹配文件层次结构。 这非常适合团队合作或使用cocoapods,因为它减少了冲突,可以轻松修改设置,并允许您随时创建干净的项目。

Swift中Xcode UI测试入门

UI测试是确保您最关键的UI交互在添加新功能或重构应用程序的代码库时仍能正常工作的好方法。 这也是一种在处理UI代码时自动执行重复任务的好方法(例如,当您必须深入浏览应用程序以测试正在处理的内容时)。 编写和运行UI测试与进行单元测试有所不同,因为您实际上是在与应用进行交互 ,而不是针对某个API执行编程测试。 两者都有很大的价值,最好的方法是将两者都用于不同的任务。 Xcode附带了XCTest框架中内置的UI测试,您可能已经将其用于单元测试。 这些UI测试功能已经存在了好几年,但是由于不稳定,易碎且难以使用而被许多开发人员所摒弃。 过去是这样 ,在Xcode UI测试的前几次迭代中,确实确实非常不稳定-但现在情况有所好转-如果您还没有这样做的话,我真的值得给它第二次机会🙂 设置东西 如果您的应用程序还没有UI测试目标,则只需添加Xcode中的File > New > Target..并选择一个“ UI测试包”即可。 然后在Xcode中转到Product > Scheme > Edit Scheme.. ,然后在“测试”下添加UI测试包,以编辑应用的方案以在测试时运行UI测试。 让我们写一个测试 UI测试是一个很好的解决方案的例子是,当您想测试用户流程时,例如,在应用程序的入门流程中进行测试。 假设您的入职流程由4个屏幕组成,用户必须先滑动才能完成此过程。 最后,右上角出现一个“完成”按钮,需要关闭该按钮才能关闭入职流程,如下所示: 因此,让我们编写一个精确地执行此操作的测试: class OnboardingUITests: XCTestCase { var app: XCUIApplication! // MARK: – XCTestCase override func setUp() { super.setUp() // Since UI tests are more expensive to run, it’s […]

如何在Xcode 8中使用C ++ 14进行编码

首先 ,单击您的项目(在上图中,我的项目名称为LinkedList)。 单击后,您的编码区域将被选项列表代替。 其次 ,单击“ 构建设置”选项。 第三 ,单击“ 全部”以查看与“构建设置”相关的所有可用选项。 最后 ,向下滚动直到找到C ++属性。 我正在使用Xcode版本8.3.2,并且C ++属性位于Apple LLVM 8.1(语言)C ++内部 。 现在,单击C ++语言方言并选择您的编译器。 从图像中可以看到,您有许多可用的编译器。 现在,您可以选择最适合您项目需求的一种。 这种快速的分步操作仅为当前项目定义了C ++ 14编译器。 希望对您有所帮助。 如果您有更好的方法,请告诉我。 🙂