Tag: xcode

委托Swift

在讨论委托时,我经常看到与通知,观察和回调(关闭或阻止)的比较。 解决许多常见问题时,这些概念有所不同。 本文介绍了委派概念,如何实现适当的委派,最佳实践,并将委派模式与其他方法进行了比较。 我更喜欢将委托作为“四人帮”一书中描述的概念与可可/可可接触中的委托模式分开。 委托概念 委托(动词)-委托(任务或责任)给另一个人。 新牛津美国词典 在编程术语中,该引用翻译为委托(任务或责任)另一个对象。 委托使用对象组合来允许自定义和代码重用,并且它是继承的替代方法。 委托对象与其委托对象之间的关系类似于子类如何将方法转发给其超类。 突出的区别是继承是静态的,而组合是动态的。 使用委托可以在运行时更改对象的行为。 在这里,我有一个示例对象层次结构。 ShapeView是提供笔触和填充颜色的抽象类。 RectangleView和EllipseView通过重写draw(_:)方法实现绘图逻辑。 在Swift中,在扩展中实现协议很方便。 协议声明 @protocol 委托 < NSObject > 协议 委托 : AnyObject 协议定义了适合特定任务或功能的方法,属性和其他要求的蓝图。 Swift编程语言 协议非常适合委派模式,因为它们可以对需求进行适当的控制,而控制量不超过需求的数量。 这样,委托对象不知道委托的实现细节。 Delegate协议继承了NSObject协议,以便为可选方法提供自省功能。 在Swift中, Delegate声明为仅类协议,以将其用作weak引用。 替代声明使用的是非正式协议,通常是NSObject类别,但是这种方法被认为是旧方法,并且在现代框架中未使用。 属性和内存管理 @property ( nonatomic , weak ) id < 代表 >代表; 弱 var委托: 委托 ? Objective-C中的属性声明为id : id是指向任何对象的指针,委托不限于NSObject子类; Delegate继承了NSObject协议以提供必要的运行时方法。 为了防止强引用循环,将委托属性声明为weak 。 […]

命名UITableView的间距和画线的位置

(本文最初是为我的博客 vojtastavik.com撰写的 ) Objective-C是我专业学习和使用的第一门编程语言。 使用ObjC时需要了解的第一件事是缺少名称空间。 整个Objective-C运行时的行为就像一个名称空间。 为了防止名称冲突,Objective-C使用名称前缀。 您只需为所有类的名称加上前缀就可以创建自己的伪命名空间。 这就是为什么我们要使用UI View, NS Object和MK MapView之类的名称的原因。 Swift具有模块定义的名称空间,因此不再需要名称前缀。 我不得不说我想念他们。 将您的姓名缩写作为班级名称的一部分,会带来一种奇怪的满足感。 让我们做一点思想实验。 UITableView是iOS开发的重点之一。 它是iOS 2.0中引入的,它是我们仍在积极使用的最古老的API之一。 如果UITableView API名称是在2017年引入的,仅支持Swift,那么UITableView API名称会是什么样? 让我们玩一下命名空间。 由于UIKit拥有自己的命名空间,因此我们可以简单地将Table用作表视图相关类型的“基础”命名空间。 如果模块中已经有一个名为Table的类型,则需要将UIKit版本称为UIKit.Table 。 但是,在大多数情况下,使用简单的Table完成工作。 在操场上进行模拟非常简单: 这是在代码中使用UITableView 2017 Swift专用版本的方式: iOS世界中最著名的两个协议呢? UITableViewDataSource和UITableViewDelegate呢? 让我们也给他们一个合适的名称空间: 我们不要在这里停下来。 我们可以命名空间还有很多! 您可能会明白…这里的真正问题是: 这就是我们想要的吗? 对所有事物进行命名空间是一个好主意吗? 像这样构造类型非常好。 层次结构清晰可见,全局命名空间的“污染程度”较小。 简短的名字也对新来者不那么害怕。 让我们也考虑一下缺点。 关于类型的推理可能更加复杂,尤其是在名称冲突的情况下。 根据上下文的不同, Table有时可以表示UIKit.Table ,有时不可以。 嵌套类型的自动补全当前仅在一个名称空间“级别”中起作用,因此您目前无法对嵌套类型执行以下操作: 在哪里划界线? 撰写本文的主要灵感来自我正在从事的项目。 我意识到,即使使用Swift强大的命名空间功能可能会更好,我还是倾向于选择与Objective-C相似的名称作为类型。 我对哪种方法更好没有很坚决的看法,“在命名空间中过多使用”这一行也没有。 我很高兴听到有关此主题的更多意见! 随时在下面发表评论。 […]

带有Xcode 8.1的iOS 10.2

最新的Xcode不支持最新的iOS 如果您在10.2上使用iOS设备使用Xcode 8.1模拟您的应用程序,则可能会出现此错误,并且几乎没有信息可以修复它。 我做了以下工作。 1.从developer.apple.com/download下载Xcode-beta.app 您可能需要登录,这需要40分钟,这与Xcode的普通版本相同。 下载后,将Xcode-beta.app移至/ Application /目录。 mv〜/ Download / Xcode-beta.app / /应用程序 2.在Xcode-beta.app目录中找到iOS 10.2的内部版本号 您需要在Xcode-beta.app中找到iOS 10.2的内部版本号。 cd /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSuppor 吨/ 您应该会看到类似这样的内容。 3.在Xcode-beta.app中创建从iOS 10.2到Xcode.app的符号链接 要使用Xcode(而非Beta)在iOS 10.2上模拟应用程序,您需要在Xcode中构建该10.2。 在这两者之间创建符号链接。 sudo ln -s /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/10.2 \ \(14C5077a \)/ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/设备支持 确保将内部版本号14C5077a替换为您发现的内容,具体取决于您的Xcode-beta.app。 退出并重新启动Xcode。 您应该能够在iOS 10.2设备上运行您的应用程序。 请参阅此以获取更多参考:将iOS 10.2设备与Xcode 8.1一起使用。

Swift本地化帮助程序类

在一个项目的工作期间,有一个本地化(阿拉伯语)的要求。 对于本地化,目前最简单的解决方案是检查选择了哪种语言,然后根据条件的变化进行相应的检查。 假设您要更改按钮的标题/图像,首先要创建该按钮的出口,然后在ViewDidLoad中检查所选语言,然后更改图像和标题。 对我来说,问题是为什么我应该为每个控件每次都添加插座,就像我需要本地化按钮,图像,文本字段一样,我只需要为其本地化创建插座。 为了避免所有这些事情,我迅速创建了几个扩展,这些扩展可以直接工作而无需为任何控件创建出口。 通过拥有这些文件,可以节省大量时间,而无需创建任何出口即可完成所有这些工作。 您可以在以下位置找到所有这些要点:

使用iOS 10的新UIViewPropertyAnimator动画约束

在WWDC 2016期间的Session 216中,Apple宣布对UIKit动画进行了相当低估的更新,该更新将标准的UIView.animate(),关键帧动画甚至Facebook的POP框架彻底抛弃了。 它称为UIViewPropertyAnimator ,它允许高度交互和可自定义的动画。 您可以在此处阅读有关此内容的更多信息,并在此处学习基础知识。 在尝试使用UIViewPropertyAnimator并了解适用于其停止和非活动状态的所有不同规则之后,我尝试通过设置约束动画来将事情提升到一个新的水平。 我发现这非常强大,因为您可以使用UIViewPropertyAnimator的.fractionComplete()方法控制动画的进度。 我想在这个交互式汉堡菜单中分享一个约束动画的示例,该菜单受Javi Perez的Nominazer应用程序的启发。 我首先使用UIViewPropertyAnimator的实例,使用平移手势识别器更新.fractionComplete(),将汉堡包中的三行融合为一行。 当用户结束平移手势时,UIView.animate()块会形成一个“ X”。 然后,用户可以使用新的UIViewPropertyAnimator将X的行收敛为一行。 最后,UIView.animate()块用于形成原始的三行汉堡。 如您所见,UIKit的较早的动画方法可以与UIViewPropertyAnimator结合使用,以创建与UI的无缝交互。 您可以在我的GitHub页面上下载此交互式汉堡的代码。 (请注意,上面有很多个人笔记。) 回到当前的主题: 动画约束。 同样,您可以在此处下载该项目的完整源代码。

iOS UITableViewCell,UICollectionViewCell,UITableViewHeaderFooterView和UICollectionReusableView出队和注册-使用Swift协议和泛型

如果您是iOS开发人员,则每天都会遇到UITableView和UICollectionView。 您将需要使用在静态位置声明的丑陋标识符字符串来注册Cell或UITableViewHeaderFooterView或UICollectionReusableView重用单元格。 所以你的代码将是这样的 完成ReusableView.swift类以包含在项目中: 希望这将帮助您减少代码混乱,并简化注册和重用TableView和CollectionView单元格,HeaderFooterViews和ReusableSupplementary视图的使用,而无需在每个单元格类中维护难看的静态字符串常量。

Xcode和Swift开发的备忘单示例

备忘单可以是从紧凑的概述中快速引用Xcode,Swift或iOS逻辑的便捷工具。 理想情况下,您可以将它们打印出来并放在桌子上。 这使得经常访问和使用它们变得非常容易。 因此,我将向您展示一些有用的备忘单,您可以在开发过程中使用这些备忘单。 断言,前提条件或致命错误 Marcin Krzyzanowski创建了一篇很棒的博客文章,名为Swift断言-缺少有关assert,precondition和fatalError之间差异的手册。 他解释了它们中的每一个,以及在没有连接调试器的生产应用程序中使用它们时,对终止产生的影响。 备忘单 确保在他的博客文章中检查Marcin的原始版本。 Xcode捷径 存在许多Xcode备忘单。 有些只是一大堆快捷方式,例如ShortcutFoo中的快捷方式,而另一些则更直观,可以打印出来。 就个人而言,我喜欢使用Craig Grummitt的工具,它非常直观,涵盖了Xcode 10中的大多数基本快捷方式。 GIT备忘单 GIT是我们每天用来管理版本控制的工具,如果您是终端GIT用户,有时可能很难记住所有命令。 因此,使用GIT塔提供的GIT备忘单非常方便。 对于那些不经常使用的命令,它特别方便。 此外,还值得一提的是他们的Xcode备忘单。 更多Xcode快捷方式 如果您想了解有关Xcode快捷方式的更多信息,可以查看我的博客文章Xcode的快捷方式要点,以加快工作流程。 最初发表于 SwiftLee 。 更多帖子和更新: @twannl

如何将动态Swift框架添加到命令行工具

让我们逐步介绍如何尝试向命令行工具中添加动态框架,并讨论每步操作中出了什么问题。 步骤1:将其添加到“链接的框架和库”部分 这是您运行应用程序时发生的情况: dyld:库未加载:@ rpath / libswiftAppKit.dylib 引用自:/Users/seanberry/Library/Developer/Xcode/DerivedData/TestCommandLineTool-fnrmhjvjmugvqueaqvbklzwhqvuv/Build/Products/Debug/ThirdParty.framework/Versions/A/ThirdParty 原因:找不到图片 ThirdParty.framework尝试在@rpath目录中找到libswiftAppKit.dylib (它是Swift标准库的一部分)。 我们可以看到ThirdParty.framework如何通过运行来定义@rpath $ oTool -l ThirdParty.framework / Versions / Current / ThirdParty 加载命令27 指令LC_RPATH cmdsize 48 路径@executable_path /../ Frameworks(偏移量12) 加载命令28 指令LC_RPATH cmdsize 40 路径@ loader_path / Frameworks(偏移量12) 好吧,开枪。 这些与我们的命令行工具无关。 我们没有任何名为/ Frameworks或../Frameworks的文件夹。 为什么要在其中寻找Swift标准库? 因为它是为iOS和Mac应用程序构建的。 这是Mac应用程序中的目录结构: 那解释了path @executable_path/../Frameworks 对于iOS,应用程序内部的目录结构为: 这说明了path @loader_path/Frameworks (offset 12) 但是,谦虚的命令行工具开发人员呢? Swift标准库在我们的可执行文件中静态链接,但是我们的第三方框架找不到它们。 不幸的是,它们并没有存储在每台Mac上的标准位置。 开发人员可以访问埋在Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx […]

ITMS-90682:如果该应用程序支持iOS 8或更早版本,则不能包含16位或P3资产

这边只有撷取部分的内容,要看全文请到下方的资料来源 解决的方法在这里讲了https://forums.developer.apple.com/thread/60919?start=0&tstart=0。简单说,Xcode认为你的图片资源中包含了16位或者P3的资源,所以打包的时候会进行相应的处理,但是,只有9.3或者更高版本才支持这样的资源,所以到了9.2就会崩溃。 此时,我想说说什么是P3资源。P3指的是DCI-P3或者说DCI / P3,一种数字电影投影所用的色域标准,它能比sRGB显示更多的颜色。苹果在推出5k显示屏的新iMac的时候(2015年10月),约会了DCI-P3,随后9.7英寸的iPad Pro(2016年3月推出,推出时iOS 9.3系统),iPhone 7(2016年9月推出,iOS 10系统)和2016的MacBook Pro都使用了DCI-P3色域。即苹果公司的iOS 9.3系统支持DCI-P3色域,而iPad Pro作为第一个支持DCI-P3的iPad,使用的是iOS 9.3 。这也就解释了为什么我们之前打包的IPA到了9.2的设备上就会不正常。 资料来源: 说说ITMS-90682:如果该应用程序支持iOS 8或更早版本,则不能包含16位或P3资产

使用懒惰延迟计算

作为iOS开发人员,您可能已经听说过用于初始化的lazy关键字-除非有人真的想要与之交互,否则不会创建惰性组件。 那真lazy 作品:推迟工作直到需要做为止。 实际上,我们可以做更多的事情。 不仅用于属性初始化,还用于Swift函数编程中的计算。 让我们看看它是如何工作的。 假设我们有一个由整数组成的数组,并且我们要求结果的值是原始数组的一个元素的两倍。 这是示例代码: 让数组= [1,2,4,5,3,7] let element = array.map {$ 0 * 2} [3] 打印(元素) 您可能会注意到,我们只需要第3个元素,而我们将数组中所有6个元素的值加倍,这是多余且无用的。 如何解决? 使用lazy 。 Swift提供了一个名为LazySequenceProtocol的协议   ,并且在其扩展名中有一个惰性变量来推迟计算(例如map 和filter 在函数式编程中。 定义如下: ///避免创建多层“ LazySequence”包装器。 ///符合“ LazySequenceProtocol”的所有内容都已经是懒惰的。 扩展LazySequenceProtocol { ///与`self`相同。 public var lazy:自我{得到} } 随着lazy   ,我们可以修复原始代码以使其高效: 让数组= [1,2,4,5,3,7] 让element = array.lazy.map {$ 0 * 2} [3] 打印(元素) […]