Tag: ios

为什么要制作电视应用程序?

“电视的未来就是应用”。 这是蒂姆·库克(Tim Cook)在9月的苹果主题演讲和发布Apple TV v4时大胆提出的主张。 这种说法可以被夸大为夸大其词。 精心设计的夸张,旨在促进苹果自己的野心。 即使这是真的,这也不是苹果第一次成功地实现自我实现的预言。 但是,这对您意味着什么? 您的组织需要电视应用程序吗? 您最初的反应很可能是; “不”或“很好,但是,不”。 “当然,除非我们主要是视频驱动的,那有什么意义? 我们不是Vevo,Netflix或HBO,那为什么要打扰? 好吧,让我们来看看投资电视应用值得的几个原因。 1.电视正在重新成为主要的家庭娱乐设备 去年年底,《时代》杂志报道说,美国人平均每天看电视的时间减少了12分钟。 他们推测缓慢而剧烈的“电视死亡”和诸如苹果电视和Netflix之类的引发因素是一个重要因素,目前有260万美国家庭被归类为“仅宽带”。 但是,不是像Amazon Fire TV,Android TV和Apple TV这样的服务会杀死电视,也许它们毕竟是救星吗? 当然,传统的电视频道和节目制作仍然受到重大威胁,但是如今,没有电视作为每个客厅的中心的世界再次显得不可思议。 现在,电视收视率一直在缓慢下降,而互联网活动却在稳步增长,这些现在(最终)合并为不可抗拒的娱乐力量。 ……现在,没有电视作为每个客厅的中心的世界再次显得不可思议…… 2.物联网 当然,另一个新兴的数字趋势是“物联网”。 目前,诸如亚马逊回声之类的设备推动了家庭和办公对象之间连接性的提高,但是,如果您的电视成为明亮,喜人的指挥中心,即家庭操作中心,该怎么办? 我们所有人都可以拥有自己的白宫情况室-我们的沙发(带有筹码和蘸酱)放在我们的数字通信枢纽前面。 从这里我们不仅可以娱乐,而且可以控制和管理家庭活动和家庭物品。 因此,您的电视不仅可以重新获得作为主要娱乐平台的地位,而且还可以作为一种至关重要的生活管理工具而崭露头角。 不服气吗? 好吧,也许新的启用Siri的Apple TV控制器或Amazon Fire TV的启用语音的遥控器会让您信服。 不用再费力地摇动电池,也不必费劲地按下遥控器上的褪色按钮,只需执行几个简单的命令,您便可以掌握天气预报,足球队的名单或最新的股价。 3.曲线的前方 现在,以上两点似乎有些虚构,但这也许是现在投资应用程序的原因,而不是等待两年(当应用程序市场可能达到饱和点时)的原因。 考虑一下-在撰写本文时,Google Play商店中只有31个TV应用程序,而TVOS应用程序商店尚未启动,但其中将包含数百个应用程序(最多)。 与此相比, Google Play商店中有150万个智能手机应用程序 。 脱颖而出并领先于游戏的机会几乎不需要进一步论证。 已经有年轻,快速发展的公司加入了电视应用程序潮流: Airbnb是目前在TVOS应用商店中宣布的各种游戏和视频应用的组合。 除了少数可供Google TV使用的视频,音乐和娱乐应用程序之外,还有一个简单的“食谱手册”应用程序。 这些创新者和早期采用者仅仅是在跳鲨鱼吗?还是暗示电视应用程序已成为许多(如果不是大多数)公司和组织的领先营销产品? …已经有年轻,快速发展的公司加入了电视应用程序潮流… 4.游戏 显然,游戏是苹果TVOS计划的重要组成部分。 […]

iOS 11.3越狱更新

苹果已经发布了iOS 11.3,所有人都可以将其下载到他们的设备上。 这是一个相当大的更新,其中包含许多错误修复,安全修复,改进和增强,它可能是iOS 11的最后一个重大更新。当然,该版本导致人们担心生产可能会再次延迟。越狱,并且考虑到已经有一段时间没有任何事实了,这些恐惧是可以理解的。 是否会有iOS 11.3越狱? iOS 11.3是一个非常新的版本,开发人员只会开始研究它。 尽管他们已经测试过Beta版本,但最终版本通常包含不同的内容,他们发现的任何漏洞很可能已得到修补。 我们都知道,越狱开发人员不喜欢谈论他们的发现,他们当然也不愿意为固件的Beta版本产生越狱,仅因为这是对漏洞的浪费,几乎可以肯定会修补此漏洞。最终版本发布的时间。 当然,这可能意味着目前正在准备对iOS 11.3进行全面越狱,但是我们将在一段时间内不知道这一点。 我们确实知道,亚伯拉罕·马斯里(Abraham Masri)在iOS 11.3的Beta版中发现了一个“ 0天”漏洞,这是越狱圈子中的一个知名名称。 但是,他说,就目前而言,它并不是有用的利用,但与其他人结合并在正确的开发人员的手中,它可能会变成有用的东西。 我们所拥有的是某些用户可以安装的iOS 11.3越狱,但我们不能保证所有用户都能成功。 链接的文章中提供了完整的详细信息以及有关如何下载它的教程。 未来 由于iOS 10是最后一个可越狱的iOS版本,而我们即将接近iOS 11的尾声,我们已经没有足够的时间为此固件进行新的越狱了。 一旦苹果将注意力转移到iOS 12上,开发人员将有更多的时间找到值得使用的东西,而不必太担心它会被快速修补。 但是,现在,我们不应该期望看到每个人都可以使用一段时间的iOS 11.3越狱,而且很可能是,鉴于过去的两次越狱,只能构建的实用程序将受到限制。 有关更多详细信息和更新,您可以在Facebook上关注我们。

首席执行官罗永浩表示,Smartisan的新产品将使iOS和Windows系统蒙羞

在中国劳动节周末的第一天,Smartisan Technology Co.,Ltd.的创始人兼首席执行官罗永浩透露了更多产品信息,因为该产品将于5月15日上市。 还请参见: 全新Smartisan坚果3盒装 从罗永浩4月29日对网民查询的公开回复中可以看出,他声称该新产品将具有比iOS或Windows更好的操作系统,并且起价将高于3000元人民币(474美元)。 迄今为止,还没有这种所谓的革命性产品的清晰图像。 罗永浩正式否认了互联网上的许多谣言。 罗进一步声称,新产品将在设计和性能上达到新的高度。 如果一切按计划进行,那么这款新手机将成为Smartisan Technology生产的最先进的手机。 它将配备高通Snapdragon 845处理器,后置双摄像头,并且RAM起始容量为4GB。 目前尚不清楚它是否支持屏幕上的指纹识别。 至于照相功能,Luo自信地说新产品将在智能手机行业中处于领先地位。 作为Android手机最有特色的品牌之一,Smartisan的操作系统一直受到其用户的好评。 它的竞争对手经常将几种功能作为典范,特别是“大爆炸”和“一步”。 罗说,这次,新产品将使iOS和Windows系统蒙羞。 但是,由于Android系统的固有局限性,目前还没有智能手机制造商敢于提出这样的要求。 同时,作为PC领导者的Windows系统被手机操作系统击败了吗? 谁知道罗罗这次招了什么样的把戏。 关于罗与网民之间频繁的友好或辩论性互动,有人认为罗比活着的时候甚至比史蒂夫·乔布斯更加自大。 作为回应,罗说,乔布斯的重要性远不止于此,因为乔布斯曾经访问竞争对手的办公室只是为了展示他的中指,而他大部分时间只是在取笑。 此外,Luo透露这款手机的价格将在3,000至15,000元($ 474 – $ 2,368)之间。 就价格而言,这将打破之前所有Smartisan手机的记录。 作为一家手机公司的负责人,罗永浩的行为有时似乎是不合适的。 但是,这种坦率的态度可能正是为什么这么多人喜欢他的原因。 希望除了吹牛之外,罗永浩还将真正生产出符合所有人期望的革命性产品。

Swift 3.0类说明—类型方法,单例,DatePicker,枚举,错误处理

主讲人:魏炜 实例方法(实例方法)与类型方法(类型别方法) 类型Mehod与Object-C的Class方法类似 实例方法是被型别的某个实例呼叫的方法 型别方法是定义型别本身呼叫的方法 型别方法的写法: 属性前加关键字static 函式前加关键字class 参考:方法 单例模式 单例模式确保每个指定的类别只存在一个实例对象,并且可以双击访问那个实例。 单例的写法 一样属性前加关键字static&函式前加关键字class init(){}前加private:只有自己可以初始化自己 参考:Singleton 日期 日期←> DateFormatter←>字符串 可以通过DateFormatter转换Date和String .date现在的时间 DateFormatter()生出DateFormatter(.date或.string转换日期和字符串) .datastyle调整显示时间格式 .dataFormat调整时间格式 制作倒数计时器 类别:计时器 用Timer.scheduledTimer(timeInterval:1.0,target:self,选择器:#selector(ViewController.countdown),userInfo:nil,重复:true)实现,每隔一秒,实作countdown github的:git@github.com:dan12411 / HelloDatePicker.git Enum(枚举相同类型的选项) 初衷:避免拼字错误 可加上相关值(关联值) 可加上方法 可加上原始值(记要给型别) 常常搭配Switch使用,系统已知副本,最后不用写default 错误处理(关键字throws,try和catch) 用Enum定义错误(服从错误协议) 加上关键字“ throws”标明错误处理的程序代码 加上关键字“ try”呼叫方法 改写函式内的程式码,例如,用卫抓抓出错误 guard与if..else不同在于,可以把通过条件后的动作,写在大括弧{}外 用do&catch输出错误消息

iOS 11中具有自动布局的程序化UIScrollview

我已经仔细阅读了Apple在UIScrollView上的文档,尤其是它如何与auto layout ,我更喜欢编程路径。 我将演示UIScrollViews的“混合”和“纯”自动布局方法。 您是否知道UIScrollView类通过更改其边界的原点来滚动其内容? 酷吧! 滚动视图的子视图上的约束必须导致要填充的大小,然后将其解释为滚动视图的内容大小。 (这不应与用于“自动布局”的“ internalContentSize”方法混淆。)要使用“自动布局”来调整滚动视图的框架大小,必须明确规定滚动视图的宽度和高度,或者必须将滚动视图的边缘设为绑定到其子树之外的视图。请注意,可以通过在视图和滚动视图的子树外部的视图(例如,滚动)之间创建约束,使滚动视图的子视图看起来漂浮(而不滚动)在其他滚动内容上视图的超级视图。 这是两个如何配置滚动​​视图的示例,首先是混合方法,然后是纯方法。 混合方式 使用滚动视图外部的约束来确定滚动视图的位置和大小,即,translatesAutoresizingMaskIntoConstraints属性设置为NO。 为滚动视图创建一个普通的UIView内容视图,该视图将是您希望内容具有的大小。 使它成为滚动视图的子视图,但让它继续将自动调整大小蒙版转换为约束: 清单1混合方法代码清单 -(void) viewDidLoad { UIView * contentView; contentView = [[UIView alloc] initWithFrame:CGRectMake(0,0,contentWidth,contentHeight)]; [scrollView addSubview:contentView]; //请勿更改contentView的translationsAutoresizingMaskIntoConstraints,默认情况下为YES; //设置滚动视图的内容大小以匹配内容视图的大小: [scrollView setContentSize:CGSizeMake(contentWidth,contentHeight)]; / *其余代码在这里… * / } 创建要放入内容视图中的视图并配置其约束,以便将其放置在内容视图中。 另外,您可以创建一个视图子树以进入滚动视图,设置约束,然后调用systemLayoutSizeFittingSize:方法(带有UILayoutFittingCompressedSize选项)以找到要用于内容视图的大小以及该视图的contentSize属性。滚动视图。 纯自动布局方法 要使用纯自动布局方法,请执行以下操作: 在所有涉及的视图上将translatesAutoresizingMaskIntoConstraints设置为NO。 使用滚动视图外部的约束来定位和调整滚动视图的大小。 使用约束在滚动视图中布置子视图,确保约束与滚动视图的所有四个边缘相关联,并且不依赖于滚动视图来获取其大小。 一个简单的示例是大型图像视图,该视图具有从图像大小得出的固有内容大小。 在视图控制器的viewDidLoad方法中,您将包含类似于以下清单所示代码的代码: 清单2纯自动布局方法代码清单 -(void) viewDidLoad { UIScrollView * scrollView; UIImageView * […]

简介:Mac的快捷键

通过蓝牙连接到Mac的实际无线按钮,其大小不比键盘上的键大很多。 无需加密狗。 今天,我们很自豪地发布了Mac版Flic App。 这非常简单: 我们为Mac提供了更多按钮。 Good’ol最喜欢的按钮,但适合您的办公桌。 我们今天发布的Flic Mac App可通过两种方式用于创建快捷方式:将Flic按钮与Mac配对以快速执行您喜欢的功能 使用小部件可以从通知中心运行快捷方式,而无需Flic。 在这里下载。 如何使用它? 这是我们的想法: 主题演讲—使用Flic作为微型演示文稿答题器,而无需烦人的蓝牙加密狗 及时-使用Flics精美地报告在多个项目上花费的时间 Spotify-您知道播放/暂停功能按钮永远不会优先Spotify且TouchBar上不再存在吗? 那,但是无线和工作。 智能家居(Hue,LifX,Wink,Wemo)-在办公室中控制灯光和音乐,而不会打扰您的工作流程 IFTTT和Zapier可运行Web脚本或控制您的其他小工具。 宽松-让同事知道您有交易或要去吃午餐。 Internet请求—单击oa按钮发送REST命令。 我们的Beta测试人员想要这样做,因此我们添加了它: VLC —使用Mac作为媒体中心? Flic控制它。 ChromeCast-单击按钮即可流式传输预定义的内容。 您的孩子会喜欢它。 XCode —自动进行黑客攻击。 Web浏览器—单击以打开一个站点。 如果您错过某个功能,请在此处提出一个想法。 就像在iOS和Android的Flic应用中一样,您可以将多个Flic按钮连接到Mac。 每个Flic可以单独配置为在单击,双击并按住时执行多个命令。 在此设置中,我有一个绿色,白色和绿色的Flic(全部安装在我的外部屏幕上),一个用于控制办公室照明的小部件以及一个用于执行此操作的小部件。 访问Mac通知中心中的小部件。 如果您已经有了Flic,那就对您有好处! 新的Mac应用程序可在此处免费下载。 如果您还没有Flic,请在这里购买,或尝试不使用Flic的Mac应用中的小部件。 将我们的专业知识带入新平台 当我们在2013年发明智能按钮时,我们想创建一种工具来节省人们的时间并降低技术的复杂性。 我们考虑了几个用例。 将Flic放在家里,以控制灯光和音乐。 穿Flic发送求救消息或告诉RunKeeper开始跟踪锻炼情况。 给奶奶按钮,让您更轻松地打电话。 从远处拍摄智能手机照片。 我们提出了数百种应用程序和可通过按钮进行控制的事物,并构建了有史以来最广泛的应用程序之一,它原生存在于iOS和Android上,几乎实现了客户希望按钮所需要的所有功能。 现在,我们将所有内容连同FlicLib一起带到Mac上-可能是那里最好的蓝牙低功耗库。 希望很快会添加许多新功能,如果您有任何疑问,请随时与我们联系。 爱,弗利奇团队

核心数据基础

决定任何iOS应用程序性能的一个重要因素是其对搜索查询的响应能力。 它响应越快,性能越好。 成功的搜索结果取决于用于存储应用程序数据的数据库的效率。 您可以将Core Data视为在iOS,macOS,tvOS和watchOS应用程序中保存,跟踪,修改和过滤数据的框架,但是Core Data不是数据库。 核心数据使用SQLite作为持久存储,但框架本身不是数据库。 核心数据的功能远不止数据库,例如管理对象图,跟踪数据的变化以及更多其他事情。 核心数据可帮助您构建代表应用程序状态的应用程序模型层。 核心数据可以将模型对象的状态持久保存到磁盘。 核心数据关注对象,而不是传统的表驱动关系数据库方法。 在存储数据时,实际上是在存储对象的内容,其中对象由继承NSManagedObject类的Objective-C / Swift类表示。 一个典型的应用程序将几个对象一起使用,形成一个对象图。 核心数据和SQLite之间的区别 SQLite本身就是一个数据库,就像我们拥有MS SQL Server 。 但是CoreData是类似于ORM (对象关系模型)的框架,该框架在database和UI之间创建一个层。 它speeds-up交互process ,因为我们不必write queries ,只需使用ORM并让ORM处理后端即可。 核心数据将对象图保存在内存中。 这意味着,只有将记录加载到内存中后,它才能对记录进行操作。 这与在数据库上执行SQL查询有很大不同。 如果要删除数千条记录,Core Data首先需要将每条记录加载到内存中。 另一个限制是核心数据的线程模型。 该框架期望在单个线程上运行。 核心数据具有3个关键对象: 托管对象上下文 托管对象模型 持久性商店协调员 永久存储(存储) 设置永久容器 使用NSPersistentContainer设置核心数据栈 在上一教程中,您了解了Core Data堆栈和涉及的类。 在本教程中,我们将学习…… cocoacasts.com 动手使用Xcode piyush23dez / Swift4_CoreData_Demo Swift 4中的核心数据基础。通过在 github.com 上创建一个帐户,为piyush23dez / Swift4_CoreData_Demo开发做出了贡献。 核心数据中的实体关系 […]

Mustachio先生可在iOS上下载!

最初于 2016年10月15日 发布在 shobhitsamaria.com 上。 Mustachio先生已到达iOS App商店! 当游戏最终在App Store上发布时,您会获得令人难以置信的感觉! 该游戏已在商店中发布,并且在第一天就自己播放了1500多个网格。 这给了我极大的鼓舞和相信,这是朝着正确方向迈出的一步。 但是这项工作还远远没有结束,我真的很希望听到社区中有关如何进一步改进游戏的信息。 我正在进行一些更新,但是来自玩家的实际反馈至关重要。 我希望大家尝试游戏并提供评论 。 Mustachio先生现在也在ProductHunt上 。 如果您喜欢这款游戏并觉得值得,那就给它一个赞 ! ‘先生。 《 Mustachio》的核心是一个小型而简单的游戏。 我刚刚使用了基本的加法减法概念,将它们放在网格中,以几种颜色抛出,并以某种方式设法将其与胡须😀:D关联起来。 希望它是一个有趣且具有挑战性的游戏。 它既可以用于教育目的,也可以用于脑部训练 。 尽管年轻人可能会更喜欢它,但游戏确实提供了4种不同的难度级别 ,因此各个年龄段的人都可以享受它! 当前,似乎有更多的人正在使用更简单的模式。 我希望更多的人能够在困难难度级别接受挑战the 我整理了一个小的Presskit ,可在网站上找到。 通过此链接可以随时与我联系 。 或直接发送电子邮件至contact@shobhitsamaria.com。 或者,您可以在Twitter上打我- @samzgamz 。 期待您的回音。

从零到英雄:ImmobilienScout24 III上本地应用程序开发的故事

这是由Immobilienscout24的移动工程师Iyad Tamer Agha撰写的由三部分组成的本地应用程序开发@ immobilienscout24系列的最后一部分 。 随时阅读第1部分和第2部分,以获取对该主题的更多见解。 非技术措施 技术方法和工具对于确保移动应用程序的质量至关重要,尽管某些非技术性措施可能会导致检测软件错误的时间更早或根本没有发生。 结对编程:我们团队中已建立的一种实践称为结对编程,结对编程是指两个程序员共同工作以共同承担编程任务。 四眼原理导致对编写代码的更多控制和更少的错误。 通过成对工作,将对代码进行更详细的讨论,从而获得更可靠的软件。 协同工作还意味着可以在团队中更好地共享知识。 经验表明,结对编程的另一个副作用是,与单独工作的同事相比,串联工作的同事被打扰的可能性较小。 Mob编程:我们团队中也使用过的成对编程的扩展形式,即mob编程,其中不仅有两个开发人员来完成一项任务,而且整个团队也一起来处理代码。 当团队希望将新功能集成到应用程序中时,该方法被证明是成功的。 这将导致团队内部就该功能代码的共同确定原则达成共识。 代码审查:确保代码质量的另一种方法是代码审查。 实施一项新功能后,团队中的一个或多个开发人员将仔细检查代码。 目的是识别任何编程错误,并检查是否遵守了编写代码的内部准则。 这也鼓励团队内部的知识共享。 我们劳动的成果 首次发布仅一年后,我们的努力就获得了回报。 发布后的第一年,我们有849,000个应用程序下载,这个数字比上一年增加了15%。 我们的App Store评分从3星提高到4星,反映了用户满意度的提高。 这些年来,团队学到了很多东西。 关键课程是: 质量不仅仅是一个技术问题 :结对编程和代码审查之类的实践与对软件质量进行持续改进的技术措施同样重要。 用户永远是对的:如果用户决定应用程序应提供哪些功能,则提供错误内容的风险非常低。 少即是多:一个好的应用不是包含所有可能功能的应用。 删除很少使用的功能并改进常用功能是值得的。 四个星期的发布周期:尽管该应用适合每两周冲刺后发布新功能,但事实证明,最好是四个星期。 这为用户提供了足够的时间来评估新功能,并且团队有机会评估发布的成功并采取适当的措施。 我们的未来方向 大多数基于软件的公司开始与小型团队一起开发移动应用程序。 但是,随着时间的流逝,它们的使用变得如此广泛,以至于对于某些产品来说,大多数流量已经从移动应用程序中产生了,例如ImmobilienScout24就是这种情况。 由于移动应用程序的快速增长,负责移动开发的中央团队的模型已不再足够。 因此,我们的未来计划是在功能团队中扩展移动开发。 我们将iOS应用程序划分为单独的软件组件(模块),以便不同的团队可以彼此独立地开发自己的应用程序需求。 我们期望减少日益重要的移动应用程序的上市时间,因为速度是使自己在竞争中脱颖而出的关键因素。

实用的iOS应用架构

最近,我一直在阅读许多有关应用程序体系结构的文章。 有很多这样的文章,有很多不同的见解和解决方案。 开发人员分享他们的经验,优缺点可能会帮助我们决定在未来的项目中走哪条路,这是很好的。 我同意,有许多很好的架构,经过精心设计,并具有很好的关注点分离,可以解决其他方法的弊端。 但是,我也认为没有适合所有项目的应用程序架构。 我们如何衡量架构对项目是否有利? 好吧,我认为此评估中有几个相关参数。 评估架构 首先,应将应用程序的组件合理组织和分离。 他们不应该对其他组件的内部细节了解太多。 其次,正如鲍伯叔叔所说的那样,体系结构应该对项目的业务领域“尖叫”。 它是运输应用程序吗? 也许一个金融机构? 这是您从项目中获得的信息,只需以新手的身份快速浏览一下代码即可。 拥有不言而喻的架构对于维护和增长产品至关重要,尤其是在增加人员时。 然后,我们当然具有可伸缩性。 添加更多功能有多容易/难? 拥有一个优雅的解决方案可能会在将来为我们节省大量时间和金钱。 另一个参数是架构如何适合业务领域的要求。 它是繁重的数据驱动的应用程序吗? 它有很多需要用户输入的表格吗? 我们将要构建的应用程序的复杂性是什么? 是“ 5个屏幕”应用程序还是“ 50个屏幕”应用程序? 需要考虑的另一件事是开发团队的效率。 团队能否迅速了解新架构和可能不同的概念? 他们将能够独立处理功能而不会阻塞自己吗? 想象一下,只有一个故事板的架构,团队中的每个人都必须在用户界面上工作。 合并地狱等待发生。 测试是体系结构决策中的另一个重要元素。 我们要测试哪些关键组件? 在测试方面,我属于认为必须只测试值得测试的零件的小组。 我不喜欢做很多无用的测试,只是增加了代码覆盖率。 代码覆盖率只是一个欺骗性的统计信息。 您可能有90%的测试覆盖率,但是错过了关键部分。 在另一个极端,我看到了设计完美的项目,这些组件具有很好的隔离性,覆盖率为零。 在决定应用程序体系结构时,这使我想到了另一个关键部分-上下文。 项目的截止日期和预算是多少? 我们必须在质量(交货时间)上进行哪些权衡? 工程师需要更多时间以最优雅的方式设计和实施项目,而销售则需要更快的时间。 每个人都有自己的利益,我们必须意识到双方的平衡。 低质量的产品不会持续很长时间,但是市场上可能不再需要后期产品。 这就是为什么我认为在进行体系结构决策时,我们需要务实,中立和对全局的理解,而对我而言,这是做出此类决策的动力。 我们不需要偏向任何一种方法,也不应抛弃其他方法。 这只会限制我们的工具集,并在做出决策时缩小我们的可能性。 好老的MVC 我很困惑为什么这么多人只是放弃了Model-View-Controller模式。 他们代表Massive View Controllers。 它不适用于大型项目。 好吧,我已经看到(并从事过)非常大的项目,这些项目很好,干净且可维护,并且遵循Model-View-Controller。 我们有很多概念和模式可以帮助我们减小视图控制器的大小,例如委派,组合,依赖注入,协议,纯函数,服务/实用程序类,导航中心。 有了这些技术,测试也不是那么困难。 […]