Articles of ios

MVVM-1:一般性讨论

哦,我的……我们今天所拥有的……另一个关于MVVM的博客。 有什么新鲜事,否则它会讲同样无聊的事情。 是的,那么一件事是,我们的旅程将是漫长而冒险的,并且会围绕MVVM公园进行详细的游览。 我们不仅会学习基础知识,甚至还会尝试使用复杂UI的实时应用程序场景。 让我们继续进行MVVM冒险.. !!!! 听起来有点有趣;)。 是不是 MVVM或模型—视图— ViewModel是一种设计模式,旨在模块化您的代码并将其构建在测试驱动开发环境中。 当苹果公司的传统MVC设计模式使我们的控制器笨重且单元测试痛苦时,诸如MVVM,VIPER,MVP等不同的设计模式便应运而生。 MVVM非常方便,因为它在所有组件之间提供了松散耦合的机制,将您的视图,业务和数据逻辑隔离开来。 有很多教程和博客对此进行了解释,但是在这里,我们将遵循MVVM的基本规则,并学习如何尊重它们并编写漂亮的代码。 我们将分两部分讨论MVVM: 第-1部分讨论了有关MVVM和小型演示代码的大量讨论。 第2部分 将通过一个复杂的UI示例来处理MVVM中一些常见的漏洞,以及解决这些漏洞的方法。 你会学到什么? 我们将在示例的第-1部分中学习以下内容 什么是MVVM? 为什么选择MVVM? 我们将构建一个示例示例。 MVVM的一些缺点。 什么是MVVM? 模型: 模型基本上是应用程序具有的数据模型或实体。 它们只是具有简单关联属性的结构或类。 通常,它们只是保存从原始数据结构映射的数据,这些数据可能来自您的API或其他来源(例如SQLite文件等)。 查看或查看控制器: 视图是显示的视觉元素。 应用程序屏幕上的所有UI组件都是视图。 该视图仅包含UI逻辑,例如数据渲染,导航等。 该视图拥有视图模型。 查看模型: 视图模型接收UI事件并执行业务逻辑,并提供要在UI上显示的输出。 这是负责处理驱动视图的业务逻辑的组件。 但是它在内部不会修改UI,也没有对视图的引用。 它拥有数据模型。 为什么选择MVVM? 好的,我们当中有些人可能会问,当苹果公司提供了美观且更简单的MVC时,为什么还要使用MVVM。 我们可以集成一些不同的设计架构,例如Facade,Coordinator,Singleton等,以构建模块化代码。 好的,现在有以下三个原因使MVVM脱颖而出: 隔离代码:隔离代码 。 基于MVVM组件将特定的视图处理划分为跨视图,模型和视图模型的部分,从而为我们提供了模块化的代码结构。 避免使用笨拙的控制器:使用MVC的开发人员知道,当我们的应用程序可扩展且需求不断与我们现有的逻辑混乱时,我们的控制器将继续扩展,直到并且除非将控制器代码路由到单独的文件中。 通过MVVM,我们在视图模型中写下了业务逻辑,仅将输出传递给视图或控制器。 测试驱动开发 : 最重要的是,MVVM确实提供了执行TDD的良好平台。 我们可以写下用于视图模型的单元测试用例,并测试驱动UI的业务逻辑。 单元测试用例在开发时确实非常重要,因为它们在很大程度上减少了我们的破码机会。 请点击以下链接在iOS中探索有关TDD的更多信息 iOS中的测试驱动开发,SWIFT 4-第1部分 […]

使Vimeo视频在iOS中脱机工作

作为Hasso Plattner Institute(HPI)知识技术研究小组的成员,我们正在研究和研究如何使MOOC和基于视频的电子学习脱机工作,因为我们已经了解到,在openHPI的MOOC中,大约有三分之一的用户, openSAP或openWHO下载视频和资料。 除了在具有脱机功能的网站上工作外,我们的研究和工作还涉及针对Android和iOS提供的本地应用程序。 在我们的Android应用中,我们提供SD和HD格式的mp4文件下载。 对于我们的新iOS App,我们决定使用HTTP Live Streaming(HLS)视频(请在apple.com上单击此链接以获取规格和更多内容)。 这是一种非常不错的格式,它基于播放列表,因此它可以包含不同的bandwith版本以及不同的音频和字幕版本。 然后,播放器可以根据语言偏好和可用带宽下载最适合的版本。 如果您在在线时使用HLS,则播放器将尝试使用可能的最佳版本。 从iOS 10开始,Apple引入了允许用户下载HLS视频并稍后播放的可能性。 我们认为这很酷是出于不同的原因。 在没有互联网连接的情况下,在非洲某处上班的通勤者或卫生工作者,均可从此功能中受益。 我是否提到过我们的研究被SAP,WHO和其他机构使用? 我们花了最后两周的时间来实现此功能,而最后四天的调试仅使它无法正常工作。 我们的视频托管在Vimeo上,因此可以从靠近用户的数据中心进行交付。 Vimeo还负责对我们的视频文件进行转码。 如果直接在Vimeo上访问视频文件(不使用其播放器),则可以访问HLS URL,该URL如下所示: https://player.vimeo.com/external/203790595.m3u8?s=3cb58fb02666fd9b9bd8f14f36d54a45fb29c785 调用此URL时,它将发送HTTP重定向,其中将包含实际文件的URL,例如https://skyfire.vimeocdn.com/1501777916-0x0d0827236aefc32e0894e1f50efad8cb6642e905/224214791/video/786737170,786737168,786737172,786737173173 /master.m3u8?absolute=1 虽然此功能非常适合在线播放此文件,但如果应用下载了文件并尝试在离线时稍后播放,则无法播放视频。 来自不同来源的其他文件运行良好。 最终,我们发现iOSs SDK中的下载功能无法正确处理重定向(已在iOS 10和至少是当前的iOS 11公开Beta中进行了测试)。 我们通过应用中的解决方法解决了此问题: (请参阅GitHub上的完整提交),方法是手动调用链接,然后将最终URL传递给下载程序。 请注意,正如Vimeo支持人员确认的那样,此解析的链接仅在短时间内有效。 请注意,文件和下载链接都是通过HTTP 302重定向到实际视频文件资源的。 实际视频文件资源的位置每隔几个小时就会过期,因此请确保始终使用我们提供的重定向链接。 希望这篇文章能帮助其他人在遇到相同问题时绊倒一些时间。 我们向Apple提出了一个错误,但即使他们为新的iOS版本修复了该错误,旧版本仍会保持这种行为。 更新1 —新解决方案 尽管上述方法允许离线观看已下载的视频,但是当设备连接到Internet并且远程链接过期后(大约一天后),播放将失败。 我们认为这是由于某种原因设备尝试在线获取播放列表的原因,如果网址过期,则会中断。 我们知道从应用程序中删除了重定向处理代码,而是构建了HLS代理。 因此,我们可以为该应用提供未过期的链接。 然后,此链接从vimeo中获取播放列表,然后让它通过。 请注意,我们也正在操纵单个流,不知道是否可行,但是通过这种方式,我们可以控制所有URL。

移动应用程序和操作系统设计

天气APP 规格: 天气应用程序具有所有新功能和外观,因此使用起来看起来很有吸引力。 1:-最重要的功能是它将显示整个星期以及整个月份的预测。 2:-它带有城市著名景点的图片,使它看上去简单而吸引人。 3:-Siri建议附带搜索选项,使您更轻松地找到城市。 4:-它使您可以一起查看4个不同城市的天气状况。 这些吸引人的新功能完全改变了应用程序的外观,对用户来说听起来很有吸引力且友好。 计算器APP 规格: 在制作计算器应用程序之前,我们的团队会面并检查了Android和Google的计算器应用程序,并讨论了这些应用程序中的各种正面和负面功能。 我们还询问了许多人,他们在使用IOS计算器应用程序时会遇到什么困难,以及他们希望在新应用程序中拥有哪些新功能。 在讨论之后,我们决定合并以下功能: 1)我们介绍了括号。 如果要使用多个符号进行计算,则在IOS中会变得有些复杂。 方括号有助于轻松进行包含许多符号的大计算。 2)您可以将任何整数转换为所需的货币或权重,以简化转换过程。 3)当我们执行许多步骤的计算时,可以按C按钮上方的图标将其保存在注释中。 它可以用作记录交易记录的票据来源。 照片APP 规格: 我们讨论了当前应用程序的负面影响以及如何改进它们。 我们还询问了人们对Photo应用程序的看法以及他们如何改进它。 我们还浏览了诸如www.behance.com,www.dribbble.com等网站。 对于其他设计师如何以创造性的方式设计相同的应用程序,我们有一些非常好的想法和见解。 如果您通常看到照片应用程序,则在Android和iOS中该颜色太无色了。 这使用户体验太无聊了。 “照片”一词本身意味着色彩丰富,有吸引力且引人入胜。 确实,我们对照片应用程序所做的更改是使它更加引人注目和互动。 正如您在第一个屏幕中看到的那样,我们将照片文件夹的尺寸增大了,并通过显示最后一个添加到该文件夹​​的图片,使其具有与众不同的外观。 我们已经将Google地图集成到了照片应用程序中,并显示了每张照片被点击的位置。 这有助于创建事件的存储通道,并设置与用户的交互方法。 第二个屏幕显示照片布局的变化,显示照片的不同形状使其看起来有所不同。 这种布局减轻了用户向下滚动的负担,因为正常布局只能容纳4张照片在屏幕上,但可以容纳9张。 第三屏是我最喜欢的屏幕之一。 它精美地显示了2017年本年度最好的照片,那年的这一天,您单击该照片以增强记忆,最后显示您最近旅行的照片。 最后,只需按住图片一会儿,就可以选择删除图片或另存为收藏夹,这些选项就会出现,以减轻标记和删除的负担。 通过不添加复杂的功能并使它变得非常容易并使人们看到,该应用程序比以往任何时候都更加容易。

用Swift编写结构化CLI

Commander是一个Swift框架,用于通过与Swift标准库协议Decodable&Decoder集成来解码命令行参数。 Commander可以通过声明command的结构和该命令的options而无需编写任何代码来解析cli参数,从而帮助您编写结构化的cli程序。 使用Commander,您只需要专注于编写命令的options结构,其余工作将由Commander自动处理。 结构化CLI,命令和选项均通过struct或class声明进行struct 。 通过实现可Decodable协议,选项类型是类型安全的。 自动为commander或command生成帮助消息。 支持Shell补全。 支持Bash / zsh自动完成脚本。 Swift 4兼容性。 零依赖和纯Swift。 支持Linux和swift build 。 Mac OS X 10.10 + / Ubuntu 14.10 Xcode 10 斯威夫特4.2 // swift-tools-version:4.2 依赖项:[ .package(URL:“ https://github.com/devedbox/Commander.git”,“ 0.5.6 .. <100.0.0”) ] 指挥官命令–key值–key1 = value1 指挥官命令–bool 指挥官命令-k值-K = value1 指挥官命令-z = value#{“ z”:“ value”} 指挥官命令-z#{“ z”:true} 指挥官命令-zop#{“ z”:true,“ o”:true,“ p”:true} […]

在Swift 3中创建Unwind Segues

这篇博客文章是关于如何在Swift中创建放松的任务。 实现它们非常简单-因此,本文当然很短。 (源代码:https://github.com/mimicatcodes/unwindSegueExample) 但是等等,什么是放松的比赛? 假设我们有三个屏幕,分别是1,2和3。我们想通过创建Show segue从1切换到2,现在通过使用Storyboard中的Present Modally segue从2切换到3。 我们刚刚从2和3创建了一个Present Modally序列-这意味着如果我们想从3回到2,我们可以使用以下方法简单地关闭当前视图控制器(VC3): @IBAction func dismissVC(_ sender:Any){ 关闭(动画:true,完成:nil) } 熟悉,不是吗? 但是,如果我们想从3回到1,而不是2,该怎么办? 在这种情况下, 轻松的搜寻非常有用。 有了放开的序列,您现在可以从3退回到1,而无需先回到2,然后再通过导航控制器回到1。 请遵循以下四个简单步骤来创建Unwind segue: 在视图控制器中,您尝试回到示例VC1中,编写以下代码: @IBAction func unwindToVC1(segue:UIStoryboardSegue){} (请记住:在您要返回到TO的视图控制器中插入此方法很重要!) 2.在情节提要中,转到您要从中解散的屏幕( 在本例中为 3 ) ,然后按住Control键并将视图控制器图标拖到顶部的“退出”图标上。 如上所示,当您看到要连接的IBAction选项时,请选择刚刚在VC1中创建的展开segue操作。 3.转到情节提要中选定视图控制器的文档大纲,如下图所示选择展开序列。 现在,转到“实用工具”窗格中的“属性”检查器,并命名展开序列的标识符。 4.最后,将此代码编写在您希望触发放松segue动作的位置(在本例中为V3)。 @IBAction func goBackToOneButtonTapped(_ sender:Any){ performSegue(withIdentifier:“ unwindSegueToVC1”,发送者:self) } 可以在这里找到本教程的源文件:https://github.com/mimicatcodes/unwindSegueExample 编码愉快!

带有RxSwift的MVVM:用于假人的KickStarter

本教程的目的是开始学习RxSwift 。 通过一个简单的示例,您将能够在其中进行更多探索…… 就像上一个故事一样,我已经解决了MVVM… iOS / Swift MVVM:傻瓜Kickstarter 这个故事是关于我们如何开始学习MVVM体系结构的。 由于您会在…中看到许多教程, medium.com 使用RxSwift继续执行相同的添加购物车功能。 就像电子商务应用程序(如Amazon,Flipkart等)中的购物车一样,用于添加,删除或更新产品数量。 在继续之前, 请从这里简要介绍RxSwift … 在10分钟内学习和掌握⚔️RxSwift的基础知识 每个程序员都应该听说过Rx。 无论是在上次开发者大会上还是在阅读新文章时发生的… medium.com 为此,您至少了解RxSwift中的“ 主题” 。 来吧 !!! 😄 在CartProductTableViewCell中 ,添加以下协议以便可以删除“ +”和“-”按钮。 协议CartProductCellDelegate:class {func updateQuantity(_ cell:CartProductTableViewCell, isIncreasing:Bool)func remove(_ cell:CartProductTableViewCell) } “ +”和“-”按钮将调用updateQuantity委托,而“删除”按钮将调用“ 删除一个”。 购物车经理 让我们从添加一个名为CartManager的新文件开始。 它将是一个单例类,如下所示。 类CartManager { 静态让共享= CartManager() 私人init(){} } CartManager类将处理或购物车项目,引入称为CartProduct的购物车模型。 struct CartProduct { var啤酒:啤酒 var数量:整数 […]

快速滑动手势

首先先搜寻滑动手势识别器,并拉入画面中 我们可以在Storyboard上设定滑的方向 随后拉入程式码里产生IB动作 接着在IBAction写入程式码 @IBAction func swipAction(_发送者:UISwipeGestureRecognizer){ 打印(“右”) } 然后执行专案,向右滑即可 那么要同时发现不同的方向呢? 首先在IBAction上写入决定的方向,使用sender.direction 此时执行专案后,仍然只有向右滑有印,然后再重复将滑动手势识别器拉入画面,然后设置方向属性,然后各别拉入上述的程序码里。 使用程式码写侦测手势 首先先写入决定方向要做的事 然后再使用UISwipeGestureRecognizer(目标:自我,操作:#selector())的方法设置 接着在viewDidLoad执行此方法

如果没有情节提要,Swift的外观将如何?

故事板为IOS应用程序开发人员在幕后做了很多事情,其中​​有些事情显而易见,有些则不太明显,因此,本博客旨在提供一些有关幕后事情的见解。 无论我们应该使用情节提要还是仅用纯代码完成所有工作,这都是值得商topic的话题,值得拥有一个自己的博客,因此在这里我不再赘述。 下面,我将以Apple的Single View Application模板为起点,提供不使用情节提要而创建和运行应用程序的步骤。 让我们将此应用命名为ByeByeStoryboard。 步骤1:建立专案 步骤2:删除情节提要和对其的任何引用 接下来,我们需要确保该应用程序不再需要故事板,因为我们将处理该应用程序的启动。 打开Info.plist并删除带有“主故事板文件库名称”的条目。 在应用程序开发过程中经常构建和运行是一个好主意。 因此,让我们构建并运行我们的应用程序。 您应该看到黑屏,如下所示: 步骤3:定义我们的应用程序窗口 现在让我们定义我们自己的窗口。 在AppDelegate.swift中,我们将编写以下代码: 创建我们自己的窗口并将其存储在现有的window属性中。 将其背景色设置为棕色。 将我们的初始视图控制器设置为ViewController。 为此,我们将窗口的rootViewController属性设置为ViewController实例。 最后,我们将在窗口上调用makeKeyAndVisible。 这将使我们的窗口可见并将其设置为活动窗口。 现在,让我们构建并运行我们的代码以查看其外观。 这是我们得到的: 欢呼!!! 我们在不使用情节提要的情况下构建了第一个应用程序。

App Makers / Day 1(Part 1)

。이커스프로젝트정정해서합니다합니다。 는이커스는iOS앱을실습하는로젝트입니다。 Xcode 9,iOS 11,Swift 4版本。 시작해볼까요? 您好,AppMakers! 아닌이커스프로젝트의아닌이아닌 ‘만들기’ 이지만,앱을로어쨌든합니다합니다。 는리고로그래밍을때, 您好,World 앱을보도록다。 를,Xcode실행합니다! (Xcode的있지면다면, Xcode的Xcode 를다。) Xcode的iOS发行版。 능한그래밍능한능한능한와스스스스스스스스스그램입니그램입니그램입니 그램 입니그램입니그램입니그램입니그램입니그램입니그램입니그램입니그램입니그램입니그램입니 그램 입니그램입니그램입니그램 입니 그램입니。 iOS 创建一个新的Xcode项目 。 Xcode플랫폼플랫폼 iOS iOS(iOS,watchOS,macOS,跨平台) 템플릿이나타납니다。 iOS만들려면iOS플랫폼에서 Single View应用程序 됩니다。 。지템플릿은다시보만들어다。 에지막으로위의이나오면이름을产品名称에,语言는Swift선택합니다。 组织名称,组织名称组织名称(组织名称)组织名称。 톺아보기 AppDelegate.swift Life리)이고,고기 (生命周期) 관리할다。 active이때,active이활성 (活动) 될가때,background이생명주 (背景) ,생명주이생명주기생명주기가다가다。 ViewController.swift Single View应用程序。 生命周期(生命周期) 있습니다할다。 […]

如何从头开始创建iTunes Samples Player? (第3部分)

注意:这是“如何从头开始创建iTunes Samples Player? (第2部分)”。 本文分为两个部分: 在ProgressView和标签文本中显示下载进度。 实现暂停,恢复和取消下载。 上一篇文章的最后一步是添加URLSession的委托方法。 URLSession中还有另一个委托方法,可提供进度的确切状态。 我们可以利用此委托获取当前的进度信息,并在TrackCell中使用新方法,更新标签和进度视图。 TrackCell中进行了一些更改。 删除了隐藏进度标签和progressView的行。 将进度视图的进度值设置为零。 下载完成后,我们将隐藏进度视图。 另外,在Main.storyboard中,删除进度标签上的默认文本“ Label”。 请注意,在底部添加了新方法updateDisplay。 生成,运行并点击下载。 在下载过程中和下载之后,您应该看到以下屏幕。 到此完成第1节 。 解决方案 :URLSession支持暂停/恢复和取消。 我们已经在单元格上隐藏了按钮。 当用户点击它们时,某些委托方法应触发。 这些方法应由SearchViewcontroller处理。 暂停,恢复或取消之类的操作应直接应用于活动下载。 为了进行这些更改,我们需要在T​​rackCell上声明三个新的委托方法。 然后,我们需要将按钮操作连接到IBAction方法,该方法将依次调用委托,在这种情况下为SearchViewController。 我们还在单元格行上进行了一些UI调整,以便与下载相关的控件仅在活动下载时出现。 完成的课程如下所示: 我们已经更改了Configure方法TrackCell的签名,以便传递活动的下载对象。 更改“ SearchViewController + TableViewDelegate”内部的方法调用以通过活动下载。 cell.configure(跟踪:跟踪,下载:跟踪。下载,下载:downloadService.activeDownloads [track.previewURL]) 生成,运行,搜索,下载,暂停,恢复,取消。 该版本的源代码在GitHub中可用。 希望您能够成功看到具有预期功能的上述屏幕。 这标志着我们为本文设定的所有目标的完成。 学习愉快!