Tag: swift

比较NSCollectionView和UICollectionView#2

在本文中,我将讨论分别为macOS和iOS准备内容容器的区别。 对于那些来自iOS界的人来说,UICollectionView自iOS 6起就是一个很长的组件。它广泛用于显示具有不同布局的内容,例如网格,基于行或任何自定义布局。 数据源协议 DataSource协议用于提供集合视图所需的数据和视图。 在iOS中,有两种必需的方法来构建最小的UICollectionView。 collectionView(UICollectionView,numberOfItemsInSection:Int) collectionView(UICollectionView,cellForItemAt:IndexPath) 第一个与macOS中的对应项相似,但第二个有所不同。 collectionView(NSCollectionView,numberOfItemsInSection:Int) collectionView(NSCollectionView,itemForRepresentedObjectAt:IndexPath) 很明显,第一个API用于指示该部分中的单元格或项目的数量(仅默认一个会话)。 第二个API是实际收集数据信息并配置视图组件的API。 从方法签名中,您可能会注意到差异。 iOS非常直接地创建项目,但是macOS却创建了这种奇怪的东西,称为“ Represented Object”。 这是由于传统支持。 自MacOS 10.5起,NSCollectionView实际上就存在了,而iOS版本是从头开始构建的。 创建现代NSCollectionView API的过程中有很多知识。 装载笔尖 为了简化和可视化开发过程,我们通常使用Interface Builder创建容器内容,该内容将包含在Nib文件中(另存为* .xib文件)。 在iOS中,我们还设置了一个名为Reuse Identifier的“桥梁”。 集合视图具有管理多个单元的内存使用情况的机制。 数据源方法将使用Reuse Identifier查找存储在池中的单元格。 在简单的情况下,所有单元都具有相同的标识符。 每次都会拉出一个单元,并根据后备数据存储内容配置视图组件。 它可以为单元格显示设置不同的文本字段或图像。 该Reuse Identifier将被注册到选定的Nib文件中,并在其中加载默认视图组件。 但是,在macOS中,工作流程略有不同。 它使用makeItem(withIdentifier identifier: String, for indexPath: IndexPath)方法创建项目对象。 一种简单但不可思议的连接Nib文件的方法是,将标识符设置为与Nib文件相同的名称。 例如, MyItem的标识符将查找名为MyItem.xib的笔尖文件并检索其内容。 要进行快速演示,您可以在此处观看YouTube视频。

什么是IBDesignable / IBInspectable?

IBDesignable和IBInspectable是Interface Builder使用的属性,但与IBOutlet和IBAction也是属性不同, IBInspectable和IBDesignable用于直接在Interface Builder中呈现元素。 WWDC 14 [1]中显示的这些属性首先受Objective-C支持,但现在您也可以与Swift一起使用。 渲染自定义UI组件 IBDesignable属性负责标识从UIView继承的类,该UIView将在Interface Builder中呈现。 例如,我使用IBDesignable创建了一个ImageView定制: 导入UIKit @IBDesignable类CustomImageView:UIImageView { 覆盖func prepareForInterfaceBuilder(){ self.layer.cornerRadius = self.bounds.size.width / 2 self.layer.borderWidth = 6 self.layer.borderColor = UIColor.blackColor()。CGColor self.layer.masksToBounds = true } } 您可以在下面看到结果: 但是要获得此结果,我需要在Identity Inspector中将UIImageView设置为CustomImageView : 通过Interface Builder配置UI组件 IBInspectable是另一个可用于配置您的UI组件(例如)的属性,只需要您在代码中将该属性与该属性一起使用即可: @IBInspectable var borderWidth:CGFloat = 6.0 { didSet { self.layer.borderWidth = self.borderWidth } } 结果是: 不幸的是, IBInspectable不能与所有类型一起使用,请参见下面的列表,它可以支持: […]

界面生成器很棒。 情节提要不是。

我真的很喜欢使用Interface Builder。 它帮助我减少了很多本应在视图层中的代码。 但是使用情节提要会带来很多问题。 在这里,我将解释为什么孤立的xib对我来说比故事板更有效。 注意:这是我的看法。 这对我来说非常有效,但是您可以在此主题上有不同的意见,这很好。 我很高兴阅读。 以友好的方式讨论此问题是成为开发人员的最佳方式。 情节提要实际上是什么? 故事板可以看作是应用程序流程的直观表示。 真的很棒 如果您来到一个使用情节提要开发的新项目,并且已经组织了团队,那么您将拥有整个应用程序流程的完整全景图,以及每个屏幕的可视层次结构。 您将在短时间内了解该项目。 尽管很明显,情节提要板可以带来很多优势,但它们是有代价的:git合并冲突,可变变量,耦合视图控制器。 Git合并冲突 假设您正在登录屏幕上。 您团队中的另一位开发人员正在注册屏幕上的远程位置工作。 归根结底,你们两个都尝试将代码推送到远程git存储库和BOOM! 一切都被打破。 Git到处都有冲突。 根据项目的大小以及在多个情节提要中如何分解项目(情节提要参考more),您将或多或少会遇到git merge冲突,但这肯定是一个使您头痛的问题。 可变变量 使用情节提要板时,无法创建自定义init,因此在尝试将数据从一个屏幕传递到另一个屏幕时会遇到严重的问题。 使用情节提要时传递数据通常是通过重写ViewControllerA中的prepareForSegue来设置ViewControllerB中声明的隐式展开变量的值来实现的。 这种方法的问题在于,如果不设置该变量,没有什么可以阻止您执行segue。 在执行情节提要的应用程序中,很常见的导致崩溃的原因是,未设置应该在执行segue之前设置的隐式展开的可选变量的值。 耦合视图控制器 使用情节提要时,可以在视图控制器之间定义序列。 如果ViewControllerA与ViewControllerB有联系,则它们将耦合在一起。 ViewControllerA知道将在其后显示ViewControllerB,而在segue继续存在的情况下,这就是事实。 视图控制器不应该如此耦合。 视图控制器不应该知道导航流程中的下一个视图控制器,因此可以随时替换它。 解决此问题的一种流行解决方案是使用导航协调器,并将导航流执行委派给充当介体并执行所需转换的新对象。 使用Xibs 使用自己的xib创建视图控制器就像创建新类一样简单 然后创建一个新的UIViewController子类,选择“也创建XIB文件”。 可以使用以下代码来实现结果视图控制器: 请注意,您可以创建自定义初始化程序,以使您不会忘记将数据从视图控制器传递到另一个控制器。 修改AppDelegate 需要修改AppDelegate以允许在不使用情节提要的情况下启动应用程序。 需要这样的代码: 首先,我们实例化UIWindow。 然后,我们使用自定义初始化程序实例化根视图控制器。 最终,该视图控制器被设计为窗口的根视图控制器,并且使窗口成为键并可见以启动流程。 孤立的Xib有何不同 使用隔离的Xib(每个View Controller一个Xib)比情节提要更好,原因有以下几个: 它们有助于避免git合并冲突。 如果您与其他开发人员在同一视图控制器中工作,则将继续存在合并冲突,但这远不及在同一情节提要中进行。 它们使我们拥有不可变的变量。 实例化视图控制器时,将创建其所有依赖项集,因此您不会在传递数据时犯傻错误。 可以使用导航协调器来解除视图控制器的耦合。 视图控制器可以与应用程序的其余部分隔离,从而使其完全可替换。 […]

dotSwift 2018

许多Hotels.com iOS工程师在巴黎的dotSwift 2018会议上度过了这一天。 尽管这个名称暗示了会议的重点是Swift编程语言,但其中的一些讨论分散到了iOS平台的其他方面,甚至我们的老朋友Objective-C也出现了几次。 头号发言人是本·科恩; 苹果公司的一名工程师,在Swift Core团队中工作。 他很好地介绍了Swift标准库。 它的目的是什么; 以及自几年前开源以来,其他人如何帮助该语言向前发展。 我们自己的Sally Shepard谈到了可访问性的重要性。 她自己是一个可访问性传播者,并受到视觉可访问性问题的影响,她展示了可访问性问题的问题和解决方案的范围之广,以及我们如何并且应该使所有人都可以使用应用程序和体验。 引起我注意的另一位发言人是格雷厄姆·李。 Wealth Wizards的一名软件架构师。 他表明,面向对象编程和函数编程都不一定是语言领域的相反两端。 他巧妙地使用集合论来表明功能方面和面向对象方面(例如在Objective-C中发现的方面)基本上是等效的。 我已经简化了,但我鼓励您观看他的讲话以听到完整的消息。 与许多其他专业演讲者一样,Swift社区的成员提供了许多闪电演讲。 这些都是快节奏的简短消息,其中包含有用的提示和方法。 总体而言,这是非常愉快的一天-与我见面的其他Swift工程师是参加dotSwift对我来说最有价值的部分。 它还验证了我们在Hotels.com iOS团队中采用的一些方法,让我为成为其中的一员而感到自豪。 视频将很快由组织者发布-请留意https://dotswift.io。

如何仅添加新的Xib文件

假设您正在构建一个小型辅助项目。 真的很小 它只有一个简单的表格视图。 您实际上并不需要单独的.xib视图,因此在创建MyCustomTableViewCell文件时无需选中该框。 假设您只有几个标签来显示名称和日期,因此可以运行它。 然后,您会爱上您的项目,并且想要扩展它。 😍现在您需要此单元格的自定义.xib视图,因此它看起来更酷! 那么,如何只添加一个新的.xib视图而不创建一个新文件呢? 在Xcode菜单中,选择File-> New-> File,或使用快捷键:Command +N。然后选择iOS-> User Interface-> Empty 给它起一个名字(可能与表视图单元格相同,所以命名为MyCustomTableViewCell)。 这将向您的应用添加一个新的.xib文件。 将表视图单元格拖到.xib并将其类更改为自定义类名称。 添加一个重用标识符。 瞧! 现在添加一些标签,创建从.xib视图到自定义单元格类的IBOutlet连接,并根据需要自定义单元格。 编码愉快! 资源: https://medium.com/@musawiralishah/creating-custom-uitableviewcell-using-nib-xib-files-in-xcode-9bee5824e722#.b3gfeec16

为什么iOS快速普及日益增加

如果您正在寻找一种编写软件的绝妙方法,请选择“ SWIFT”。 无论是台式机,手机,服务器还是任何需要代码来运行“ Swift”的东西,它都是一种很棒的编程语言。 Swift是一种交互式,快速且安全的编程语言。 对于watchOS , iOS , tvOS , OS X , Swift是一种新语言。 ARC-自动参考计数,使用ARC Apple社区简化了内存管理。 它是一种由更广泛的Apple工程文化发明的编程语言,其贡献来自其开源社区。 需要针对“编译器”的性能进行优化,并且还针对开发对语言进行了优化。 几天之内,所有新程序员都会选择Swift,因为它对新程序员非常友好。 结果,以“ Swift”编程语言编写的代码不仅易于阅读,而且易于编写和维护。 苹果社区从很早就开始制作“ Swift”编程语言,并逐渐发展为具有新功能和新功能。 对于全世界的整个操作系统来说,Swift编程都是“ Hello,World!”的绝佳选择,因为其速度和安全性的结合是Apple社区的主要目标。 Swift在您的帮助下提供的Playground可以创建一个名为“ playgrounds”的程序,随着时间的推移它会显示代码的结果。 编程语言研究 编程语言的研究结果是Swift,它结合了十年的Apple平台构建经验。 为了使您的代码更具交流性,Swift具有许多功能,而用Swift编程语言编写的代码是: 快速:-作为基于C,C ++的编程语言的替代,开发了Objected C Swift编程语言。 通讯:-Swift提供的一种语法是易于使用,并具有大多数开发人员期望的功能。 Swift社区不断发展并受到监视。 内存:-您甚至不需要键入分号,并且内存会自动进行管理。 控制流程先进。 合法访问内存。 Swift社区不断发展并受到监视。 非常强大的错误处理。 安全-绝对可以安全地编写代码。 可能感觉有点严格,但清晰度节省了大量时间。 Swift社区采用了在Objective-C编程语言中发现的强大功能,即“动态对象模块”。 Objected-C还提供了可读性和命名参数的强大功能。 在编程语言的共同点上,Swift提供了许多新功能,它结合了过程部分和面向对象。 Swift的主要目标是制作出一种完美的语言,该语言可用于移动应用程序,系统编程,桌面和专业领域,以及Apple提供的云服务。 Swift编程语言的主要功能是通过模态进行设计的,因此强大的编程语言所做的工作很有趣。 如果您想成为一名开发人员,或者已经是一名开发人员,或者您正在考虑一种更简单的方法来学习如何与其他家庭或学校一起构建应用程序以及与朋友拼贴,那么现在是时候开始学习奇妙的语言了就是斯威夫特 由于Apple社区决定将’Swift变成一种“开源编程语言”,因此加快了开发和采用的速度。 根据TIOBE的月度索引,2017年3月,Swift是世界十大编程语言之一。 为了与世界领先的编程语言Python相匹配,Apple社区使其语言更易于使用,并且采用了合成简单的方式。 这意味着您实际上可以非常快速地开始构建应用程序。 开始使用Swift进行编码的人们声称,这与编译C编程语言代码一样快。 […]

VIPER:干净的代码架构

软件开发体系结构(或设计模式)非常关键,是“一个人”必须决定并采取的非常重要且初始的步骤之一(此处“一个人”是指软件开发者 😐😐,这是上帝的创造,可以将Coffee转换为软件 )。 在开发软件时遵循设计模式非常重要(当我这么说时,请相信我,我遇到了一些甚至不知道什么是“设计模式”但在App Store中拥有其应用程序的人。😶),因为它不仅是一种文件夹结构,但不止于此…。 对我来说,当您说您遵循特定的体系结构时,您应该至少了解以下几点: 您需要知道如何将每个功能部件定义和划分为责任,并将这些任务分配给不同的部分(类)。 始终注意实现的类之间的正确通信流程。 经过几分钟或几小时的思考,您编写的代码是可维护的,并且可以由任何其他“人员”进行增强(此处的“人员”也是软件开发人员)。 作为专业的iOS开发人员,我尝试了一种非常著名的最新架构VIPER 。 VIPER是当今世界范围内使用的一种设计模式,是您在进行大型项目时可以参考的最简洁的体系结构之一。 Viper是一种面向协议的编程以及模块化方法。 所有模块都分为5个不同的部分(类),每个部分都有其责任。 这些类必须仅执行特定任务,然后将所需结果传递给其他任务(如果需要)。 分解模块的5个不同部分或类是: 视图-视图包含您的所有UI元素。 每当发生用户交互时,View都有责任将信息传递给Presenter。 交互器-交互器是模块的大脑。 它包含不同的业务逻辑并使用案例实现。 演示者-演示者将获取的数据从View传递到Interactor,以根据业务逻辑进行进一步处理。 经过进一步处理后,交互器将数据传递给Presenter,然后将其传递给View以更新UI。 演示者还与路由器进行交互以执行导航。 实体是指按照应用程序流程进行处理和更新的自然趋势的数据模型。 实际上,数据模型和视图的组合效果对用户而言是可见的。 R外 -路由器负责所有与导航有关的任务,并在需要时传递任何数据。 这种职责分解称为“ 单一责任原则” 。 因此,它非常容易编写测试用例,这与其他在同一类中包含业务逻辑,UI处理,导航等内容的体系结构不同。 沟通流程 在上图中,您可以看到Interactor与其他两种类型的类进行通信 API数据管理器 本地数据管理器 这些不是其他组件,而是Interactor的帮助程序方法,仅用于隔离职责,例如用于进行API调用的API数据管理器和用于处理数据持久性的本地数据管理器 。 现在,通过查看该图,您可以非常清楚地了解流程。 如果没有,我举个例子来解决。 假设您在登录屏幕上。 登录完成后,您必须显示仪表板。 因此,流程将是这样的:

[Code :: Blocks]使用MinGW-w64在Windows下编译64位

使用Code :: Block的最大好处之一是,在编译器之间进行切换非常容易。 在此博客中,它显示了如何将MinGW-w64(适用于Windows的GNU)添加到代码博客中,并使用它来编译64位程序。 1.安装MINGW64 下载并安装MinGW-w64。 假设您将其安装在C:\ mingw64下 。 2.设置编译器 打开代码::块 。 转到设置>编译器 。 在所选编译器的下拉列表中,默认情况下应选择GNU GCC编译器 。 我们将复制此编译器的设置,然后对其进行修改。 单击复制,然后为要设置的编译器提供一个新名称。 您可以随意命名(例如GNU GCC编译器(x64) )。 最后一步,您需要更新工具链可执行文件标签下的工具链 。 将编译器的安装目录修改为MinGW64的目录(例如C:\ mingw64 )。 同时在“ 程序文件”下更新以下内容: C编译器: x86_64-w64-mingw32-gcc.exe C ++编译器: x86_64-w64-mingw32-g ++。exe 动态库的链接器: x86_64-w64-mingw32-g ++。exe 静态库链接器: x86_64-w64-mingw32-gcc-ar.exe 现在,您可以继续使用此编译器来编译程序。 3.设置调试器 通过上述步骤,您将无法调试程序。 您可能会收到以下错误消息: 启动调试对象失败:未指定可执行文件,请使用“ target exec”。 调试器状态为0 现在,您必须在设置>调试器…下设置调试器 。 在GDB / CDB debgger上选择,然后创建Config 。 […]

自定义字符串可转换?

大家好,首先,我要说“新年快乐”。 对于我来说,2016年确实是令人惊讶的一年。 今年发生了很多事件,但最值得注意的是,我发现了自己对编码的热情,最近我从一个了不起的编程培训营Flatiron School毕业。 至少可以说,我在Flatiron的时间真的很棒。 我从来没有想过我会在3个月的时间里学到很多东西并取得很多成就。 我要向所有的老师,教职员工和我的同伙大声疾呼,以提供所有支持。 我心中知道2017年会更好。 现在是我踏上成为一名成功的开发人员并继续学习,学习和学习的旅程的时候了。 现在回到讨论的话题。 今天,我想讨论有关“自定义字符串可转换”的问题。 “自定义字符串可转换”是一种协议,可以在类型(例如类或结构)上实现,以具有声明的属性的自定义表示形式。 通过遵守此协议,代码的输出立即变得更具可读性,但更重要的是,它输出所需的信息。 Swift具有属性的默认表示形式,它将列出您定义的所有属性和值。 请看下面的代码示例: 结构车{ 变量名称:字符串 var年:Int var color:字符串 var new:布尔 } let dreamCar = Car(name:“ Mustang”,年:1995,颜色:“ blue”,新功能:false) 打印(dreamCar) //汽车(名称:“野马”,年份:1995,颜色:“ blue”,新车:false) 在这里,我创建了Car的结构并设置了四个属性。 我还声明了一个名为dreamCar的变量,该变量从Car继承并实现其所有属性。 如您所见,当我打印dreamCar时,它列出了它的所有属性。 但是,如果我只关心汽车是否是野马,如果它是蓝色,那么我们如何才能做到这一点呢? 这是CustomStringConvertible派上用场的地方。 结构车:CustomStringConvertible { 变量名称:字符串 var年:Int var color:字符串 var new:布尔 var说明:字符串{ 返回“名称:\(名称),颜色:\(颜色)” } } let dreamCar = Car(name:“ Mustang”,年:1995,颜色:“ blue”,新功能:false) […]

NSNotificationCenter和委派简介

NSNotificationCenter和委派是每种允许您在iOS项目的各个类中交流信息的方法。 但是这些概念之间有什么区别? 您什么时候可以使用另一个? 有没有要考虑的缺点? 让我们潜入。 什么是授权? 委托是一种设计模式,顾名思义,它出于沟通目的将一类的责任和控制权委托给另一类。 基本上,一个类(委托人)陈述了另一类(或委托人)必须遵守的某些行为。 因此,委托人可以指望每次使用委托人时都会执行的行为。 此外,委托可以返回信息。 委派的一个示例是内置的UITableViewDelegate,它具有许多(可选)方法。 如Apple所述,例如func tableView(UITableView, didSelectRowAt: IndexPath)是一种告诉UITableViewDelegate现在已选择指定行的方法。 换句话说,表视图将执行此操作的委托委托给它的委托,该委托返回有关选择了哪一行的信息。 可以将委托通信与电话进行比较:只有委托人和委托人正在互相交谈。 在审查NSNotificationCenter时请记住这一点! 什么是NSNotificationCenter? 苹果将​​NSNotificationCenter描述为“一种在程序中传播信息的机制。” NSNotificationCenter发送通知,观察者被设置为“监听”该通知,然后采取自己的指定动作。 NSNotificationCenter提供了一种将事件通知多个对象的方法。 (请注意,一旦观察者不再需要侦听通知,则也需要将其删除。) 与委托电话的类比不同,NSNotificationCenter更像是无线电广播:多个接收者可以收听和收听消息,但不能将信息中继回发送者。 行动! 所有通过NSNotificationCenter或委托进行的通信都用于创建操作。 使用NSNotificationCenter,设置为侦听/观察的任何实例都将在“听到”通知后立即执行自己的操作。 对于委派,代表必须采取委派者提出的具体行动,只要考虑到所有这些行动,就可以按照需要的顺序调用这些行动。 想象一下NSNotificationCenter的竞赛。 跑步者(观察者)正在收听起跑喇叭(通知)。 一听到他们的声音,每个跑步者便开始自己的动作:奔跑,跳跃,走路,停下来系鞋带等。起跑号角并不能控制跑步者在做什么,但确实会导致他们开始! 同时,想象一下种族作为代表的清理工作人员。 赛事组织者(代表)已汇总了赛事结束后需要清洁的所有区域的清单:垃圾桶,街道,看台等。清洁人员(代表)必须完成组织者已安排的任务,但是他们的任务可以按照当时最有意义的顺序进行:说他们只有在清理看台后才能进入街道,因此他们要先看台。 清理人员还可以将有关清理工作发生情况的信息返回给比赛组织者。 尽管组织者和清理人员只是互相交流,但组织者绝对可以依靠清理人员来完成工作! 外卖 这就是说NSNotificationCenter和委托用于非常不同的情况:NSNotification用于在类之间发送一对多消息,而委托用于发送一对一消息。 设置代表正在创建一个耦合关系,其中两个对象彼此直接通信。 同时,NSNotificationCenter是一个更加分离的关系。 在使用方面,如果需要将单个事件通知多个对象,则NSNotificationCenter可以完成此工作。 如果需要执行特定操作,或者接收方需要将信息返回给发送方,则委派是一个不错的选择。 更多的听众,更多的问题…… 另一个使用注意事项可能是调试。 在研究此主题时经常出现的问题是调试NSNotificationCenter问题的难度,因为观察者/侦听器的数量越多,越难分辨是什么引起了问题并追踪问题。 正如许多消息来源很快指出的那样,对于开始使用NSNotificationCenter调试与应用程序流和控制相关的问题的现有项目的开发人员而言,这尤其困难。 资源资源 https://developer.apple.com/reference/foundation/nsnotificationcenter https://www.raywenderlich.com/90773/introducing-ios-design-patterns-in-swift-part-2 http://useyourloaf.com/blog/delegation-or-notification/ https://www.andrewcbancroft.com/2015/02/05/nsnotificationcenter-vs-delegation-analysis/ http://www.andrewcbancroft.com/2015/03/26/what-is-delegation-a-swift-developers-guide/ http://www.andrewcbancroft.com/2014/10/08/fundamentals-of-nsnotificationcenter-in-swift/