Tag: 移动应用程序开发

iOS的TableViewKullanımı

从iOS发行到iOS发行人。 Ilk olarak故事板üzerindeki视图üzerine表视图ekliyoruz。 Böylebirgörünümelde ettikten管理员üzerineekliyoruz。 Şimdigeldik控制器üzerindekiişlemlere。 选择UITableViewDelegate和UITableViewDataSourcedelegasyonlarımızıekliyoruz。 Eklediğimizbu iki Protokol bizden ikifarklımethodu zorunlu olarakkullanmamızıistiyor。 numberOfRowsInSection和cellForRowAt。 numberOfRowsInSection toplamdakaçadet rowa sahipolacağımızıdöndürürkencellForRowAt表视图Celldöndürüyor。 Yani numberOfRowsInSection方法表视图üzerindekaçadet eleman,hücreolacağınıbelirliyyuz,cellForRowAtüzerindeise表视图hücrelerinidüzenliyor,ayarlıyoruz。 Zaten iki methodundöndürdüğüveri tipinden de anlayabilirsiniz。 Standart olarak UITableViewCell()在Storyboard上的可重复使用的单元格。 Haydiöyleyapalım。 TableViewCelli表视图可以用于UITableViewCell类,还可以用于标识符。 本OrnekCell添加UITableViewCell类。 Ve标识符olarak da ornekCellIdentifieryazdım。 否:不能识别XCode等级的检查员,请立即检查。 Burayıda hallettikten声音控制器üzerindeçalışmaya。 您可以从表视图视图中下载表,也可以从表视图中查看数据源。 UITableViewDelegate和UITableViewDataSource可以在UITableViewDataSource上进行更新。 Dahaaçıkanlaşılmasıaçısındanşöyleyapalım。 Meyvelerdenoluşanbir字符串数组oluşturalım。 Arrayımızşöyleolsun。 让meyveler = [“ elma”,“ armut”,“ muz”,“çilek”,“ kiraz”,“ portakal”,“ mandalina”] Arrayimizioluşturduktan声纳numberOfRowsInSection方法使用elemansayısını(Int)döndürüyoruz。 […]

2018年顶级新兴混合应用程序开发公司

没有移动应用程序,您将无法再思考生活,这就是为什么应用程序需要与网络同步而又不失去其本机外观,感觉和易用性的原因。 混合应用程序可以平衡移动网络和本机设备功能之间的这种行为。 难怪,绝大多数移动应用程序基本上都是混合应用程序,除了允许访问网络外,还集成了用于各种应用程序交互的设备功能。 但是,当您寻找顶级的混合应用程序开发公司时,周围有那么多可靠的选择就变得充满挑战。 这就是为什么我们要完成这项几乎不可能完成的任务,将2018年顶尖的新兴混合应用程序开发公司入围的原因。 1. Nimblechapps 总部位于艾哈迈达巴德的Nimblechapps是具有全球客户的端到端Web和移动解决方案提供商。 该公司具有在跨平台和细分市场构建一些最受欢迎和基准广泛的移动应用程序的资格。 出色的创造力和灵活的性能是Nimblechapps开发的移动应用程序的标志。 该公司拥有一支精巧的跨平台应用程序开发人员团队,他们可以通过出色的设计,精确的功能和令人愉悦的用户体验,将任何想法变成成功的应用程序。 该公司已成为全球范围内最有前途的移动应用程序开发商印度公司之一。 Nimblechapps的一些关键专业领域和专业知识领域包括适用于Android,iOS,Windows,Web开发,CMS开发,电子商务和基于位置的服务等的跨平台应用程序。 网站: https : //www.nimblechapps.com/ 2. Zco Corporation 多年来,ZCO总部位于波士顿,成为全球最受推崇的应用程序开发公司之一。 汇集了来自各个专业领域的强大而整洁的才华横溢的开发人员团队,从而催生出了一系列获奖的应用程序。 从提供满足企业需求的定制软件到为各种消费者细分市场构建尖端的移动应用程序,ZCO取得了许多成功案例和行业基准。 高度定制化和针对特定业务的开发重点以及面向结果的方法是该开发公司的两个强大特征。 ZCO的一些关键专业包括针对所有平台(包括iOS,Android,Windows Phone和Windows Desktop)的移动应用程序开发。 网站: https : //www.zco.com/ 3. Appster 这家总部位于澳大利亚的开发公司被称为全球五大开发公司之一。 凭借诸如“澳大利亚最具创新力的公司”之类的奖项,Appster多年来经历了许多自豪的时刻,除了享受稳定的业务增长并触及许多里程碑。 Appster拥有400多个星光熠熠的开发团队和许多荣誉,在任何顶级应用程序开发公司列表中,Appster都是不二之选。 Appster拥有稳固的产品组合,可为各个领域的企业和品牌提供最先进,最成功的移动应用程序。 Appster拥有数百个成功的项目,并拥有一支由众多才华横溢的开发人员组成的团队,拥有丰富的经验,人才库和远见卓识,能够提供出色的移动解决方案。 该公司的一些关键专业包括针对iOS,Android和Windows的跨平台应用程序开发,Web应用程序,企业应用程序和游戏应用程序。 网站: http : //www.appsterhq.com 4.应用大师 这家位于德克萨斯州的美国公司是混合应用程序中最有前途的开发公司之一。 App Maisters在多个大洲拥有数百个并发项目,并拥有全球客户,是跨平台应用程序开发中值得信赖的公司之一。 该公司通过许多成功的项目不断发展壮大,满意的客户遍布世界各地。 App Maisters拥有十年的经验,拥有一支由许多知名开发人员组成的精巧团队,能够兑现其诺言,提供了覆盖和覆盖成功案例的应用程序。 该公司的一些关键专业包括iOS,Android和Windows应用程序开发,企业应用程序开发,云解决方案,网页设计,IOT应用程序开发以及大数据分析和商业智能。 网站: http : //www.appmaisters.com/ […]

行动应用程式品质

创业理念 在初创企业中,突然产生了一些想法,每个公司都必须将其应用到: 快点,快点失败! 尽快发布产品,以便我们获得客户反馈! 如果您考虑大型公司以前所做的一切,那么所有这些都是好主意。 每隔几个月发布具有许多功能的应用程序。 该应用程序必须执行所有操作,如果缺少需求列表中的某些部分,则发布会延迟。 顺便说一句,该列表包含1474或更多要求。 因此,比以前的事实上的标准更快地发布是一个好主意。 不幸的是,大多数时候人们忽视了全局,导致了维护的噩梦。 我见过带有8000多行Objective-C ++代码的MVC(大型视图控制器)。 添加功能不需要花几天时间,而是要花几周甚至几个月的时间,开发速度就停止了。 这是技术债务的结果,由于专注于发布和截止日期而积累了债务。 总之,质量再次出现在公司眼中。 他们开始要求制定不合理的规则(例如,我以前的公司之一将该规则落实到位,“ 70%的新代码需要进行单元测试”)。 有了这种违反逻辑的规则,开发人员往往宁愿忽略它们并按原样进行。 这没有任何改善。 我们如何改变它? 为了追求更好,开发人员爬网。 更好的程序员,更好的架构师,任何更好的东西。 他们经常偶然发现每个超级/ rockstar-ninja-程序员都应该知道的有关应用程序体系结构,编程模式,新范例或其他特定主题的帖子,但他们很少能找到有关质量的信息。 是的,了解(并应用)最新的开发趋势绝对是一件非常棒的事情,但这是否可以帮助您在一两年内维护该应用程序? 最初开发应用程序后会发生什么? 谁来照顾它? 你如何释放它? 您修复哪个错误? 在维护应用程序的同时,您还能如何开发新功能? 所有这些问题都不是开发人员通常关注的部分,但它们仍然是他的日常生活。 越早接受它越好。 随着您开始提供更高的质量,它对您的公司或客户也越好。 由于您正在阅读本文,因此您可能遇到与我一样的问题。 这个博客 该博客的目的是回答以上问题,甚至更多。 由于遵循结构化的方式要比仅几个松散耦合的帖子更容易,因此我们将创建一个应用程序,并在每个新帖子中改善质量观念。 这将引导我们经历不同的阶段,需求和想法,所有这些(希望)将帮助您减少捷径,并可能在非功能性需求上花费更多时间。 如果您像我一样,就讨厌编写演示应用程序了。 因此,该应用程序将没有直接代码。 相反,我们着眼于创造最好的特定要求和采取的步骤。 由于此应用程序需要一些实用性,因此我们收集一些要求。 它需要: 有一个用户界面(没有一个,应用程序的用途是什么?) 从后端请求数据 从后端解析数据 显示来自后端的数据 将数据发送到后端 与用户互动 无需全面的手动回归测试即可发布 在短时间内发布(在Scrum中,我们每2周讨论一次新发布,具体取决于冲刺周期) 哦,别忘了: 一个团队(至少2个)正在为此工作 这是我们目前的清单。 当然,如果您有更多要求,请发表评论。 […]

立即开始使用Helper类! – 第1部分

。 。 。 专业人士提示: 如果要更改ViewController标题文本的字体,颜色等,则可以使用此类覆盖所有nav控制器的标题文本属性。 。 。 首先,我们需要在Helper类中添加titleTextAttribute常量。 在类中代码块的末尾添加以下行。 现在,只要您需要此属性来设置导航栏和标题的样式,只需为视图的导航控制器创建一个UINavigationController类,然后在super.viewDidLoad()之后的viewDidLoad()内部添加以下行, 十分简单。 现在结束了,我们不应该只在这里分配变量和常量。 我们还可以编写函数-我们需要全局使用的函数,以避免全部重写它们。 继续阅读后续文章,了解如何利用全局功能! 现在就这样。 在这里查看我的其他文章。

迅速关闭

大多数现代语言都有闭包,或者它们可以称为匿名函数。 在Swift中,我们将它们视为闭包,并且在整个使用过程中,它们大量用于回调。 先决条件: 功能 种类 动机 我们可以按照Apple的解释逐步进行:“ …可以传递并在您的代码中使用的自包含功能块”。 在Swift中,关闭是非常基本的构建基块,需要认真对待。 自包含的功能块 这意味着我们可以使用闭包来编写执行特定任务的代码。 可以在您的代码中传递和使用 我们可以传递这些闭包,存储它们,将参数传递给函数,并像对待Swift中的任何其他对象一样对待它们。 在Swift中将闭包作为完成处理程序传递,并将其用于事件处理和回调是很常见的。 基本关闭 将其分配给变量 我们采用我们认为是函数的方式,并将其分配给变量。 此生命周期意味着执行mathForOneAndTwo之后,内存为 转义闭包-在将传递给函数的函数重传并超过其传递给函数的寿命之后调用的闭包。 对于分派队列上的异步调用,回调或调度任务很有用。 因此,在我们的示例中(为了使转义的闭包有意义-无需使用网络调用),我将闭包包装在asyncAfter()中,以便在两秒钟的延迟后执行。 编译器要求将@escaping添加到mathForOneAndTwo中(感谢Swift!) 仅在关闭完成执行后才释放内存。 自动关闭 您可以将传递给函数的代码强制为闭包。 尽管这会使代码更难以理解。 例如,我们可以传递以下操作,该操作是一个输出两个数字之和的函数: 可以在这里用自动关闭功能代替 顺便说一句,fatalError也使用自动关闭,可以通过查看XCode中fatalError的类型签名来进行验证。 资源资源 https://docs.swift.org/swift-book/LanguageGuide/Closures.html

SwiftCoders三月聚会

嗨,iOS开发人员, 感谢您昨日在亚美尼亚 Picsart参加SwiftCoders亚美尼亚的聚会。 这是我们共同提出的几点。 1.下次我们在2019年3月6日开会。 详细信息将很快提供。 得到你的票 2.让我们通过以下渠道继续关注 * Facebook页面上的新闻和更新 https://www.facebook.com/swiftcoders/ *直接通信的电报频道 https://t.me/SwiftCoders *闲聊和小组讨论 https://swiftcodersinvite.herokuapp.com/ ( 登录后加入#yerevan频道) 3.众所周知,我们已经创建了一个开源GitHub项目,以使我们能够一起编码并在聚会期间集体讨论解决方案。 https://github.com/SwiftCoders亚美尼亚 4.这是昨天的演讲 * Vahagn Gevorgyan的 “面向协议的编程” https://goo.gl/UMkq5f * Ghukas Stepanyan撰写的 “使用您的Linkedin个人资料进行个人品牌 推广” https://goo.gl/9btMCA 5.请给聚会打分 https://mogoni.typeform.com/to/Zs1zfX 6.如果您错过了下载LinkedIn的个人资料图片,请点击链接 https://goo.gl/Comj4v ** 什么是新的 我们的下一个活动是2019年3月6日。 https://swiftcoders.am ================================= SwiftCoders亚美尼亚是https://swiftcoders.org计划的一部分。 **(https://www.facebook.com/swiftcoders/) **(https://github.com/SwiftCodersArmenia/) **(https://www.swiftcoders.am/) **(https://www.swiftcoders.org/)

搬上海

MOVE Shanghai可以让您从一个地方访问该地区所有高级健身场所。 有了它的帮助,您可以预订各种活动,例如游泳,瑜伽,舞蹈课等等。 无论您喜欢哪种生态系统,MOVE Shanghai均可在iOS,Android和Web上使用,旨在提供相同的体验。 在本文中,我们将与您分享在实施过程中面临的挑战以及我们如何解决这些挑战。 挑战 MOVE上海项目的工作包括许多挑战。 最初,任务是克隆用Perl编写的现有MOVE GB应用程序。 但是,对代码进行更深入的研究表明,处理另一种语言是我们最不关心的问题。 事实证明,该应用程序根本不符合我们的技术堆栈。 毫不奇怪,改进或以任何方式改进现有应用程序的想法被认为是一揽子案例。 也就是说,我们得出的结论是,完全从头开始制作应用程序将是最佳选择。 当另一个不愉快的发现突然出现时,我们几乎没有开始进行移动应用程序开发。 对于那些不知道的人,在中国,有一种叫做“大防火墙”的东西可以阻止任何可能有害或恶意的东西。 这导致我们习惯的许多服务在大多数区域都无法访问而绝对没有问题。 而且,Internet连接可能真的变慢,特别是如果您不在该国的领土范围内。 毋庸置疑,包含MOVE Shanghai应用程序核心功能的通知(Twilio)和付款处理服务(Stripe / Braintree)要么几乎不可用,要么根本无法使用。 因此,我们必须找到他们的替代方案。 在开发应用程序时,我们从客户那里收到了新的要求。 要引入的最大变化之一是与第三方服务(例如mindbodyonline.com)的应用程序集成。 挑战是由于绝大多数服务是以相当复杂的方式实现的。 换句话说,它们根本不是为此类操纵而设计的。 解 我们要做的第一件事是从Perl编写的现有应用程序中借用了一些逻辑。 在将MoveShanghai与第三方服务(例如mindbody.com)集成时使用了其中的一部分。 为了节省时间来解决更大的挑战,我们决定采用数据库结构,从而能够充分利用现有的应用程序。 完成拆卸部分后,我们开始构建应用程序。 要求之一是必须同时发布Android(适用于客户端的应用程序)和iOS版本。 在找到正确的方法并解决了管理问题之后,我们的团队得以在规定的时间内交付应用程序。 多亏了我们开发的统一API,无论您要使用哪种移动设备,它们都可以正常工作。 说到“伟大的防火墙”,这是一个相当大的问题。 作为Stripe的替代品,我们选择了Paymentwall,要研究和使用它仍然有些棘手,但仍可集成。 由于Twilio在中国的运作非常不稳定,因此我们不得不寻找另一种服务来实现通知功能。 为此目的最合适的选择是称为“云片”的中国服务。 借助一些额外的逻辑,该应用程序现在可以通过YunPian将SMS发送到中国电话号码,而通过Twilio通知外部号码。 话虽如此,让我们快速浏览一下MOVE Shanghai的移动版本的流程。 登录和注册过程都非常简单。 为了节省用户的时间和精力,我们通过短信实施了确认。 之后,MOVE会向您显示一个屏幕,您可以在其中搜索所需的活动。 该应用程序还带有非常方便且功能强大的搜索。 借助其帮助,您可以按时间,日期,相关性和类型搜索活动。 找到适合您的喜好和时间表的活动后,您可以立即预订。 预订流程如下所示: 由于该应用程序主要针对中国观众,因此客户的要求之一就是与微信进行集成。 对于不熟悉这项服务的人来说,这是一个非常受欢迎的移动应用程序,可与近10亿用户(其中​​大部分来自中国)进行通信。 在过去的几年中,微信已经从一个简单的聊天应用程序发展成为具有众多功能的整个生态系统,其中包括可以直接从该应用程序付费的功能。 MOVE Shanghai也非常适合在移动浏览器中显示(并且运行速度与本地应用程序一样快)。 哦,有没有提到我们实现了美观的聊天,以便用户可以游泳/拳击/等。 […]

Gotta Go Fast:在iOS中构建速度。 第2部分

有时,您会发现自己的应用无法正常运行。 因此,这里提供了一些您可以使用的工具以及可以使事情变得更好的最佳实践。 这是本文的第二部分,基于2017年国际移动开发者大会MBLT DEV的Fyusion的iOS工程师,RayWenderlich.com上的iOS开发教程作者Luke Parham的主题演讲。 在这里您可以找到第一部分。 在这里观看完整的演讲: 这是一个时间分析器,其顶部有一个帧速率表。 底部是调试选项中最重要的部分。 我们将介绍两个最重要和最容易解决的问题。 第一个是颜色混合层。 这是一个非常容易解决的问题。 这使我们进入了表演警察的第一部分。 基本上,许多应用程序都存在问题:甚至iMessage(心爱的Apple应用程序)也做了很多不太出色的事情。 在这里,我们看到有很多红色: 红色表示您的标签带有白色背景。 然后,它们位于另一个白色背景之上,并且由于某种原因,它们未设置为不透明。 因此,搅拌器将这些颜色(白色和白色)混合在一起,从而得到白色。 对于具有红色的每个像素,它都会进行额外的计算而没有任何好处,但是背景仍然会变为白色。 为避免这种情况,只要它们在同一颜色上具有相同的颜色,就可以使它们尽可能不透明。 如果子视图具有相同的背景色,则不需要混合。 您所要做的就是将图层的不透明度设置为1,然后确保设置了背景色。 如果您的背景颜色是透明的,则它永远不会是不透明的。 如果打开此选项,则屏幕外渲染的元素将以黄色显示。 关于Core Animation工具的好处是您可以看到其他应用程序。 您可以打开这些选项,然后转到系统中的任何应用程序,然后可以查看它们在做什么错。 在这种情况下,Instagram顶部会显示这些小气泡,向您展示人们的故事。 如您所见,它们都是黄色的。 在iPhone 5上,它们的速度非常慢。 这是因为屏幕外渲染比alpha混合差得多。 它使GPU停顿。 最终必须在GPU和CPU之间来回进行额外的计算,因此您将获得大多数情况下不必要的额外停顿。 下一条规则:不要使用转角半径属性。 如果您有一个视图并设置了view.layer.сornerRadius,则始终会引入屏幕外渲染。 相反,您可以使用贝塞尔曲线路径和早期的同类CGBitmap内容。 在这种情况下,为UIGraphics上下文。 此函数与UIImage一起使用,它具有一定的大小,并根据该大小进行圆角处理,并使用贝塞尔曲线路径进行剪切。 然后,我们裁剪图像并从UIImage上下文返回它。 因此,这将返回一个预先舍入的图像,而不是舍入该图像所在的视图。 最后一个例子。 这是Twitter,这是此动画运行的实时视图。 它应该打开并向您显示信息,但是所有这些文本和内容均已在屏幕外呈现,因此将动画放慢了速度。 这是我在App Store上的应用程序中发现的性能最低的东西。 那么这是怎么发生的呢? 导致这种情况发生的一件事是CALayer的shouldRasterize属性。 这是图层上的一个选项,允许您缓存已渲染的纹理。 有很多奇怪的规则。 就像如果未在一定毫秒内使用它一样,它将离开缓存。 然后,如果它离开缓存,它将在每帧上进行屏幕外渲染。 拥有它可能带来的好处并不真正值得。 而且很难检查它是否真的使您受益。 如果可以,请避免屏幕外渲染和Alpha混合。 […]

Swift中的词汇作用域

在经历LISP中的词汇作用域概念时; 我想知道Swift是否提供这种支持。 确实如此。 好极了… 我使用了一个简单的函数- 数字的平方根来尝试词法作用域。 我使用牛顿法计算平方根。 以下是第一个版本。 sqRt是一个递归函数。 当先前步骤中的猜测足够好时,代码将终止。 其他猜测得到改善,并再次调用函数。 但是然后,在squareRoot函数范围之外,诸如goodEnough和perfectGuess之类的函数没有任何意义。 幸运的是,在Swift中, 函数是一等公民 。 我们可以像声明变量一样声明函数。 这使我进入了sqRt函数的第二个版本。 诸如validateGuess和goodEnough之类的函数在sqRt的函数参数上运行 。 由于这些函数已经在sqRt函数的范围内, 因此可以认为将参数传递给这些内部函数是多余的。 确实是正确的,这就是用词法作用域解决的 。 封闭功能的参数/变量在这些功能的范围内。 具有LexicalScoping的语言具有以下特征: 1.可以在其他功能中定义功能(和过程等) 2.这些内部函数可以访问封闭范围中定义的局部变量。 3.这些内部功能还可以访问封闭功能的功能参数。 通过利用词法作用域支持, sqRt函数的版本3如下。 嘿,等等! 为什么我们不能进一步利用Swift的支持来简化代码。 Square , goodEnough和ImprovementGuess看起来像变量。 因此,让我们简化一下。 我希望您了解Swift中的词法作用域支持。 让我知道你对此的想法。 如果您喜欢这篇文章,请分享/推荐。 该博客还发布在我的个人网站https://swapnilsankla.me

了解Swift闭包

在上一篇文章中,我们讨论了面向协议的编程及其为我们带来的优势。 今天,我们看一下Swift闭包,并问我们自己如何利用它们的简短语法来使我们的代码更好。 什么是封包? 闭包是可以独立传递的功能块,可以在代码中传递和使用。 Swift中的闭包类似于C和Objective-C中的块,以及其他编程语言中的lambda。 上面的报价直接来自《 Swift语言指南》,尽管看起来似乎什么也没解释,但实际上是对闭包的非常准确的描述。 让我们看看当听到“ closure”一词时,大多数人可能会想到什么,即尾随闭包。 URLSession.shared.dataTask(with:url){(data,response,error)in //处理您从请求中获得的任何很棒的东西 } 这是一种很常见的尾随闭包。 在这种情况下,我们使用Foundation Framework中的函数对所需的某些数据进行异步请求。 然后,我们使用尾随闭包来指定我们希望在数据可用时要对其执行的操作。 对于不太熟悉闭包及其语法的开发人员,似乎我们只是无处不在地以某种方式提取了三个参数,它们神奇地起作用了。 为了了解为什么要指定这些参数名称,并使我们更容易使用尾随闭包来声明自己的函数,我们将看一下.dataTask(with:completionHandler:)函数的虚拟实现。 func dataTask(带有url:URL,completionHandler :(数据?,URLResponse ?、错误?)->无效){ //完成工作以获取我们请求的数据 让数据:数据? = {…} //获取负载响应 让响应:URLResponse? = {…} //如果未获取任何数据,则会产生错误 让错误:错误? = {…} //我们获得了所需的所有信息, //让我们将其发送给我们的闭包进行最终处理 completeHandler(数据,响应,错误) } 即使这是在此功能的实际实现中发生的情况的非常粗略的概述,它仍将准确地描述我们感兴趣的行为,即闭包如何在方法工作流中合并和使用。 看一下方法声明,在名为completionHandler的参数上,注意类型声明: (Data?, URLResponse?, Error?) -> Void 这告诉编译器,我们的.dataTask方法希望传递另一个函数作为参数。 它还希望该函数将三个非常特定的类型作为其自变量。 这些是我们在尾随闭包中命名的参数。 基本上,我们的程序告诉URLSession获取一些数据,然后指定将其删除的位置,以便我们可以继续进行更新。 DispatchQueue关闭 我们钟爱的DispatchQueue类还带有一些将闭包作为参数的函数。 看一下这个.async(execute:)调用: DispatchQueue.main.async { //执行更新等 […]