Tag: Ios开发

MVVM,您要做一项工作!?

想法💡 在过去的几年中, MVVM在iOS社区中赢得了一定的声誉。 几乎所有其他会议都至少有一个发言。 几乎所有其他博客文章都在谈论设计模式,特别是MVVM(就像这样的:p)。 所有这些表明,它必须非常擅长于其工作。 因此,让我们尝试了解它的实际作用。 动机💪 当我们制作一个iOS(或者您可以说一般而言,任何移动/网络)应用程序时,每个屏幕都具有多个UI组件,例如UIView , UITextField , UILabel , UIImageView等等。这些组件需要自己处理很多工作逻辑。 因此,两者之间紧密耦合的机会很大。 现在耦合不好,因为它 增加了进行UI修改的成本 难以对此类代码进行单元测试 因此,为了使它们分离,我们经常尝试使用一些设计模式来添加一些抽象和模块化 。 这样的模式之一就是MVVM,它是由Microsoft推出的,它代表的当然是Model-View-ViewModel 。 我不会深入研究MVVM的详细信息,因为您一定不厌倦一遍又一遍地阅读它。 相反,我将谈论它所提供的功能以及我们可以在其他地方应用它。 如果您是第一次收听MVVM,那么Microsoft会提供一些非常好的文档,您可以在此处查阅,或者社区中也有很多不错的帖子。 它能做什么? 🤔 MVVM只有一项工作-它只是将表示逻辑与UI分开。 让我们谈谈这种表示逻辑。 每个UI都需要以一种或另一种形式显示一些数据。 现在,由于数据以原始格式保存,因此无法直接显示。 因此,我们需要对其应用一些装饰性方法,以使其可用于UI。 到目前为止,还不错,但是没有人谈论这些数据从何而来。 它可能来自持久层,或者可能是api调用,或者可能两者兼有。 因此,究竟谁负责获取这些数据。 由于ViewModel是用于装饰数据的“唯一”负责人,因此也许我们可以像一些核心数据助手一样将数据获取逻辑也放入其中,或者可能是一些api逻辑。.aa,我们回到起点,从头开始听起来像控制器。 现在是时候退后一步,只将视图模型保留为表示逻辑了。 关键时刻! 😲 因为,当我们研究MVVM(或此类设计模式)时,这个灰色区域(即谁获得数据)的定义不是很好,因此我们最终将此逻辑放入视图模型或控制器中。 因此,产生了大规模控制器或如今的大规模视图模型 。 但是没有人说您不能像提取表示逻辑那样提取数据。 因此,我们还应该从MVVM中学习到的是,我们应该抽象出不同的责任性,并将其置于不同的类别中。 只是MVVM没有谈论数据获取,但是我们可以使用导致MVVM的想法,即每个类都承担单个责任是一件好事。 我们可以通过多种方式实现这一目标,尽管现在我仅使用两种简单的方式进行讨论- concrete classes和protocols 。 例子🛠️ 在第一个示例中,我们将看到如何将Datasource注入到UserListViewModel以便我们可以抽象出将数据提取到单独的类中的逻辑,并使视图模型仅使用它, struct User { […]

适用于iOS的My Development Toolset 2019🛠

更新:2018年11月26日 大家好,我想在2019年更新一些我用于iOS开发工具,开源应用程序,网站,存储库,库的工具集,以及我目前仍在使用的其他工具。 本文将全年不断更新。 您可以找到我的2017年工具集到2018年的一些更新以及一些新建议以及其背后的原因。 从我的2019列表中删除了一些工具。 原因是,我不再继续使用此工具Gitscout , Bee , GitKraken , 完美无瑕 。 我在下面对其中一些发表一些评论。 工具类 有一个新的第一名。 它的名字叫夏洛克 。 我们可以实时编辑视图和布局约束,模拟在其他设备上的运行。 他们是RevealApp的完美团队。 FASTLANE我强烈建议您进行扫描,比赛和健身功能。 上周,我发现了一个很棒的工具,可以实时跟踪您的请求请求并列出所有受监视的存储库。 还有iOS和Android版本。 这个程序值得五颗星。 预告片 ModMove ,您可以使用键盘快捷键和鼠标轻松移动/调整窗口大小。 这对于HyperSwitch确实是我的最爱。 Injection ,将Swift / Objective-C代码动态插入正在运行的应用程序中。 它不会对您的项目进行任何更改。 您也可以与AppCode一起使用。 Cacher是专业开发人员的代码片段组织者。 您可以管理要点摘要。 NightOwl Mojave之后,我们在macOS上遇到了DarkMode。 NightOwl进一步扩展了此功能。 您可以自动配置日出/日落,安排个人配置,并可以轻松更改所有配置。 普利姆 是一个了不起的演示工具。 它总是更新的,对于Sprint演示会议非常有帮助。 您可以隐藏桌面项目,禁用通知,使扬声器静音。 救援时间 是跟踪您如何在开发中花费时间或正在使用哪些工具的理想工具。 我推荐了GitKraken 在2017年用于GIT。我有很好的理由,例如GitFlow 可以由GitKraken自动添加。 另外,他们有gitlab支持。 GitKraken走了很长一段路。 但是当启动一个大型项目(例如15分钟的编译时间)并且该项目中总共有142802个代码时, SourceTree自2017年11月以来就是我新喜欢的GIT GUI。 KeepingYouAwake是适用于macOS的小型菜单栏实用程序,可以阻止Mac在预定义的持续时间内或激活后进入睡眠模式。 […]

内存管理器通过iOS Swift

Bộnhớthìcóhạn,nêntrongquátrìnhdev taphảiquảnlíchotốtviệccấpphátvàhuỷbộnhớ,đểtránhtrườnghợp内存泄漏。 Mìnhsẽvídụchocácbạntrườnghợphaygặpphải,khi 2 objectstrỏtớinhau 用户级别为2类,用户为Car,用户级别为sau khi khaibáovàgắncác,实例用户为sg gnn,用户级别为bnng,nh classngưiđuxảyralànósẽko类用户。 注意内存泄漏khi保持周期hìnhthànhdo 2biếnstrongcùngtrởt strongi 1địachỉ。 类用户 { 命名:字符串 让电子邮件:字符串 var car:汽车? init(名称:字符串,电子邮件:字符串){ self.name =名称 self.email =电子邮件 } deinit { 打印(“再见\(名称)!”) } } 车类{ let id:整数 让类型:字符串 var所有者: 用户 ? init(id:Int,type:String){ self.id = id self.type =类型 } deinit { 打印(“再见\(类型)!”) } }变量所有者:用户? =用户(名称:“ Vu”,电子邮件:“ vu.vicent@gmail.com”) var car:汽车? […]

iOS开发:设备检查

作为一个iOS开发者,如何识别始用者装置可以说是基本功课,最近正好被老板开了一个帐号绑定Device的需求,整理了过往的几种作法,跟各路iOS新手分享一下,重点在最后2017 WWDC最新推出的Device Check,也有实作的程式码。 话不多说,就从最初的UDID开始吧! 在iOS 5之前,如果要辨认使用者的设备,可以利用以下程式码: [[UIDevice cuurrent] uniqueIdenfier] 来获得设备的UDID(唯一设备标识符),以达成装置绑定或追踪。这个值是唯一且永远不会变的。 而是实际上存在有隐私问题,UDID等于设备的身分证字号,如果开发者可以随意获取UDID,代表他们可以通过各种分析来获取『多于开发者应获取的资讯』。 UDID这么潮的功能,注重专有权的Apple当然不会让我们一直使用。其后Apple提供了另一种识别方式— IDFV(供应商标识符) 让id = UIDevice.current.identifierForVendor 如果说UDID是Device的身分证字号,IDFV比较像是Device的『工号』 每个应用开发者能取到的设备IDFV都不一样。 举例来说,用户下载了A开发商的a,b两款App,同时下载了B开发商的c App,A开发商如果用上面的程序代码获取IDFV,在两款app中皆会取到1234 ,而B开发商会取到5678。 而这个IDFV既然是“ identifierForVendor”(IDFV),就算删除App,重新下载过后仍然会取到一样的IDFV。 不过!如果将手机内同一个开发商的App全数删除后,这个IDFV将会重置,随后再次用户再次下载同一个开发商的App,会拿到不同的IDFV 另外,还有UUID()这个识别方式 让uud = UUID() UUID是一个128位的数值,里面加入了产生UUID当下的时间去计算出来,不过UUID就是一个几乎不可能重复的随机数值而已,其中也不会有什么开发商或装置的识别方法。 我们透过将UUID存放在Keychain中基本上也可以达到我们对于绑定装置的需求。存储于Keychain的方法可以参考介绍: http://www.jianshu.com/p/9e885c3e6b0a 而在2017年的WWDC上,苹果推出了另外一种装置识别的API — Device Check。我们先来看一下官方说明Device Check的使用情境: 举个比较易懂的例子,今天一个App提供了30天的免费试用,期限到了之后透过Device Check的API把装置从状态A(试用中)标注为状态B(已过期),之后却是删除App重新下载,或者系统重置,都不会影响到这个状态的判定。而这个状态,其实就是两个位所组成的,最多处于状态而已。 接着来看一下Device Check API的运作流程: 上图可以看到,先在客户端端生成令牌,然后丢给服务器,服务器可以再针对以下几种属性传给Apple,让资料保存在Apple端。 “ device_token” => $ deviceToken, “ transaction_id” => Uuid :: uuid4() -> toString(), […]

自定义iOS View Controller过渡

查看/下载该项目的源代码 是否曾经想过在View Controller过渡中添加一些“ pezaz”? 确保内置的过渡看起来还可以,但是有时候您想要的东西会让您的用户充满过渡的喜悦。 在这篇简短的文章中,我们将要做到这一点。 我们开工吧。 主要玩家 我可以向您介绍一下本课程中的精英球员群体: UIViewControllerTransitioningDelegate 我们将遵循此协议,以允许我们使用自定义过渡:我们可以按字面上设计我们想要的任何过渡! 谈论: UIViewControllerAnimatedTransitioning 这个坏男孩将使我们能够为View Controller设计完全rad和自定义的过渡! 怎么了 是的 鸡休息 那么这里需要什么方法? 好吧,在这种情况下,我发现所需的方法确实非常有用且合乎逻辑。 例如,在UIViewControllerTransitioningDelegate中,我们需要添加以下方法: animationController(forPresented)和animationController(forDismissed)—实际上,我们需要在动画呈现视图时和何时关闭视图时调用一些东西。 类似地,当遵循UIViewControllerAnimatedTransitioning时,我们将使用: transitionDuration()和animateTransition(using)-在这里,我们提供了过渡的持续时间(显而易见的)以及实际的动画。 让我们开始 开始一个新项目,并为过渡创建一个新的Swift文件。 在其中,我们将从NSObject继承以开始,然后遵循AnimatedTransitiong: 类CewlAnimation:NSObject,UIViewControllerAnimatedTransitioning { } 在这里,您将需要两种方法来使过渡正常工作: func transitionDuration(使用transitionContext:UIViewControllerContextTransitioning?)-> TimeInterval {返回1.0 //只要您喜欢就可以:-D} fanimanimateTransition(使用transitionContext:UIViewControllerContextTransitioning){ //动画Meh!} 太棒了! 让我们添加一些动画。 func animateTransition(使用transitionContext:UIViewControllerContextTransitioning){让containerView = transitionContext.containerViewlet toView = transitionContext.view(forKey:.to)toView?.transform = CGAffineTransform(scaleX:0.0,y:0.0)containerView.addSubview(toView!)containerView。带子视图(toFront:toView!)UIView.animate(withDuration:1.0,动画:{toView?.transform = .identity})transitionContext.completeTransition(true)} 哇! 那是很多代码。 在基本级别上,这将在视图之间进行1秒钟的过渡,并在其中进行缩放以从中心填充屏幕。 让我们将代码分解为可咀嚼的内容: […]

您是否了解与iOS App开发相关的准则?

无论您是iOS应用程序开发领域的新手还是一支经验丰富的专业人员团队,都希望创建更多应用程序,请确保在开始开发旅程之前,您已经非常熟悉这些准则。 但是,如果您不了解这些准则,请不要担心,因为我们在这里可以帮助您理解这些准则。 iPhone App开发指南 尽管应用程序开发人员应遵循许多准则,但我们将所有准则汇总在一起,并在3个主要主题中列出了这些准则: 1.发展方针 2.设计准则 3.营销准则 通过对指南的详细说明,进一步解释了所有3条指南部分。 进一步阅读以了解更多信息。 — https://goo.gl/vNu65K

UITableView入门(有关编写简洁代码的提示)

将表视图添加到视图控制器并设置约束,如下所示。 拖动Table View Cell,并将Style设置为Right Detail,并将单元格标识符设置为’cell’。 稍后我们将相应地进行调整。 我通常按​​照上面显示的方法处理表视图,只是为了给我更大的灵活性。 运行模拟器,您可以看到我们的数据列表已正确填充。 请注意,我们正在使用提供给我们的4种基本样式之一。 继续尝试将tableview 样式更改为Subtitle,然后重新运行模拟器。 很好! 您已经使用一些数据创建了第一个表格视图! 我们已经获得了符合UITableViewDataSource和UITableViewDelegate协议的UIViewController,并将其设置为UITableView的数据源和委托。 这仅适用于几行代码,但可以想象如果UIViewController以后在应用程序中有更多事情要做,该类可能会变得肿。 它将承担太多责任,并且只会使其难以维护,阅读或测试。 因此,让我们继续重构代码。

🥊Luta反对o XCode

Cansado de esperar horas para compilar um simples projeto? XCode可以快速构建项目,也可以快速构建项目。 Parece ser um problema generalizado,开发人员在多种语言中遇到的问题,因为没有构建 Xcode会遇到问题。 Luta反对或XCode Então,chega de papo! 拟议的人文历法和基本的法则! 公开竞猜11简而言之,一个干净的密码。 程序菜单,produzir女主角! Acontece que issonaãoparece ser uma boa alternativa para o compilador,que algumassituaçõesse conconfe ao inferir tipos efunções。 Veja alguns示例: 1.无合并运算符 乌拉圭乌兹别克斯坦乌拉圭回合的临时舞弊杂费收入税率95% 2.铸造CGFloat对CGFloat Chega a serengraçado,mas手形valores CGFloat especificando quesãode fato CGFloat pode custar um […]

iOS的国际化和本地化…

生成的字符串文件格式如下图所示。 每个句子都以冒号结尾。 例如: / * Class =“ ClassName” ; 标题/文本/标题=“您从情节提要中给定的文本” ; ObjectID =“ j8m-qd-ImH” ; * / “ ObjectID.text” =“您的给定值 ” ; →可以本地化图像,声音,文本,视频,MP3资源。 →在Xcode中打开资源,然后从右侧实用工具窗格中单击FileInspector。 只需检查您选择本地化的语言即可。 它为您选择的文件创建额外的文件。 选择您要为其提供本地化资源的文件。 在右窗格中,您可以看到“ 完整路径 ”和位于其下方的小箭头 。 您可以看到所创建语言的扩展名为.lproj的文件夹。 →要更改分配给UI的字符串,请使用NSLocalizedString(“ value”,comment:“ comment”) 注意:在为本地化字符串创建一个新的字符串文件以分配给UIComponent时,我们仅需将该文件命名为“ Localizable ”。 否则文件将不会被编译。 扩展新创建的文件后,您可以看到还添加了一些新文件作为本地化语言的数量。 →如果您将语言文件/行设置为错误的格式,则编译器将显示错误消息,例如“读取失败:由于格式不正确,无法读取数据……” 要测试语言更改功能,请在Xcode中→转到产品→方案→编辑方案→选项→更改应用程序语言→运行… →您可以在此处检查完成的示例项目 — — — — — — — — — — ************************** — […]

友好介绍iOS动画

今天,我们将介绍iOS中的基本动画。 动画是在您的应用程序中增加自定义和交互性的一种好方法,我们可以使用它们做很多事情。 在本课程中,我们将介绍一些基础知识,以便您可以入门。 动画遵循一种简单的模式: 从->到持续时间。 我什么意思 好吧,我们声明我们想要的视图,或者我们要进行动画处理的所有内容,然后进行动画处理。 让我们举个例子。 假设我们要在应用程序中以某种方式对图像进行动画处理。 我不会在此处介绍更改大小或约束的问题,但我将向您介绍动画API。 UIView.animate(withDuration:1.0,动画:{}) 在这里,我们可以访问名为UIview.animate(withDuration)的静态方法 。 什么是静态方法? 这是UIView类上存在的一种方法,我们可以通过简单地编写UIView来按常规方式访问。 最基本的实现带有持续时间和动画闭包。 每当您在闭包内编写动画时,这些动画将在1.0秒内执行。 您可以延长和缩短这些值以适合您的需求。 我希望对动画的超级简短介绍能使您对iOS的动画API感兴趣。 敬请期待更多!