Tag: xcode

xccov:人类的Xcode代码覆盖率报告

最初在 这里 发布在XCBlog上 苹果已经发布了带有Xcode 9.3的新命令行工具xccov,用于检查Xcode代码覆盖率报告的内容。 不幸的是,还没有任何Web文档,因此我们必须在终端中键入man xccov以获得有关此命令行工具的更多信息。 此实用程序需要Xcode 9.3和Xcode 9.3附带的命令行工具。 使用xccov,我们可以使用人类可读格式以及机器可表示格式(例如JSON)生成Xcode代码覆盖率报告,而无需使用第三方工具。 在本文中,我们将探讨如何使用带有演示iOS应用的新命令行实用工具生成和查看Xcode代码覆盖率报告。 注意名字 命令行工具xccov是Xcode 9.3附带的本地Apple开发人员工具。 但是,很少有名称相似的开源工具可能会使您感到困惑。 不是xcov 有一个名为xcov的Ruby库可生成美观的代码覆盖率报告,可与Fastlane和Danger等工具一起使用。 不是hiroakit / xccov 还有另一个纯粹的Swift库可以生成Xcode代码覆盖率报告,也称为xccov,但由Hiroaki ENDOH编写 这些库的名称与Apple发行的新实用程序相似或几乎相似,巧合的是,它们正在执行相同的工作,即为Xcode生成不错的代码覆盖率报告。 随着苹果公司xccov的发布,可能不需要这些库。 生成代码覆盖率报告 为了探索xccov,让我们使用带有单元和UI测试目标的“ Tabbed App”模板创建一个新的iOS应用,并将其命名为“ XCCov-Demo”。 这将创建Xcode项目方案“ XCCov-Demo”。 我们可以通过编辑方案并在“测试”操作中选中“代码覆盖率”框来明确启用该方案的代码覆盖率。 如果我们不想包括UITest的覆盖范围,我们也可以过滤目标,如下所示 现在,我们为方案启用了代码覆盖率。 一旦我们使用Xcode中的CMD + U按钮构建并测试了该方案,这将生成代码覆盖率报告到默认的派生数据目录中,该目录位于〜/ Library / Developer / Xcode / DerivedData中,您将看到在Logs / Test中生成的代码覆盖率报告目录。 但是,对于此演示,我们将在项目内部生成派生数据,以便我们可以轻松查看报告。 让我们使用xcodebuild从项目根目录使用以下命令来构建和测试我们的应用程序 $ xcodebuild -project XCCov-Demo.xcodeproj / -scheme […]

什么是XIB,为什么我会使用一个?

如果您像我一样,则在查看代码时可能会看到这些“ .nib”和“ .xib”文件,并想知道它们到底意味着什么。 即使当我有人向我解释它们时,它们仍然没有多大意义,我也不知道为什么要使用它们。 但是由于这些东西在Swift中似乎比较流行,所以我决定对它们做更多的研究,然后搞一个新的项目,看看我是否能解决。 那么这些NIB和XIB是什么? 出于所有意图和目的,它们是同一件事–可在整个项目中重复使用的自定义视图。 实际上,XIB(XML接口生成器)在编译期间会转换为NIB(NeXTSTEP接口生成器),因为XIB易于人类阅读,而NIB则易于计算机阅读。 为了简洁起见,在博客的其余部分中,我将它们都称为“ XIB”。 好的,看来XIB可以帮助我们直观地创建视图,但这不是Storyboard的目的吗? 为什么使用其他类型的Interface Builder使事情复杂化? 好吧,实际上,XIB和情节提要板有很大的不同,即使它们经常相互结合使用也是如此。 XIB只是一个“事物”(一个自定义的,可重复使用的视图),而情节提要是许多“事物”(ViewController,TableViews,Segues等),主要用于导航和布局。 太酷了,所有这些都在概念上有意义,但是如何将其转化为代码? 我有同样的问题,它实际上对我自己的项目有很大帮助。 因此,我创建了一个(伪)音乐库,该库将在TableView中显示,并使该单元格成为创建为XIB的自定义单元格。 让我们进入代码… 等等,这不是XIB。 我以为我们正在学习如何创建和使用XIB! 是的,这也让我感到困惑,但实际上,我们首先需要创建一些东西,以使我们的XIB有意义。 由于我的应用程序要在音乐库中显示歌曲,因此我创建了一个Song结构(非常基本)以及一个MusicLibrary结构来保存我的所有歌曲: 现在我们有了一些基础集,我们实际上可以创建我们的XIB。 为此,您可以创建一个新文件并选择“查看”。这将带您进入一个新屏幕,如下所示: 对您来说,这应该看起来有些陌生,几乎就像一个情节提要。 尽管您可以使用许多与Storyboard相同的工具,但仍存在一些主要差异。 如您所见,主要的是XIB文件默认为视图,而不是ViewController。 不要被默认矩形形状与ViewController相同的事实所迷惑-实际上,让我们通过选择“大小”下的“自由形式”和“状态栏”下的“无”来改变它。更改自定义视图的大小,在我的情况下,我希望它是TableView Cell的大小(在Storyboard中查看以查看原型单元的大小)。 那里看起来好多了。 但是现在我们还需要将此XIB链接到代码中的某些内容,因此让我们使用UIView类(通常与XIB文件具有相同的名称)创建一个新文件,不要担心这不会混淆Xcode,因为是.xib,另一个是。swift)。 现在,就像在Storyboard中一样,我们需要创建一个插座以使连接完成。 在情节提要中,我们将从视图对象中执行此操作,对吗? XIB并非如此。 实际上,我们必须从“文件所有者”部分执行此操作: 完成后,我们可以将出口拖到我们的SongView.swift文件中: 现在,XIB变得有些混乱了。 我们可以通过两种方式初始化自定义视图-通过代码或通过Storyboard。 因此,我们需要两个初始化程序:带框架的初始化(用于代码)和带编码器的初始化(对于Storyboard): 但是,无论我们如何初始化视图,本质上我们都希望它以相同的方式进行设置,因此让我们创建一个可以为我们完成此操作的函数: 那里发生了什么事? 好吧,首先我们需要使用文件名实际加载XIB。 然后,我们要告诉Xcode我们希望自己设置约束,这就是“ translatesAutoresizingMaskIntoConstraints = false”行的作用。 下一行虽然很容易编写,但是起初有点复杂。 请记住,我们上面创建的SongView类本身就是一个UIView,而我们刚刚为其(我们的contentView)创建一个出口的视图也是一个UIView。 我们想将此contentView添加到SongView中,因此我们使用addSubview(contentView)。 我喜欢将其视为图层-SongView是我们的底层,而contentView现在位于其顶层,因此无论我们在何处添加SongView,contentView始终都在其中。 之后,我们只需添加约束以确保contentView始终约束在SongView的边缘。 ! 好的,现在已经完成了很多繁重的工作,我们可以通过设置我们想要的实际视图看起来像什么来获得一些乐趣: 看起来不错。 […]

Xcode中的酷调试功能

当我刚开始学习iOS时,我曾经用打印语句填充代码,以查看代码执行各个部分的情况,但是它变得凌乱不堪,执行速度变慢,以后清理起来很痛苦。 有更好的方法。 断点 您经常会在StackOverflow上看到在代码的特定位置“在其中插入断点并查看发生了什么”的帖子。 断点不仅对停止执行以了解lldb中变量的作用很有用。 您可以右键单击它们并做一些非常有用的事情。 我要核对该打印声明,因为稍后将要清理它。 相反,我将添加一个断点并将其配置为通过右键单击它来打印出所需的信息。 接下来,我们将配置断点以将我想要的信息记录到控制台。 从那里,我只输入count = @ count @ (变量用@字符包围)并选中“评估动作后自动继续”,它将打印到控制台,如下所示: 完成后,您无需删除断点。 您只需点击它即可启用/禁用。 您还可以对它们执行其他操作,例如添加lldb命令等。我将留给您自己修改。

Xcode 8.1 GM的新增功能

苹果已经发布了Xcode 8.1 GM-这是新版本中的新增功能和改进功能: 快速更新 将C和Objective-C代码导入Swift时,将定义一个新的宏__swift__。 该宏的值的格式为XYYZZ,其中X是语言的主要版本,YY是次要版本 语言的版本,而ZZ是“补丁”版本(YY和ZZ始终为两位数)。 Swift标准库中添加了两种类型:UnsafeRawBufferPointer和UnsafeMutableRawBufferPointer。 它们表示固定内存区域(缓冲区)上的非所有视图。 它们将底层缓冲区公开为UInt8字节的集合,而与该内存中保存的值的类型无关。 一个新的withUnsafeBytes(of :)函数将值的内存表示形式公开为UnsafeRawBufferPointer。 Swift标准数字类型现在作为NSNumber桥接到Objective-C。 NSValue类为其提供工厂方法的结构现在作为NSValue桥接到Objective-C。 由乔·格罗夫(Joe Groff)建议。 当Optional值桥接到Objective-C对象时,当Optional传递给采用非空ID的API或[T?]数组桥接到NSArray时,如果有一个值,Swift运行时将桥接已包装的值。 如果桥接了nil值,并且API不接受nil指针,则Swift将使用NSNull。 由乔·格罗夫(Joe Groff)建议。 快速修复 Swift 3.0.1现在生成一个const UnsafePointer而不是UnsafeMutablePointer。 现在可以正确处理C属性swift_error(zero_result)。 覆盖和满足协议要求的成员的访问检查已修复为与SE-0025更紧密匹配。 如果需要保持Swift 3代码与Xcode 8.0兼容,请对顶级类和结构使用private而不是fileprivate。 解决了使用@NSManaged属性来满足协议要求的问题。 Objective-C更新 现在,使用“手动引用计数”的Objective-C文件支持__weak引用,而不是忽略它。 您需要在项目设置中启用它,否则将触发编译器警告。 核心数据更新 现在,在创建新实体时,Xcode 8将为实体名称和类名称设置相同的值。 更改实体名称也将更改类名称,除非它们已经不同。 核心数据修复 使用自动代码生成保存后,现在可以对数据模型进行更改。 界面生成器更新 新的“更新框架”按钮将更新所选对象及其子对象的框架。 固定按钮已重命名为添加新约束。 自定义手势识别器已添加到对象库,以允许继承UIGestureRecognizer或NSGestureRecognizer而不是使用NSObject。 界面生成器修复 修复了使用重力区域分布的NSStackView的自动布局性能。 解决了布局不明确时Xcode不能始终从情节提要和xib恢复视图帧的几个问题。 现在,您可以解决歧义,并且Xcode将继续存在。 将内容拖动到画布上的静态UITableView单元中,将再次起作用。 创建IBAction连接不再使用Swift 2.3插入WithSender。 在非视网膜上的设备栏中选择横向方向 在OS X 10.11上运行时显示的内容现在将不再挂起。 调试修复 […]

分解ViewController的动画

你好! 我叫Vladyslav Semenchenko,我是iOS开发人员。]这是我在Medium上的第一篇文章,欢迎您! 几周前,我开始了新的iOS项目。 经过几天的编码,我遇到了问题-我的UIViewController类为动画提供了太多代码。 按照我的计划,这还不错,但是对于干净的代码也不是很好。 我希望我的UIViewControllers仅具有用于用户交互的代码,也许还有一些基本设置。 所有其他逻辑必须在工作程序中。 这对于可测试性非常有用。 所以我的问题是:如何将动画移到UIVIewController之外,并使其易于使用和理解? 我想到的第一件事是为动画创建单独的类,并在UIVIewController外部调用函数。 让我们看看它是如何工作的。 好的,让我们假设我们有IntroductionViewController。 首先,让我们看一下它的外观如何: 我们可以将该对象添加到ViewController中,设置动画类Custom Class,然后链接所需的变量。 让我们尝试这样做! 首先将对象添加到ViewController中: 然后为对象设置自定义类: 现在,您可以将UI元素拖放到动画类中: 另外,您必须将动画对象与ViewController链接。 只需Ctr将Animation Object拖动到ViewController并设置插座名称即可。 这是InitialViewControllerAnimation类的最终版本: 现在是最后的ViewController类: 清洁得多吧? 我们解决了两个问题: 1)将动画块移出ViewController类之外 2)将动画类所需的外部变量移到ViewController类所需的外部变量 希望本文对读者有所帮助。 请留下您的评论。 与社区讨论此问题将很酷! PS我几天前发现的很酷的歌曲:齐柏林飞艇(Led Zeppelin)-自从我一直爱着您-https://itun.es/ru/F-imO?i=674271721

什么是通知(Swift3)?

最近,有一位朋友告诉我,在最近的一次采访中,有人问她有关Notification的经历。 我认为稍微研究一下会很有用。 我了解到的一件事是,通知中心(以前称为NSNotificationCenter)适合观察者设计模式,该对象在其中将任何更新或更改通知其他对象。 Apple的文档指出,“ NSNotificationCenter对象(或简称为通知中心)提供了一种在程序内广播信息的机制。”换句话说,Notification就像广播消息的广播电台一样。 这样, 发送者 (广播者或广播电台)发出消息, 观察者 (听者)可以决定何时收听以及收听什么内容。 基本上,通知提供了一种在应用程序内传递信息的方法,而类之间没有直接引用。 通知中心会跟踪关注特定通知的所有不同类型的观察者,因此在发布通知时,通知中心会将消息发布到已为该通知注册的每个观察者。 要设置通知中心,需要3个步骤: 步骤1:将事件(消息)发布到通知中心,该事件将通知要侦听此特定消息的所有对象。 步骤2:将观察者(侦听器)添加到通知中心。 步骤3:编写一个代码块,该代码块在发生通知时被调用(收到通知后您将要做什么?)。 我制作了一个带有标签栏控制器的简单应用程序。 标签1:显示随机的海洋图像。 选项卡2:如果用户喜欢选项卡1中的图像,则选项卡2将向他们显示另一个随机海洋图像。 在上面,我向NotificationCenter.default发布了一个名为“ LikedItNotification”的通知。一旦用户单击FirstViewController中的 Like Like按钮,该通知就会被发布! 在上面,我为在FirstViewController中创建的通知创建了一个观察者(侦听器)。 我还编写了将在收到通知后执行操作的代码。 在这种情况下,我的操作是取消隐藏youLikedItLabel并将随机图像分配给SecondViewController中的imageView。 埃里卡(Erica),如果您在想,我觉得您可以通过使用单例来做类似的事情,您是对的。 看来NotificationCenter只是让您的班级互相交谈的另一种方式。 我的理解是,如果整个应用程序需要了解特定的通知(即显示键盘,用户确实登录/注销),则可以最佳地利用NotificationCenter。 这是我完成的应用程序的演示视频! 希望您今天了解到有关NotificationCenter的新知识。 您可以在此处下载项目。 资源: Apple文档— NSNotificationCenter 视频— Swift 3中的iOS通知中心 停止使用NSNotificationCenter Ray Wenderlich — iOS设计模式:观察者模式

iOS Segues提示和技巧

Segues是一种有用的导航模式,在iOS上用于在视图控制器之间进行转换。 这篇文章将展示如何在许多常见用例中有效地使用与segue相关的代码。 使用segues的一个主要好处是,从源视图控制器到目标视图控制器的过渡可以完全在情节提要中进行编码,并且不需要任何代码即可管理演示。 一个例外是需要自定义序列,例如自定义表示控制器时—详情请参见下文。 任务创建和准备 给定一个带有带有按钮的源视图控制器的情节提要,只需选择按钮并按住CTRL +拖动到目标视图控制器,即可创建到目标视图控制器的简单序列: 如果需要,可以在源视图控制器类中重写prepareForSegue方法,以配置目标视图控制器,如下所示: 假设我们的数据源是一个项目数组,并且我们想为目标视图控制器配置与所选单元格的indexPath相对应的项目。 由于segue是从表视图中的某个单元格触发的,因此prepareForSegue中的sender对象将是该单元格本身,并且我们可以将它的indexPath检索为tableView.indexPathForCell(cell)并使用它来引用我们的数据源数组。 例: 然后,我们需要像这样实现UIPopoverPresentationControllerDelegate的adaptivePresentationStyleForPresentationController方法: 摘要 利用情节提要板来定义应用程序的导航流程,并遵循以下规则将代码链接到您的任务上: 重写prepareForSegue方法以在显示目标视图控制器之前对其进行配置。 当通过点击按钮或单元格执行搜索时,请在源视图中直接挂钩到按钮/单元格。 有条件地执行segue时,将其挂接到源视图控制器,如果条件评估为true,则调用performSegueWithIdentifier 。 对于表视图和集合视图,使用indexPathForCell获取为prepareForSegue中的数据源建立索引所需的indexPath 。 选择Present as Popover选项,并实现adaptivePresentationStyleForPresentationController方法以返回UIModalPresentationStyle.None,以在iPhone 上将 segue呈现为弹出框 。 参考文献 Apple Docs:故事板Segues PSPDFKit博客:演示控制器和自适应演示 注意 :此故事 最初 于2016年1月25日 发布在我的博客 上。 有关更多此类故事,请 订阅我的邮件列表 。 如果您喜欢,请单击下面的so,以便其他人在中此看到此内容。

圣诞节

它开始看起来很像圣诞节。 首先使用Xcode Xmas是一个Xcode插件,只要构建成功,它就会显示Xmas图片以及希望的消息 怎么运行的 迅速 –尝试在Swift中做很多工作 DVTKit – Xcode使用DVTBezelAlertPanel显示警报。 因此,我们将其initWithIcon:message:parentWindow:duration: – DVTBezelAlertPanel来自DVTKit 。 我考虑过导入运行时标头,然后对其进行“扩展”。 但是我发现在Objective C中陷入困境是一个更容易的解决方案 NSVisualEffectView –似乎添加到面板NSViewEffectView的NSImage再次将其template设置为YES,从而导致图像变成具有面板背景色的模板颜色 –这发生在`init`方法中。 因此,我们必须在“ init”发生后将“ template”改回“ NO” 而且,祝您和您的家人圣诞快乐

WWDC18:运行中的Xcode 10

最初在这里发布在XCBlog上 苹果的世界开发者大会(WWDC)2018已于本周开始。 按照承诺,随着WWDC内容的宣布,我将撰写一系列博客文章。 关于iOS12,watchOS5等新软件的公告很多。但是,还有另一场平台联盟国会议,这是致力于Apple平台开发人员的主题演讲。 Apple宣布了Xcode 10,其中包含了许多新功能,并且在会议中进行了演示。 在本文中,我们将使用macOS高级版Sierra快速探索Xcode 10的新功能,因为macOS Mojave尚未公开,因此我们不会看到Xcode的暗模式。 Xcode 10具有许多功能,这些功能已在WWDC的平台状态国会议上宣布。 在这篇文章中,我们将仅介绍以下功能。 并行测试:XCTest和XCUITest XCODEBUILD 代码段 方案编辑 多行编辑 新建系统 源代码控制 我们将简要研究Xcode的那些功能。 并行测试:XCTest和XCUITest 苹果实际上在去年WWDC17上宣布了并行测试功能,我们可以在其中指定多个目标,并且测试将相应地在不同的模拟器或设备上触发。 您可以在这里阅读有关去年宣布的XCTest功能的更多信息。 但是,今年它通过创建仿真器的克隆扩展到在单个仿真器中并行化测试套件。 Xcode在后台创建了不同的运行程序流程,每个流程都分配了特定的测试。 这大大减少了测试执行。 我们可以通过更新方案来启用并行测试,并且在“测试”操作中,可以针对测试包选择“选项”以选择并行化选项。 我们也可以选择位置。 还有其他一些选项可以使测试随机化,并可以在方案中添加新测试。 让我们首先关注并行化。 选中此复选框后,我们都准备针对该方案并行执行测试。 默认情况下,只分配了两个运行器进程,但是从命令行运行时,我们可以增加数量。 在Xcode测试报告中,哪个模拟器克隆运行哪些测试。 测试报告分组在一起。 实际上,这是对测试执行速度的极大改进。 使用并行测试技术,我们可以大大加快单元测试和UI测试的速度。 使用这种技术,我们仍然应该能够在多个模拟器目标位置执行测试。 并行运行XCTest的各种选项已添加到xcodebuild工具中,我们将在本文的以下部分中进行探讨。 XCODEBUILD Xcode 10附带了各种命令行工具,这些工具可以帮助从命令行或脚本中实现各种功能。 这是为各种目的添加到xcodebuild中的一些新选项。 平行测试 可以使用xcodebuild工具从命令行运行XCTest。 使用Xcode 10,我们还有其他一些选项可以启用并行测试,这些是 -maximum-concurrent-test-device-destinations NUMBER:要同时测试的最大设备目标数 -maximum-concurrent-test-simulator-destinations NUMBER:要同时测试的模拟器目标的最大数量 -parallel-testing-enabled YES | NO:覆盖方案中的每个目标设置 -parallel-testing-worker-count […]

您好,TouchBar —触摸屏กัน

วิธีเปิดใช้นก่อนเขียนวิธีเปิดใช้Touch Bar Simulatorเพื่อที่จะได้ลองเล่นสัมผัสแห่งอัจฉริยะ Touchองเล่น触摸栏模拟器บนXcode 全新Macbook Pro触摸屏ซึ่งมันMacาอยู่แทนที่ปุ่มฟังก์ชั่นทั้… medium.com BarาAPIนนั้นก็ใช้เวลาทั้งในงมอยู่กับTouch Bar APIและ示例代码ที่แอปเปิลปล่อยมาให้—控制器สวยงามบลาๆแต่เหมือนจะมีปัญหา กับตัว触摸栏API Sim模拟模拟器ที่ทำให้ที่เขีไหกดไหกดกดงRedแล้วมัแล้วมัแล้วมัแล้วมัแล้วมัแล้วมัแล้วมัื่กมื่ไม่เคstartื่ื่ื่ื่ โผล่มาอีกให้ความรู้สึก แบบอนแบบ“เหี้ยมันทำงานได้ไงวะ”กับ“เหี้ยทำไมทำงานไม่ได้วะ”ในเวลาเดียวกัน Barากนั้นเราสร้างTouchBarที่ไหน? AppนAppDelegateเลยได้มั้ย? จริงๆก็ได้นะแต่ในเอกสารบอกว่า “将栏与您的应用程序对象而不是与应用程序委托关联,或与窗口控制器对象而不是与窗口本身关联……” – https://developer.apple.com/reference/appkit/nstouchbar 应用商店WindowController应用商店(AppDelegate)—应用商店WindowController应用商店NSWindowController เปิดากนั้นเปิดMain.storyboardแล้วเปลี่ยนWindowให้เป็นWindowControllerที่เราสร้างซะ ที่าที่Controller WindowController.swift —ิ่มจริ่มจากTouchBarตัวละตัวต้องมีIDเป็นของตัวเองและTouchBarItemแต่ละตัวก็ต้องมีองเช่นกันเพราะงั้นผมจะเริ่มสร้างIdentifierสำหรับTouchBarและTouchBarItemก่อนโดยใส่ไว้เป็น扩展使用NSTouchBarCustomizationIdentifier,使用NSTouchBarItemIdentifier(示例代码นั้นแหละ) 窗口栏 เป็น标识符ของTouchBarแต่ละตัวครับเนื่องจากในระบบมีหลายTouchBarและในแอพฯก็อาจหลายTouchBarด้วย 标签 ในที่นี้เป็น标识符ที่จะไว้แสดง您好,TouchBarนั้นเอง งางนั้นก็มาเขียนฟังก์ชั่นสำหรับสร้างTouchBar customificationIdentifier — TouchBar标识符ที่เราสร้างก่อนหน้านี้ defaultItemIdentifier —数组数组NSItemTouchBarIdentifier数组TouchBar数组Item .label 标识符标识符标识符标识符TouchBarItem标识符标识符TouchBarItem代理标识符代理 กผมใส่นื่องจากผมใส่自我ให้เป็น代表เลยdelegateองเขียนฟังก์ชั่นตาม协议มNSTouchBarDelegateดังนี้ 等级TouchBarItemงนleaน้าที่ของ แล้วริงๆแล้วTouchBar APIมีNSTouchBar子类มาให้ใช้หลายอันแต่ปัญหาคือมันไม่มีอันไหนที่ไว้สำหรับสร้างLabelง่ายๆยเลอต้ร้างCustom Itemแล้วใส่Labelไปเป็นViewของมันแทน(ถ้าทำในInterface Builderมีให้นะนเป็นCustom ใส่标签เหมือนกัน) ับรับTouchBarItem NSางๆที่แอปเปิลมีให้ดูได้ในเอกสารตรง หัวข้อNSTouchBarItem子类 Barรงนี้สั่งรันแอพขอพขราแล้วเปิดTouchBar Simulatorขึ้นมาก็จะได้您好,TouchBarสีเขียวๆขึ้นมาแล้วTADA! —วิธีเปิดTouchBar模拟器คือcmd + shift + 5