Tag: Swift 4

tableViewCell->弹出框

因最近刚好有需要用到popover的功能,所以也学到了UIButton及BarButtonItem的跳出popover,以及让iPhone也能够以popover的方式显示,这方面的教学网路上就有很多,但更想要得是从UITableViewCell点选后跳出popover,这资讯就比较少,找了两天总算找到可以用的,目前是范例范例来了的http://theapplady.net/show-popover-view-via-tableview-cell / 以下只是记录一下我自己写的,要看教学还是直接去上面网址会比较清楚唷。 class TableViewController: UITableViewController, UIPopoverPresentationControllerDelegate { func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath){如果让indexPath = tableView.indexPathForSelectedRow {let popover = UIStoryboard(name:“ Main”,bundle:nil).instantiateViewController(withIdentifier:流行”)! popVCpopover.modalPresentationStyle = UIModalPresentationStyle.popoverpopover.popoverPresentationController? ,动画:true,完成:nil)}

Swift 4的本地通知

Преждечеммыначнем,выможетескачатьначальныйпроект。 Приложениепредставляетизсебятаблицусоспискомтиповуведомлений。 Сейчасеслитапнутьпокакойлибостроке, 警报 сназваниемуведомления。 Кконцуэтоготуторилаэтодействиебудетотправлятьлокальноеуведомлениесссодержимымстроки。 Крометого,пользовательсможетвзаимодействоватьсэтимуведомлением,выбираядляэтоееилиилиили。 Преждечемвашеприложениесможетотправлятькакиелибоуведомления,пользовательдолжеодотьна。 Дляэтого,припервомзапускеприложениянеобходимовыполнитьзапроснаотправкууведомлений,длятого,чтобыпользовательмогегоодобритьилиотклонить。 AppDelegate用户指南UserNotifications import UserNotifications ВсвойствахклассасоздаемновоесвойствоnotificationCenterиприсваиваемэкземплярклассаUNUserNotificationCenterдляуправления。 .тобудетнашцентрнотификаций。 let notificationCenter = UNUserNotificationCenter.current() 使用didFinishLaunchingWithOptions options ,котораябудетсодержатьвсебеопции,доступн之前。 重要信息: badge , sound , alert和carPlay 。 let options: UNAuthorizationOptions = [.alert, .sound, .badge] Определившисьсперечнемпараметровоповещениямыможемзапроситьупользователяразреениенаотп notificationCenter.requestAuthorization(options: options) { (didAllow, error) in if !didAllow { print(“User has declined notifications”) } } Еслисейчасзапуститьприложение,томыполучимзапроснаотправкууведомлений Пользовательможетпоменятьнастройкицентрауведомленийвашегоприложениявлюбоевремя。 ВыможетеотслеживатьэтинастройкиприпомощисоответствующегогетераgetNotificationSettings。 completionтотвызовсодержит […]

MVVM-2:深度学习

在这里,我们又回到了MVVM系列的第二部分。 如果您不熟悉MVVM,则希望阅读本系列的第一个博客MVVM — 1:一般讨论,以使MVVM更加清晰。 为什么只留下一个简单的MVVM演示? 如所承诺的那样,这将是在MVVM公园中进行的详细游览,因此是一个大博客;)。 所以等我直到最后。 你会学到什么? 在实时iOS应用程序开发场景中使用MVVM。 建立复杂的UI尊重MVVM概念。 MVVM中遇到的常见问题并巧妙地解决了这些问题。 激动…… MVVM的缺点: 在探讨主要概念之前,让我们回顾一下MVVM的常见缺点: 难以在嵌套视图和复杂UI中管理视图模型及其状态。 各种MVVM组件和数据绑定之间的通信可能很痛苦。 视图和视图模型的代码可重用性很困难。 初学者的MVVM很难使用。 我们要建造什么? 我们将构建一个应用程序,该应用程序将获取您的当前位置并显示附近的自动取款机,咖啡馆,夜总会和您周围的餐馆之类的地方,因此,如果您想出去玩,这对您来说真的很容易:)。 没有比NEARBY更好的名字了。 该应用程序的外观如下: MVVM的基本经验法则: 视图模型归视图所有 , 模型归视图模型所有 。 View Model仅负责处理输入到输出以及驱动UI所需的逻辑。 视图模型不应修改UI。 该视图应仅负责UI处理。 视图不应与数据模型交互,反之亦然。 在构建我们的应用程序时,我们将尝试维护MVVM的这些基本规则。 因此,不浪费时间,让我们进入竞技场。 样例代码: 您可以下载示例代码,并在MVVM-2文件夹下打开“ Nearby”项目。 代码流: 该项目包含三个页面:主页,位置列表和位置详细信息页面。 为了便于理解,每个页面都被视为一个单独的模块。 对于此讨论,我们将分析HomePage模块。 其他模块的设计类似。 主页模块 通过分析HomePage设计,我们可以将页面中的视图分离为主页视图,分页单元格和带有集合视图的表格单元格。 此外,分页单元格具有水平滚动视图,该滚动视图具有显示位置细节的视图。 如果您考虑如何管理所有视图模型并在组件之间划分职责,您会发现MVVM使情况变得更加糟糕,特别是对于初学者而言。 可能有多种方法来构建下面的UI,但是对于我们的讨论,让我们根据下图分离视图 : 闻到腥味……。 是的,对于MVVM的初学者而言,上述隔离可能是一个错误和时间杀手。 那么,MVVM将导致哪些问题: 管理多个嵌套视图和视图模型 。 通过驱动UI的不同业务逻辑查看可重用性。 (例如,单个CollectionTableCell用于具有不同业务逻辑的多个单元。) […]

Swift 4和@objc警告

最近,我参与了一个迁移到Swift 4的项目,该项目在其代码库中混合了Swift 3和Objective-C。 因此,在接受来自Xcode 9的邀请以将项目转换/迁移到Swift 4之后,我遇到的第一件事是一个可怕的警告,说: 不建议在Swift 4模式下使用Swift 3 @objc推断。 请解决已弃用的@objc推断警告,启用“使用已弃用的Swift 3 @objc推断”日志记录来测试代码,然后通过将“ VarageSale”的“ Swift 3 @objc推断”构建设置更改为“默认”来禁用推断。目标。 @objc推论? WTF! 好的,这就是我所拥有的,正如您所知,Swift生成的代码仅对其他Swift代码可见/可用。 就像《猿人星球》电影中“猿不杀死猿”的扭曲版本一样。 因此,如果您有一个Swift类,要在Objective-C中使用哪些成员(函数,协议,变量),则需要通过使这些成员具有@objc属性来显式指示这些成员。 这是棘手的部分,在Swift 3中,编译器非常纵情,为某些类成员添加了@objc ,即使您可能不需要它。 但是在Swift 4中,在此问题上限制更大或更宽泛,因此我得到了警告(也可能是您)。 解决方案 1-使用@objc 就像我提到的,您可以使用@objc属性标记函数或属性, @objc会将标记的成员公开给Objective-C。 2-使用@ objcMembers 现在,如果要将所有类成员公开给Objective-C,则可以使用@objcMembers标记该类。 但是使用@objcMembers时要明智,因为由于需要在Swift和Objective-C之间映射的额外代码,它会使二进制文件更大。 参考文献 迁移到Swift 4 @objc推断 限制@objc推断

使用扩展来组织您的UIViewController

什么是扩展? 扩展为现有的类,结构,枚举或协议类型添加了新功能。 这包括扩展您无法访问原始源代码的类型的能力(称为追溯建模 )。 扩展与Objective-C中的类别相似。 (与Objective-C类别不同,Swift扩展没有名称。) 以正确的方式使用扩展可以极大地改善代码组织。 我将展示如何改善UIViewController类中的代码组织,并保证您将一直使用这种方法。 开始吧! UIViewController +扩展 UIViewController类可以包含许多代码,这可能导致文件大而混乱。 这就是为什么我们需要通过将代码分成单独的扩展块来正确组织代码。 您可以在文件中添加无限数量的扩展名,但我将向您展示一些使用它的示例。 注意:我在该故事的末尾添加了一个文件(由于太长而不得不将其放在此处),其中包含一个简单的代码演示文稿,以供您阅读。 类块–在此我声明变量( fileprivate和public ),出口,覆盖方法,生命周期方法( viewDidLoad() , viewWillAppear()等)以及内部方法。 私人分机–这是 首先 最常见 我在每个控制器中创建的扩展。 它包含所有需要保密的方法,动作,事件。 因此,无需在每个方法之前添加private关键字,Swift即可让您将所有内容保持在同一块内。 协议扩展 –如果您需要在控制器中实现委托方法,这是最好的方法。 假设您需要在控制器内部实现UICollectionView。 这意味着您将需要UICollectionViewDelegate,UICollectionViewDataSource和UICollectionViewDelegateFlowLayout扩展。 只需为每个协议创建一个扩展,然后添加所需的方法(请参见下面的Gist示例)。 MARK:// – 是一个简单的指令,可以帮助我们更好地组织实现代码(在Objective-C中称为#pragma标记 )。 在每个扩展名上方添加标记,说明其功能。 这样,您的文件看起来就像被分成几部分。 查看我最新的项目: App Store上的“VIP体育投注技巧和比分” 此应用程序仅在iOS设备的App Store中可用。 通过遵循我们的专业投注来增加您的利润… apple.co 阅读我在Medium上撰写的更多文章: 引入Clean Swift体系结构(VIP) 立即忘记MVC! hackernoon.com 使用Swift 4的iOS版Google Maps SDK终极指南 许多iOS应用程序都使用Google […]

Swift Generics的力量-第1部分

泛型函数,泛型类型和类型约束 当他们工作时,您爱他们,当他们不工作时,您恨他们。 😀😀 在现实生活中,每个人都知道仿制药的功效:早上起床,决定喝什么,加满杯子☕️ Swift是一种类型安全的语言。 每当使用类型时,都需要指定它们。 例如,我们需要一个可以处理多种类型的函数。 Swift已经提供了Any和AnyObject但是除非必须使用,否则最好不要使用它们。 使用Any和AnyObject将使我们的代码易碎,因为在编译期间我们将无法捕获类型不匹配的情况。 泛型是我们需求的解决方案。 通用代码允许您编写可重用的函数和数据类型,这些函数和数据类型可与任何与您定义的约束匹配的类型一起使用,同时提供编译时类型安全性。 它使您可以编写避免重复的代码,并以清晰抽象的方式表达其意图。 例如,诸如Array, Set and Dictionary类型的类型在该元素上是通用的。 假设我们必须打印整数和字符串数组。 我可以创建2个函数来完成这项工作。 让intArray = [1,2,3,4] 让stringArray = [a,b,c,d] func printInts(array:[Int]){ print(intArray.map {$ 0}) } func printStrings(array:[String]){ 打印(stringArray.map {$ 0}) } 现在,我必须打印浮点数数组或自定义对象的数组。 如果我们看一下上述功能,则所使用的类型只是区别。 因此,无需重复代码,我们可以编写可重用的泛型函数。 泛型函数可以使用由占位符类型T标识的任何类型。占位符类型名称并没有说明T必须是什么,但是它确实说两个array必须是T类型,无论T代表什么。 每次调用print(_:)函数时,都会确定要代替T使用的实际类型。 func print (array:[T]){ 打印(array.map {$ 0}) } 上例中的占位符类型T是类型参数。 通过在尖括号内用逗号分隔多个类型参数名称,可以提供多个类型参数。 如果我们看一下Array 和Dictionary ,它们有一个命名的类型参数,即Element&Key,Value,它说明类型参数与它所使用的泛型类型或函数之间的关系。 注意:始终为类型参数提供大写的驼峰名称(例如T和TypeParameter ),以表明它们是类型的占位符,而不是值。 […]

JSON编码和解码– Swift 4

Swift 4中JSON编码和解码的简短详细介绍 Swift 4为我们提供了一种新的且更轻松的JSON处理方式。 假设我们创建了一个使用用户个人资料的应用程序。 在.get请求之后,我们收到了一个人。 让我们创建它的结构: 现在,我们可以创建Struct的实例并打印其数据,以确保它是我们的正确实例: 如果我们需要在Swift 4中将我们的person实例表示为Data ,则可以在一行中完成: 想象一下,您必须以JSON表示形式在服务器上发送此实例,如果首先拥有实例,则必须将其转换为Data类型,然后可以创建JSON: 如果您收到的人是JSON,并且需要先将其转换为struct实例,则必须先将其转换为Data ,然后再将其转换为struct : 上面的代码看起来不太易读,但我想向您展示确切的步骤流程,您可以在上面的要点中轻松看到它。

Swift 4 Introduction系列1.4 — Swift数据类型转换

我们无法对具有不同数据类型的变量执行计算。 例如,我们不能添加带有整数(Int)变量的浮点数(Double)。 为了能够执行这样的计算,我们必须将整数转换为浮点数。 同样,我们不能使用UInt16变量添加属于数据类型Int8的变量。 对于数据类型之间的转换,语法如下: 让 = () 要么 var = () 要么 = () 数据类型转换的基本规则是: 要转换的数据类型可接受要转换的数据 。 因此,我们必须知道数据类型限制,以便我们能够正确执行转换。 要在位大小数据之间转换,我们需要使用以上语法。 例: 设numberA:UInt8 = 87 让numberB:Int16 = 43 设numberC = 23个let numberD = Int16(12)let numberE = Int32(numberA) var numberF = UInt16(numberB) 令numberG = UInt64(numberC)numberF = UInt16(numberD) 如上面的示例所示,我们可以在转换括号中包含数字文字,如NumberD所示。 要重新分配变量,我们需要将转换器的数据类型与等式左侧的变量匹配,如最后一条语句中的numberF所示。 对于声明,请注意,变量将采用转换器指定的任何数据类型。 我们还可以先声明常量或变量,然后再执行赋值。 请注意,转换器必须与声明的变量或常量具有相同的数据类型。 例: 设numberI:UInt64numberI = UInt64(numberA)var numberJ:Int16numberJ […]

开始Swift编程第1部分-变量,常量和类型

我知道那里有很多教程,Apple有很多学习Swift的资源,包括他们的WWDC视频(即使较旧的视频仍然有用,所以不要害怕几年前的视频)。 保罗·哈德森(Paul Hudson)的系列文章“用Swift入侵”非常适合概念学习,而他的系列文章就是我的入门方式。 Ray Wenderlich也提供了一些非常深入的教程,但是大多数教程都要求您在到达API之前就具有一定的知识。 我依靠Ray Wenderlich一次过。 最后,我找到了Cocoacasts,以获取有关核心数据的信息。 我想每两天在这个系列中创建一个新的部分。 根据主题所涉及的内容,可能需要更多时间来编写。 本教程与众不同 许多教程向您展示了如何做某事,几乎没有解释为什么您以某种方式做某事。 我的目标是教您如何尽我所能,以及增加社区反馈。 许多教程一次将所有内容都扔给您,我计划详细介绍该主题。 您会慢慢学习,但是到完成每个部分时,我希望我能够比在其他地方阅读相同内容所能教给您的更多。 本教程是什么 本教程的设计方式是,您将学习Swift编程的基础知识。 我将教的很多东西都可以转移到其他语言,但是所有语法都是用Swift编写的,使用相同语法的里程可能会有所不同。 虽然本教程并非旨在教您如何制作您的第一个应用程序(请参见下文),但它会教您一次又一次地用于制作第一个应用程序的基本构建基块。 本教程不是什么 本教程不会教您如何使用Xcode或如何制作第一个移动应用程序。 我不会讲授如何构建用户界面,使用自动布局,如何使用“在此处插入框架”或iOS中使用的各种文件类型。 也许将来,我会写一些系列文章,深入探讨其他主题,但是目前,我的唯一目标是教授语言以及事物与语言的关系。 系列目标 整个系列的目的不是要推出另一个几乎一无所知的程序员,而是要教新的程序员真正的编程。 从课堂和实践的角度,使读者对程序设计有一个更好的理解。 使新程序员更好地理解概念,这些概念将通过面试和整个职业生涯为他们提供帮助。

快速创建自定义分段控件

大家好,这是我的第一个故事,与您分享ios分段控制。 ios中的默认边框带有边框和自定义功能,这并不容易。 如今,有些应用程序被设计为在Android和IOS上看起来一样,我们需要自定义许多组件,即使用户更换设备(IOS←→Android)也要给用户相同的体验。 因此,让我们创建一个分段控件,它看起来像Android中没有边框的选项卡式栏。 可以用作幻灯片菜单或XLPagerTabStrip中的滑块标签,也可以用作Android中带有滚动标签的滑块标签。 我通过观看Mark Tutorial youtube频道创建了此自定义分段控件,并根据我的要求进行了更多自定义。 让我们深入研究代码… 众所周知,UIControl继承自UIView。 所有IOS或Xcode UIComponent都继承自UIControl,后者已封装或绑定了组件的所有操作和侦听器(UIControlEvents,如.tpuchUpInside,.changeValue等)。 因此,为customSegmentedControl创建一个UIControl的子类。 @IBDesignable类CustomSegmentedContrl:UIControl { } 2.现在,添加按钮数组,其作用类似于段。 要突出显示所选按钮/细分,我们可以使用单独的视图。 在这里,我称其为“选择器”。 我还在细分控件的底部放置了底层视图 var按钮= [UIButton]() var underLiner:UIView! var选择器:UIView! 3.在这里,我给出一个选项,选择带有标志的衬板。 var isUnderLinerNeeded:Bool = false { didSet { updateView() } } 4.在这里,还有两个可以用于分段控件的属性 var selectedSegmentIndex = 0 { didSet { updateSegmentedControlSegs(index:selectedSegmentIndex) } } var numberOfSegments:Int = 0 { didSet { numberOfSegments […]