Tag: swift

iOS:Swiftly Slider

一个简单的iOS滑块控件。 安装 CocoaPods: 吊舱“ SwiftlySlider” 手册: 只需将SwiftlySlider.swift复制到您的项目中即可。 使用 您可以从Storyboard或XIB创建。 或手动创建: 让滑块= SwiftlySlider() 为了处理值的更改,您应该实现一个协议SwiftlySliderDelegate : slide.delegate =自我 func swiftlySliderValueChanged(value:Int){ } 方向: picker.direction = SwiftlySlider.PickerDirection.Horizo​​ntal //垂直,水平 您还可以更改当前值,最大值或最小值,例如: picker.currentValue = 0 picker.maxValue = 30 picker.minValue = 1 滑块设置: slideImage //滑块的自定义图像 SliderImageOffset //自定义滑块位置的偏移量 SliderSize //自定义滑块位置的大小 例: slide.sliderImage = UIImage(名称:“ CustomSlider”) slide.sliderImageOffset = CGPoint(x:0,y:-1) slide.sliderSize = CGSize(宽度:30,高度:15) 正常指标: useNormalIndicator //使用普通指示器 […]

斯威夫特类型方法

类型方法是在特定类型上定义的,例如结构,枚举,类,甚至是预定义类型,例如int,string,double等,但是对于那些类型,我们需要深入研究扩展(我将在以后的文章中做)。 类型本身可以使用它们,而不必创建该类型的实例。 因此,您可以直接在类型上调用该方法。 对于值类型(结构,枚举),在定义函数之前,请使用关键字static : 对于引用类型(类),我们使用关键字class: 给定类的继承/覆盖选项,它们有一个特定的特性:如果您不希望类类型方法被子类中的方法覆盖,则可以在类型方法定义中使用关键字final before class。 下一个:枚举

使用委托模式在控制器之间进行通信。

降低应用程序复杂性的一种好方法是委托模式。 这个想法非常简单:您无需在当前上下文中包含某些行为的代码,只需向上下文提供一个委托对象,然后由该委托对象的方法执行操作。 这与继承之上的构成保持一致:您的代码避免了超类及其子类之间的紧密耦合。 通过避免继承,您的代码可以更容忍修改。 通过使代码更具模块化,您可以避免处理过多职责的大型对象,从而使维护变得更容易。 这是一个简单的例子: 协议音箱{ 函数speak(); } 猫类{ 共鸣箱人声和弦 函数meow(){ vocalChords.speak() } } KittyVocalChords类实现了Soundbox { 函数speak(){ printToTerminal(“喵”) } } 猫玛丽亚= Cat.new() catVocalChords = KittyVocalChords.new() marya.vocalChords = catVocalChords 猫需要知道如何喵喵叫,但是猫可能还有其他不需要注意的行为。 将它们保持为单独的对象可以使您的声乐班级完成它的声乐事务,而猫则将其完成猫的事务。 您可以将所有这些信息转储到cat类中,但这会使cat类变得更加复杂,因此更加难以阅读和推理。 另一个选择是使用所需的方法定义基类,这将降低复杂性,但是现在您已经与该基类绑定不健康。 对基类所做的任何更改都会影响继承者。 例如,如果您希望狗类也继承定义语音行为的同一基类,该怎么办? 那计算机课呢? 除此之外,更改行为就像更改委托一样简单: 如果environment.dominate_gas ==氦{ marya.vocalChords = sweakyKittyVocalChords } else,如果environment.dominate_gas == NITROGEN { marya.vocalChords = normalKittyVocalChords } 我们唯一需要担心的是代表。 猫类从来不需要为在不同气体中的行为而烦恼。 因此,撇开人为的例子,这在iOS开发中具有价值。 在我正在开发的健身应用中,我使用容器视图。 […]

在iOS 11上使用MapKit进行集群:第2部分

在第一部分中,我们研究了MapKit实现注释集群(iOS 11的一项新功能)所涉及的一些高级概念。正如该帖子的结论所指出的,我们还有许多工作要做,以使我们的简单应用程序更加实用,并使其代码更具可读性。 在第二部分中,我们将做到这一点! 首先,快速回顾一下。 您可能还记得,在应用程序中建立注释集群并运行的过程非常简单: 在地图上的狭窄区域添加多个注释。 为MapKit提供每个注释的MKAnnotationView实例, MKAnnotationView注意适当地设置其clusteringIdentifier 。 为MapKit提供其他MKAnnotationView实例, MKAnnotationView用于MKClusterAnnotation类型,这些实例在运行时自动生成。 享受您整洁有序的地图! 大部分工作都是在单个MKMapViewDelegate方法( viewFor )中完成的,并且所得的项目虽然简单易用,但可能会更强大。 因此,让我们进行一些重构! 我们将从更新MapItem ( MKAnnotation MKAnnotation的数据类型)开始。 在第一部分中, MapItem非常简单:它具有CLLocationCoordinate2D类型的单个属性,这是MKAnnotation要求的MKAnnotation 。 在我们更新的应用程序中,我们希望地图上的颜色更加多样化,因此我们将扩展MapItem以包含ItemType ,这将确定地图上注释的颜色: 如您所见,我们的集群现在可以显示有关它们包含的数据的更多信息,并且导航地图要直观得多。 繁荣! 🎉 希望您已经学到了一些有关MapKit的功能的有用技巧,这些技巧在iOS上的注释集群方面比本迷你系列的第1部分和第2部分更重要。 我们已经从一个显示该系统工作原理的超简单示例,变成了一个具有生产就绪代码的更复杂示例(借助Swift🤓的强大功能使其变得优雅)。 谢谢阅读! 如果所有这些地图都让您感到有些迷茫,请在下面发表评论,在Twitter @worthbak上打我,或在Github上查看完整的项目。 否则,编码愉快!

如何使用Mapkit View / Swift 4获取和显示位置

大家好,在本文中,我将告诉您如何使用iOS应用程序Swift 4的mapkit视图获取和显示位置。 首先,不要忘记“ import MapKit ” 之后,您需要将Mapkitview放入UIView并以IBOutlet的形式连接到控制器类,如下所示; @IBOutlet弱var mapKitView:MKMapView! 我们有两个不同的变量来确定位置,分别称为lat和lng。 例如,伊斯坦布尔的Lat和LNG; lat = 41.015137 lng = 28.979530 公共静态变量lat:Double = 41.015137 公共静态变量lng:Double = 28.979530 然后,您需要使用CLLocationManager在您的viewcontroller类中,定义如下。 var locationManager:CLLocationManager! 在您的视图中,您确实需要同步mapkit委托自己的类。 覆盖func viewDidLoad(){super.viewDidLoad(){ self.mapKitView.delegate =自我 } 现在,由于使用mapkit视图函数,我们必须为UIViewController类添加扩展。 扩展UIViewController:CLLocationManagerDelegate,MKMapViewDelegate { func locationManager(_管理器:CLLocationManager,didUpdateLocations位置:[CLLocation]){ 让userLocation:CLLocation = location [0]作为CLLocation 让中心= CLLocationCoordinate2D(纬度:UIViewController.lat,经度:UIViewController.lng) let region = MKCoordinateRegion(center:center,span:MKCoordinateSpan(latitudeDelta:0.01,longitudeDelta:0.01))self.mapKitView.setRegion(region,animation:true)//在用户当前位置放置图钉 让myAnnotation:MKPointAnnotation = MKPointAnnotation()myAnnotation.coordinate = CLLocationCoordinate2DMake(UIViewController.lat,UIViewController.lng); myAnnotation.title =“伊斯坦布尔位置” mapKitView.addAnnotation(myAnnotation)} […]

纹理最佳实践2

纹理最佳实践#2 LayoutSpec 内容元布局和堆栈元素。 消息气球布局(layout진메세메세지내용)을이미지와이같가수가있고 消息气球尾巴:말풍선말풍선리 消息气球内容:말풍선 消息提示框内容。 媒体领域: 消息文本区域:메세지텍스트 Stack기으지가StackLayoutSpec으로布局기본설계가끝이난다。 2. AS Stack LayoutSpec布局子布局中的布局。 이건또이무슨말? 각,각子布局의를정리를다음과다。 媒体布局은比率은이변해야한다。 。로필은위치해야한위치해야한다。 15.0分하향해야한다。 订婚(마진은)마진은5.0pt정도가진다。 이렇게눈으로봤을이정리가것이다。 어떤과항목별과과다다다다다다다다다。 로하나씩풀어보자면 媒体布局은比率은이변해야한다。 :比率AS Ratio LayoutSpec LayoutSpec。 。로필은위치해야한위치해야한다。 : AS Relative LayoutSpec , AS Absolute LayoutSpec layoutPosition相对应。 在AS Inset LayoutSpec插入底部的.infinity로finity다。 in지만사주의.infinity로잡았는데이 레다 일으킵니다。 15.0分하향해야한다。 : AS Inset LayoutSpec .Infinity布局图。 (참고:layoutPosition타입은CGPoint입니다。) 订婚(마진은)마진은5.0pt정도가진다。 :해하셨으면이해하셨으면이거거제는겁니다。 布局布局。 。지다보면수올릴가。다。 […]

快速测试:规避依赖性

自动化测试是验证应用程序逻辑正确性的有用工具,也是防止错误的手段-软件在不断变化,测试是对潜在退化的早期警告。 但是,第三方代码在测试环境中并不总是能很好地发挥作用。 在这篇文章中,我们将研究一个障碍第三方代码的真实示例,以及如何解决它。 我们正在编写一个简单的类来记录“面包屑”(又名日志事件)。 我们会将这些事件记录到AWSKinesisFirehose中,并使用AWS为此提供的客户端。 这是未经测试的世界中此类的外观: 由于Swift是静态类型的,因此我们不能只传递任何类。 因此,我们可以使用一种称为IDEPEM的技术。 “ 我 D倾向 太好了 协议 (E quatable 模拟) 我们已经在注入我们的模拟类,以便涵盖IDEP的ID部分(这里不需要E quatable模拟)。 因此,接下来,使E成为协议。 诀窍是修改AWSFirehoseRecorder的类型,以便可以使用我们可以作为替代实例化的类型来对其进行描述。 在这种情况下,这意味着扩展AWSFirehoseRecorder,使其实现我们自己设计的协议。 该协议仅描述目标测试类使用的AWSFirehoseRecorder的方法: 扩展AWSFirehoseRecorder以在其类型描述中包括该协议。 它已经在其实现中实现了协议。 然后,我们创建自己的对象来满足该协议,并将其用作AWSFirehoseRecorder的代表 : 我们的假冒记录器现在实现了一个协议,而不是子类化第三方类型。 请注意,我们的模拟类不再引用或覆盖AWSFirehoseRecorder 。 现在我们的目标测试类仍将使用AWSFirehoseRecorder.default()作为默认参数,但否则将不知道什么是AWSFirehoseRecorder 。 相反,它将事件传递给BreadcrumbRecordable 。 注入依赖,一切都是协议 现在,我们可以将模拟作为测试中AWSFirehoseRecorder的替代者 。 我们可以撤回事件以验证事件是否到达,并且可以检查事件的正确性: 现在可以检查传递到记录器的数据 通过使用协议和一些Swift类型技巧,我们设法从测试图片中巧妙地剪裁了外部代码,从而甚至从未实例化它。 相反,我们清除了测试和验证我们自己的代码的路径,并使IDEPEM强大的功能处于休眠状态。

Swift-MVC

MVVM , MVP和VIPER 几周以来,我一直在尝试了解有关iOS建筑模式的更多信息。 作为基本MVC的一部分,您可以找到有关MVVM,MVP和VIPER的一些不错的文章。 iOS架构模式 MVVM简介 使用VIPER架构iOS应用 我不确定他们。 而且我还是很困惑。 最后, Bohdan Orlov在他的文章中说:“ 没有灵丹妙药, 因此选择架构模式只是在您的特定情况下权衡取舍的问题 ”。 我也有类似的想法。 当您可以使用更好的MVC时,为什么将所有架构决策押注在某种时髦的流行模式上? MVC 我完全同意MVC被破坏的事实,因为View和Controller集成在同一文件中。 这是事实,使MVC成为谎言。 我还认为采用这种替代模式是因为Objective-C的功能不如Swift强大。 老实说,由于Swift,我们可以以其他方式使用MVC。 现在要容易得多。 扩展功能更加强大且显而易见。 结构和枚举现在是真实的模型结构。 易于理解和使用。 因此,如果使用MVVM , MVP和VIPER也很痛苦,为什么我们不简单地使用MVC ? 搜索图案 我想学习如何使用HealthKit Framework ,所以几天前开始了一个项目。 我正在使用该项目来发展和研究有关如何在Swift中使用MVC的想法。 距离完成还很遥远,但是我要坚持下去。 每天都在发展和更改代码。 Swift-MVC 线索之一是使用扩展来尽可能多地移出ViewController。 视图:UIViewControllerIt是View 。 所有View Life Circle都在那里,因此仅将View代码放入ViewController中。 控制器:扩展 将所有Delagate和Data Source代码添加到新的扩展文件中。 我们通常将View Controller内部拥有的所有逻辑扩展到一个新的扩展逻辑文件。 模型 结构和枚举。 将所有数据模式转换为新文件 通过这种结构,ViewController的长度为100行。 结论 […]

继续执行nadar,继续执行nadar,nadar,nadar …

最终解决方案的制定和实施的目的是为了实现零编程。 意见与建议 您可以使用代码猴子的任何东西,但没有高质量的声音,不能修改声音,所以必须符合要求。 普遍存在的错误,可在pedia的任何地方使用…quer izer,aos colegas显示器执行BEPiD。 Essa semana fui salva por diversas pesssoas que me ajudaram a Concertar os erros e encontrar outrassoluçõespossíveispara meus problemas。 常见问题解答,请参见论坛。 提维莫斯(Tivemos que usar)超越了现实生活中的认知能力(conseguissem realizar o que eu precisava)。 Nisso eu descobri um站点chamado Stackoverflow que me ensinou muito。 您未在自己的网站上建立任何Google链接。 对PESQUISAR SEMPER EMINGLÊS的优先认购。 O segundo foi:PESQUISE SEMPRE。 Chegamos ao memoo de […]

Swift中的MVVM

MVVM是MVC体系结构的增强版本,我们在其中正式连接视图和控制器,并将业务逻辑移出控制器并移入视图模型。 MVVM听起来可能很复杂,但它实际上是您已经熟悉的MVC体系结构的修饰版本。 一般来说,MVVM通常与功能性反应式编程结合使用,并且有很多FRP库,例如RxSwift和ReactiveCocoa。 但是,如果不熟悉FRP,仍然可以在项目中利用MVVM。 在本文中,我将演示如何在不使用FRP库的情况下采用MVVM。 模型视图控制器 让我们开始使用标准的MVC方法,该示例将在UITableView显示一个排序整数数组。 此外,我们可以通过单击右上角的添加按钮以正确的顺序插入新的整数,并通过滑动行来删除整数。 在这里,我只是创建一个名为DemoViewController的UITableViewController子类,并在其中实现必要的UITableViewDataSource方法。 另外,我还将插入逻辑放在addNewInteger方法中,将删除逻辑放在tableView(_ tableView:, commit editingStyle:, forRowAt indexPath:)方法中。 final class DemoViewController: UITableViewController { fileprivate var sortedIntegers = [1, 2, 3] override func viewDidLoad() { super.viewDidLoad() tableView.register(UITableViewCell.self, forCellReuseIdentifier: UITableViewCell.description()) let addButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addNewInteger)) navigationItem.rightBarButtonItem = addButtonItem } func addNewInteger() { let number = Int(arc4random_uniform(10)) […]