Tag: Swift编程

一种使用MVVM的表格视图的POP方法。

首先是第一件事。 POP代表面向协议的编程。 POP上有很多现成的资料,因此我将不对其进行详细介绍。 MVVM代表模型视图视图模型。 这是一种设计模式,其中有类或类型,这些类或类型可以分为三类,即模型,视图和视图模型。 这是一篇很棒的文章 了解MVVM。 我选择MVVM而不是MVC(模型视图控制器),因为MVC通常会导致整体式Massive View Controller。 现在开始。 我们首先从为tableviewcellmodel定义协议开始。 tableviewcellmodel将包含该单元格的标识符。 它还将包含其他数据以配置单元。 我们还需要可以使用此tableviewcellmodel配置的tableviewcell。 因此,我们还定义了可配置单元协议。 在这里,无论我们使用POP布局的任何框架都可以通过非常干净的表视图数据源来实现。 我们创建RBConcreteTableViewController ,它是UITableViewController的子类。 它具有RBTableViewModel类型的属性tableViewModel,这意味着它可以使用符合RBTableViewModel的任何类型。 我们重写viewDidLoad()以使用tableViewModel配置tableView。 然后,我们获得了UITableViewDatasource方法的样板代码。 如您所见,该代码更加简洁。 您可以更早地跟踪错误。 我们还避免使用非常庞大的视图控制器。 通过为可配置表视图创建协议,可以出于一致性目的而改进此代码,但是您可以通过遵循上述可配置单元协议的模板来轻松实现此目的。 此处提供了此POP方法的源代码。 您可以继续改进自己的实现。 你喜欢这篇文章吗? 也许尝试以下方法之一: 在Swift中使用ExpressibleByArrayLiteral简化生活 驯服宽松的通知 断点作为调试内容提供者 在核心数据中使用可变类型作为可转换属性的危险 请提供任何反馈以进行改进。 我的TapChief个人资料如下:

为什么您应该在没有情节提要的情况下开始学习IOS。

前一段时间,当我开始学习IOS开发时,我总是使用情节提要来构建UI,就像任何初学者一样,这里有自动布局和约束之类的概念以及我无法掌握的其他内容,我起初很挣扎,但随后您就可以掌握它了。之后,我问了我的一个以IOS开发为生的朋友,他为我提供了一些有关编写更好代码的建议,以谋生为生。 他建议我不要使用情节提要,不要用代码编写所有内容。 从那里开始,我开始在网上搜索,结果证明这是IOS开发人员之间的一个大争议。 只是要记住,NIB和XIB是描述用户界面的文件,并且是使用Interface Builder构建的,它们已替换为情节提要,但仍可以在开发中使用。 即使许多开发人员坚持使用一种方法,您也可以将所有方法都应用到同一项目中。 我认为从代码开始可以使您更好地了解swift,并更好地了解IOS开发。 最重要的部分是何时使用这三个选项之一,构建简单而快速的内容对故事板有帮助,您甚至可以在其中制作一个快速原型来快速完成工作,如果您必须复杂的UI或更好地掌握您可以使用代码编写它。 永远记住一些事情 不管您使用什么,重要的是完成产品并为您的客户提供最佳的用户体验。

Swift —在iOS中以编程方式创建自定义TableView单元格

让我解释一下我的情况,我是IOS开发人员大约4年。 当我尝试构建我的第一个应用程序时,我使用情节提要,xib之后,我将自己转换为以编程方式创建所有内容。 我并不是说这是最好的方法,也不是唯一的方法,但我更喜欢这样。 当我以编程方式创建某些东西时,我感到尽可能地自由。 这是我的第一个中型故事,对不起,如果我做错了什么。 好,开始吧 如果要在tableView单元上自定义并添加其他功能,则可能需要创建自定义tableView单元类。 我说可能是因为当前的TableView单元格具有一些默认元素,这些元素可以在某个时候自定义您的单元格。 但是,如果您想自定义更多内容,我将在本文中进行解释。 我将逐步向您展示所有内容,并且我将使用快速的语言。 这是我们将要构建的单元: 步骤1创建Xcode项目并修复设置: 之后,使用Single View App创建Xcode项目,因为我们不使用情节提要,因此我们需要修改一些设置。 所以这是我们应该解决的问题; 首先从项目设置的主界面中删除主菜单。 您可以在下面找到突出显示红色的图像。 然后我们打开AppDelegate.swift文件,所以我们需要告诉编辑器哪个视图控制器是根目录。我们仅为此项目修改didFinishLaunchingWithOptions函数。 AppDelegate.swift代码应类似于 完成此过程后,输入文件名“ Product”,然后单击“创建”。 现在,您应该在Project Navigator上看到Product.swift文件。 点击该文件,然后进行编辑。 如您所见,我创建了Product模型数组,因此我们可以轻松地将数据填充到TableView中。 我还创建了ProductProductArray,用于将虚拟数据添加到我的数组中。 因为我们不使用情节提要,所以我们需要向其中注册单元 步骤4创建自定义TableView单元格类并将其设置为TableView 在创建自定义TableViewCell之前,我要提到锚点和约束。 再一次,因为我们不使用Storyboard,所以我们需要通过编程来添加约束,所以我使用从Brian Voong那里学到的一些扩展,他拥有youtube频道和网站(称为letsbuildthatapp.com),我强烈建议他开始学习更多。 您将在下面看到扩展屏幕截图和整个代码。 如您所见,我们使用“ ProductCell.self”更改了tableView.register单元名称,我们也修改了cellForRowat函数,我们传递了Model而不是Property。 终于这是到目前为止的结果 仅剩一步之遥,您可能意识到我们的按钮不起作用,因此我们将使用委托使其起作用。 让我们来看看。 首先,我们在Product Cell中创建一个名为ProductCellDelegate的协议,然后添加两个函数以增加和减少数量。 我们的协议应该是: 结果是: 感谢您的阅读。 这是整个项目的GitHub链接: https://github.com/kemalekren/Sample-Custom-TableView-Project-

Swift:如何将图像放置成一个圆圈

以圆圈显示图片。 Swift 4:对于iOS,这应该显示一个圆圈。 将图像的IBOutlet拖动(按住Ctrl键并单击)到您的代码中。 cornerRadius绘制图层背景的圆角时使用的半径。 可动画的。 https://developer.apple.com/documentation/quartzcore/calayer/1410818-cornerradius clipsToBounds属性一个布尔值,该值确定子视图是否限于视图的边界。 https://developer.apple.com/documentation/uikit/uiview/1622415-clipstobounds 2.在viewDidLoad()中, 使用实例属性 layer.cornerRadius 和 clipsToBounds 。 profileImage.layer.cornerRadius = 50 profileImage.clipsToBounds = true

使用闭包的更好的编程组件

TL; DR:使用闭包在代码中创建模块化且简洁的UI组件。 有无数种方法可以在您的应用程序中实现UI组件。 使用情节提要是一种流行的选择,但是有时您会希望以编程方式对其进行布局。 在本文中,我将向您展示以编程方式构建相同UI,一个简单的登录屏幕的迭代实现。 首先,我将向您展示最简单的方法,该方法写起来快,却难以维护。 其次,我将向您展示使用私有帮助器方法的更好方法。 第三,我将向您展示使用闭包实现UI的最佳方法。 如果您以前没有使用过闭包,那么在阅读本文之后,您将很快意识到它们的强大功能! 在深入探讨编程方法之前,我想简要介绍一下Storyboard。 它们在初学者的iOS教程中无处不在,因为它们易于可视化和理解。 它们也非常强大。 您可以拖放组件,实时自定义UI组件的几乎所有方面(例如,字体大小,背景颜色),并测试UI在各种设备尺寸和方向上的外观。 但是,有时也需要部分或全部以编程方式创建UI。 对我来说,它正在与其他iOS开发人员合作,他们更喜欢仅在代码中构建UI。 在共享的iOS代码库上工作时,情节提要文件肯定会很快变得令人头疼。 在编写程序性UILabel , UIButton和其他核心UI组件时,我当然想学习实现它们的最佳实践。 以下是实现简单登录屏幕的三个示例,这些示例说明了编写程序UI代码时的注意事项。 假设我们要创建此屏幕: 在这里,我们有一个标题标签,一个标题标签和两个按钮。 我们如何以编程方式做到这一点? 好吧,最简单的方法是将其全部写入viewDidLoad() : 实现#1:实例化viewDidLoad()中的每个UI组件 这确实是实现此目的的最简单方法,但这就是收益的终点。 如果我想要另一个按钮怎么办? 您必须命名它并编写很多重复的代码。 如果我需要重命名标签怎么办? 然后,您必须查找并替换该名称的所有实例。 我什至没有包括布局代码,您可以很快看到它变长的时间! 不仅如此,它还会污染viewDidLoad()函数,随着项目的发展,我们希望避免使用该函数。 也许我们可以使用私人助手功能? 实施#2:私人帮手功能 现在, viewDidLoad()看起来更干净了! 我们将标签和按钮实现重构为private (限制访问)和可重用的帮助器函数(例如, createLabel(text:textColor:font:)用于创建标题和标题标签)。 这样比较好,但是仍然存在一些缺点。 首先,如果我们希望UI组件具有很多自定义项,则init参数开始变得冗长且不可扩展。 在上面的代码段中, createButton(text:textColor:font:backgroundColor:)方法具有四个输入,其中之一具有可选的默认值。 随着我们的按钮变得越来越复杂,我们想权衡可重用的帮助器功能与versus肿的万能包(乍看之下很难理解)的好处。 尽管此函数遵循DRY原理,但我们牺牲了可读性(如果添加其他参数,则线性可能将其标记为太长)。 在第三个实现中,我们将使用不同的东西: 闭包 。 闭包是封装在许多情况下弹出的功能块。 实际上,您一直都在使用闭包-函数(全局和嵌套)是一种闭包! 这只是一个更抽象的术语。 例如,闭包表达式可以存储为变量并在读取时执行。 封盖很棒,值得一读(请参阅Apple的文档)。 您可以对它们做很多事情,并使代码保持模块化。 […]

在表格视图单元格上创建流畅多彩的缩放过渡

动画很棒。 iOS用户喜欢使用具有沉浸感和流畅动画的出色应用程序。 这是我作为该平台上的iOS开发人员的第一篇文章,我想向您解释我对当前正在从事的项目的认识。 想象一下这样的对象列表,或者更好的是UITableView : 简单,清晰,并且对本教程来说最重要的是单色单元。 如果通过点击这些单元格之一来扩展它并转到具有相同颜色背景的另一个视图控制器,那将不是很好吗? 我真的是这样 在本教程中,您将实现它。 因此,让我们打开一个新的Xcode项目并开始编码 让我们从创建带有交替彩色单元格的UITableView开始,我将选择红色和蓝色。 在您的项目中打开ViewController.swift并添加此方法。 如您所见,我将代码放入ViewController.swift的私有函数中,并且由于设置了委托和数据源,因此编写了扩展程序来处理所需的方法。 我在viewDidLoad()中调用setupTableView ()。 这是您在运行项目时看到的: 这是UITableView的非常简单的实现。 但是我不喜欢那些颜色,那些分隔物和那些大的单元格。 我开始以这种方式删除分隔符: tableView.separatorStyle = .none 然后,我认为我们应该为单元格添加一个单独的类。 一切都会变得更加复杂。 转到“ 项目导航器”,“新文件”,“可可接触类” 。 输入“ ColorfulTableViewCell”并使其成为UITableViewCell的子类。 创建文件。 现在,您应该拥有以下内容: 我们希望我们的单元格像我在故事开始时所展示的那样。 我们需要卡片视图样式。 我在类中声明了一个var并创建了图形: 看一下setupGraphic()的前两行。 我需要一个清晰的背景,因为我想使用一个漂亮的卡片视图,并且我还需要一个.none selectionStyle,因为我不需要它。 确保您的ColorfulTableViewCell类是这样的,然后再次打开ViewController.swift进行一些小的更改。 在setupTableView()中,您必须为单元格注册另一个类。 不再是UITableViewCell.classForCoder(),而是新的UITableViewCell.classForCoder()。 tableView.register(ColorfulTableViewCell.classForCoder(),reuseIdentifier:“ ColorfulCell”) 像这样编辑numberOfRows和cellForRow : 现在,我们要使用自定义单元格类,我们将使用其中的五个。 现在您可以再次运行,您应该可以看到以下内容: 让我们添加一些很酷的颜色。 我建议您在coolors.co上找到这5个。 这是一个很棒的免费网站,可让您生成随机的颜色组合。 让我们获取RGB并将其添加到代码中。 现在,在ViewController.swift中,我们必须创建一个数组(我称其为“ coolColors”),以包装这些颜色并在cellForRow()中轻松使用它们。 一旦使用它们并运行,您应该会看到以下内容: 现在,我们有了丰富多彩的“ cardy”表视图💕。 […]

virtualswift —用于swift的虚拟环境

virtualswift是一个工具,可让您在Ubuntu和MacOS上创建本地swift环境。 它基本上是一个Shell脚本,它创建一个新目录并在其中安装swift。 然后,它更新PATH变量以使用swift的本地版本。 如果您熟悉python,则等效于virtualenv,但很快。 有什么用? virtualswift可以帮助您隔离不同的swift项目。 它还使在同一台机器上使用不同版本的swift变得更加容易。 当前支持的Swift版本为:4.0.2、4.0、3.1.1、3.1。 在Ubuntu上使用virtualswift为不同的swift版本创建和运行环境很简单。 对于MacOS,您需要根据要激活的Swift版本选择正确的xcode版本。 您可以在此处阅读有关xcode select的信息。 下表显示了每个swift版本所需的xcode版本。 如果您同时使用Ubuntu进行开发和生产,这将非常方便,因为您只需将本地swift环境复制到服务器,激活它们并运行它们。 有关安装和使用说明,请签出github存储库。 如果您发现virtualswift有用,请拍击👏。 随时在 Twitter上 与我分享您的建议/反馈 。

使用Swift以编程方式布局视图的另一种方法

开始学习Swift时,我对自动布局系统感到困惑。 无论是使用情节提要还是程序限制,它都不适合我。 一些约束在运行时会干扰其他约束,而对所有不同的冲突约束进行分类变得令人沮丧。 我承认在Xcode中使用自动布局功能非常强大,但我相信,除了自动解决方案的替代方法会增加计算成本之外,还会增加其他复杂性。 请注意,在我的标题中,我并不是说这是一种布局视图的“更好”方法,只是一种可以促进进一步实验的不同方法 我觉得有一种更简洁,更省钱的布局视图方式,因此我开始着手开发一个名为View Layout的小型项目。 它只是UIView的扩展,您在其中实例化一个结构(ViewLayout),该结构为您计算视图的位置。 您可能会做的所有数学运算都可以使用CGRect和框架布局视图? 所有这些都封装在“视图布局”结构中。 它使用ViewPosition枚举来确定视图相对于“引导视图”的位置。 我不会尝试描述它,而是显示代码。 这是ViewLayout的初始化,包括分解和解释的步骤。 //您要放置的视图的不同位置选择 枚举ViewPosition { 案例底部中心 案例底部左 案例底部右 案例中心 案例顶部左 案例顶部右 案例中心 剩下的情况 案例权 } //通常除非要以根视图为指导进行布局,否则通常要使用withFrame init init(withFrame ofView:UIView,position:ViewPosition,size:CGSize,padding:(CGFloat,CGFloat)){ self.guide = ofView.frame // 1 self.position =位置// 2 self.size =大小// 3 self.padding =填充// 4 } 1:我设置ViewLayout对象在计算其原点时使用的框架 2:我将框架的位置与指南进行了比较 3:我设置要在ViewLayout中创建的框架的大小 4:我使用元组设置视图的水平和垂直填充。 第一项(padding.0)控制垂直填充,正数增加原点的Y坐标,负数减少原点的Y。第二个数与水平填充相同,正数增加X坐标,负数减少了它。 现在,调用此初始化程序后,您将获得一个ViewLayout对象! 不过您还不能使用它。 您只是获得一个自动配置的框架以供视图使用而已,而仅仅是一个函数调用! 您所要做的就是调用以下功能之一: //不要忘记在实例化结束时调用它! […]

XCode教程中的Tap Gesture Recognizer问题

开发人员Apple教程指南轻按手势识别器照片库,然后单击“障碍物”。 이대한대한问题를간단히。 GestureRecognizer对抽头无响应 教程불구하고模拟器에서Tap Gesture가인식되지않는않는 启用了“用户交互”功能,默认为“故障”。 情节提要같属性의检查器Inter交互에서已启用用户交互한다。 教程中的旧版本 教程같이것이다。 전지만이전Swift版本이기에warning이것이다。 func imagePickerController(__ picker:UIImagePickerController,didFinishPickingMediaWithInfo信息:[String:任何]){ //信息字典可能包含图像的多种表示形式。 您要使用原件。 卫队让selectedImage = info [UIImagePickerControllerOriginalImage]作为? UIImage其他{ fatalError(“期望包含图像的字典,但提供了以下内容:\(info)”) } … } 최신에최신에에에에에최신최신。。。。。다있 func imagePickerController(__ picker:UIImagePickerController,didFinishPickingMediaWithInfo信息:[UIImagePickerController.InfoKey:任何]){ //信息字典可能包含图像的多种表示形式。 您要使用原件。 守卫让selectedImage = info [.originalImage]为? UIImage其他{ fatalError(“期望包含图像的字典,但提供了以下内容:\(info)”) } … }

Swift URL疯狂

严重的是,它们令人困惑。 万一有人再次绊倒,我将其发布为实验结果… 如果您是新手,不知道要弄什么,只需要复制和粘贴代码,则正确的机率大约为25%。 在Swift 3中 ,查找文件并将其用于任何预定义的功能中,需要正确完成两件事,关于文件目录: 资源地址的类型。 可以是URL类型,也可以是String类型。 文件是否以“ file://”开头 注意FileManager.default.fileExists()的输出是不同的! (末) 注意:此处定义了两个自定义打印功能。 这涉及以下stackoverflow问题: (如果您发现任何问题,请让我知道……我懒得找他们) 最后,如果全部失败,请记住重设…。 有时,它会由于无原因而中断。 控制手册=>产品=>清洁 重新启动XCode和模拟器。