Tag: swift

Swift 4中的重大更改

在这个博客中,我想深入了解Swift 4中将引入的代码破坏更改的数量。此外,我还将演示如何在当前的 Xcode 8.3.2中使用Swift 4。 重大变化 如果我们总结所有已实施的Swift 4提案,我们(截至31–5–17)将列出以下清单。 用粗体突出显示的建议是在Swift 4中引入源代码更改的建议。让我们更深入地研究每个建议。 区分单元组和多参数函数类型-( SE-0110) 有了这个建议,您现在必须从现在的单个参数手动扩展元组。 让我们用一个例子来解释。 typealias名称=(名字:字符串,姓:字符串) 让名字:[名称] = [(“ Bart”,“ den Hollander”)] 我已经在数组中声明了一个元组。 现在,我想遍历数组中的每个元组并打印姓氏。 让我们在Swift 3中执行此操作。 // Swift 3 names.forEach({首先,最后一个 print(last) //“ den Hollander” }) Swift 3编译器从元组扩展了“ first”和“ last”变量。 这是非常有用和可读的。 现在让我们在Swift 4中做同样的事情。 // Swift 4 names.forEach({首先,最后一个 打印(最后) }) //错误:闭包元组参数’(firstName:String,lastName:String)’不支持解构 这不再起作用的原因是,在Swift 4中,您必须从单个参数手动扩展元组。 您可以执行以下操作来解决此问题。 // Swift 4 A:通过提供元组键进行扩展 […]

Mikroprojekt:Bild drehen。 iOS(快速)。

源代码:https://github.com/mhennemeyer/image-rotation Das Projekt设置程序最小化ViewController和Storyboard UI。 有关的数据源:RotationViewController.swift,Main.storyboard和MHImageEditing.swift。 情节提要中的RotationViewController的初始化和设计VC。 MHImageEditing.swift statt中的Bearbeitung des Bildes发现者。 Das gesamte UI ist im Storyboard konfiguriert。 Esgibt einen ImageView der das Bild zeigt,ein标签mit dem Winkel der Drehung in Grad,einm Slider undfünfButtons in einem StackView。 滑杆 请参见RotationViewController,以了解每个插座的滑块以及有关ValueChanged-Events的信息。 滑块的同步旋转值。 纽扣 Die Button unten,zum Drehen um einen festen Winkel,sind als Outlet Collection,mit dem jeweiligen Winkel als tag,angelegt […]

推送通知基础(2之2)

我完成了上一篇文章,总结了如何配置您的应用程序以接收推送通知,但是我没有讨论一旦这些通知到达时您可以怎么做。 所以我们开始。 除非您可以响应这些推送通知,否则向您的设备发送推送通知并没有真正的帮助。 这就是我今天将向您介绍的内容。 具体来说,以下内容: 响应用户对推送通知的操作 在前台处理推送通知 在后台处理推送通知 1和2均由UNUserNotificationCenter处理,其中3由UIApplicationDelegate严格处理。 响应用户对推送通知的操作 UNUserNotificationCenter是一个非常强大的API,它使您可以计划本地通知,配置推送通知动作以及与用户对推送通知的动作进行交互。 iOS在通知方面已经走了很长一段路,而这仅仅是帮助开发人员构建美好体验的另一层。 我们将只专注于响应用户操作。 当推送通知发送到设备时,会显示类似的内容 用户可以选择向右滑动并打开推送通知,或向左滑动并查看一些选项。 无论用户做什么,应用程序都将完全相同地处理它。 UNUserNotificationCenter具有使用方法userNotificationCenter(didReceive: withCompletionHandler:)的协议UNUserNotificationCenterDelegate 。 这是进入应用程序的入口点 。 启用此功能后,我们现在可以在后台响应远程通知。 将通知有效内容中的content-available标志设置为1可使您的应用程序知道有信息要处理,它将触发必要的应用程序委托回调方法。 func application(_ application:UIApplication,didReceiveRemoteNotification userInfo:[AnyHashable:Any],fetchCompletionHandlercompleteHandler:@转义(UIBackgroundFetchResult)->无效) 与我们通过UNUserNotificationCenterDelegate获得的UNNotificationResponse对象不同,我们在UNUserNotificationCenterDelegate获得准系统有效负载[AnyHashable: Any] 。 用户尚未与推送通知进行交互,因此动作标识符将是无关紧要的。 但是,我们得到了completionHandler 。 再次使用此完成处理程序来让系统知道任何处理已完成。 这对系统很重要,因此可以 再次终止应用程序 将应用程序保留在后台,但减少分配给该应用程序的资源量 yada yada yada有助于延长电池寿命,保持系统效率。 此完成处理程序和用户通知完成处理程序之间的区别在于其签名。 这里的完成处理程序采用UIBackgroundFetchResult ,它可以是noData , newData或failed 。 这很清楚,该处理应该是进行任何更新的快速网络调用 ,因为该应用程序没有太多的活动时间(实际上,我相信这是30秒左右)。 后台远程通知的主要动机是,当用户进入“多任务”模式时,他们可以查看每个应用程序的最新状态。 老实说,这提供了相当不错的用户体验;)。 后台远程通知处理不应与后台获取混淆,后台获取是后台工作的一个完全不同的方面。 我将在以后的文章中专门介绍后台获取。 希望您能读一读! 更多款待即将推出!

让我们建立App Store的互动过渡

新设计的App Store具有许多闪亮的新功能,但是没有什么可以与Apple在选项卡栏中添加的“今日”部分相提并论的。 它具有大量用户可能会感兴趣的信息,并添加了“ APP OFF THE DAY”,“ DAY GAME OF DAY”等类别,这是非常明智的举动,它使App Store在新加入的程序员中更具竞争力,由于用户将不再仅看到收视率最高的应用程序。 当我浏览新类别时,我对自己说:哇,这种过渡看起来令人惊讶,并且可以平滑地连接两个不同的页面。 因此,我决定自己制作一个版本。 完整的项目在本教程的最后 重新创建类似Apple为App Store“今日”类别制作的卡片。 通过使用集合视图+平移手势识别器。 该项目基于Swift 4。 只需将TransitionClone.swift复制并粘贴到您的项目中,然后将UIViewControllerTransitioningDelegate添加到要使用的Class中。 然后在上面添加两个函数。 在这里,我创建了一个名为transitionMode的枚举,目的是告诉代码我们处于什么过渡状态,如果要到Present而不是将其设置为“ present”,或者将dismiss设置为“ dismiss”,则很简单。 不要忘记设置开始帧和结束帧,例如: 对于Pan Gesture,我们将使用UIPanGestureRecognizer,其中包括诸如开始,更改,结束等状态。这将为我们提供方便的方式来操纵动画进行中的百分比。 您很快就会得到我正在谈论的内容,但是现在让我们将上面的代码添加到目标视图控制器中即可。 在Image上拖动时创建收缩的动画,请注意,由于UIViewPropertyAnimator具有暂停和恢复动画的优势,因此我们在此处不使用UIView.animate。 您可能在想为什么我们需要暂停和恢复动画? 因为我们希望动画与用户的手指互动! 换句话说就是“跟随”手指。 创建一个手势识别器并添加到UIView中,我在按钮上添加了它,但是可以将其添加到imageView上 创建panRecognizer,它应该可以正常工作。 这就是魔术的作用,在开始播放后立即暂停动画,现在我们以防万一.changed,然后跟踪手指从其初始位置拖动的垂直距离(如果要跟踪水平距离,只需更改平移。 y⇢translation.x)。 而不是将其添加到当前动画过程中(animator.fractionComplete)。 对于单次点击识别,它甚至更容易,无需添加另一个点击识别器。 只需在identifier.state = end中添加一条if语句,请参见下面的代码:) arnoldlee850807 / rebuildAppStoreTransition 通过在GitHub上创建一个帐户来促进rebuildAppStoreTransition开发。 github.com 希望您像我一样学到UIPanGestureRecognizer的惊人之处,祝编码愉快! Freepik从www.flaticon.com制作的图标已获CC 3.0 BY许可

Swift的错误处理

Seringkali,ketika ada error di sebuah aplikasi,ada 2 kemungkinan yang terjadi。 Pertama,崩溃tanpa permisi,lalu yang kedua aplikasi tidak崩溃,dan muncul pemberitahuan ke pengguna bahwa aplikasi sedang bermasalah。 Tentunya,北蒂达克(Kita Tidak Ingin)Kemungkinan Yang Pertama itu Terjadi kan吗? Penyebab Aplikasi撞车 Di dunia iOS开发,penyebab崩溃seringkali disebabkan oleh开发人员yang menulis kode程序yang tidak 安全 ,misalkan 强制转换,强制展开可选值, tidak sengaja membuat 循环依赖项 antar objek yang keduanya sama-sama memiliki […]

エラーメッセージ定义を掘り下げる

ここではSwiftのコンパイルエラーのメッセージ定义を改めて掘り下げる。 defッセージ定义は.defファイルの中でこのような形で书かれている。 错误(extra_rbrace,none, “顶级的外部’}’”,() ERRORの他にWARNING AR NOTEもあるが形は同じである。 そ利用方法に応じて様々な形に変えられる。その変换处理は#define机能を使って非常に复雑に(どこが走っているかわかりにくい状态で)行われる。 .defファイルには,それぞれ対応する.hファイルがあり,まずはそのペアのつながりで.defファイルがどう利用されるかを见ていく。 .defファイルと.hファイルのペアというの例,例えば DiagnosticsParse.def に対して DiagnosticsParse.h があるということ。 .defファイルの中身は #ifndef错误 #定义ERROR(ID,Options,Text,Signature)\ 诊断(错误,ID,选项,文本,签名) #endifそれぞれのメッセージ定义が大量#ifndef DIAG_NO_UNDEF #如果已定义(DIAG) #undef DIAG # 万一 #undef错误 #万一 となっている。ポイントを挙げると ファイルの头で, ERRORがすでに#defineされているかどうかを确认し,されていない场合には#defineを行い, ERRORをDIAGに置き换える设定をする(引数の表记は省略)。 一个々のメッセージ定义の后,最后にDIAG_NO_UNDEFの状态によりdefine状态の消去を行う。 ちなみに, WARNINGとNOTEが构造がERRORと同じなので省いてある,ここから先も同じ。 h .hファイルの中身は #include“ swift / AST / DiagnosticsCommon.h”#定义DIAG(KIND,ID,Options,Text,Signature)\ 外部详细信息:: DiagWithArguments ::类型ID; #include“ DiagnosticsParse.def” DIAGが#defineされて, extern detail::DiagWithArguments::type ID; になる。 defの后で.defファイルが#includeされる。 h,この.hファイルを読み込んだ场合は, ERROR […]

领英Hakawai。 在您的iOS Swift应用程序中实现用户提及功能。

嗨,欢迎来到我的iOS开发小博客。 在本文中,我想向您介绍如何在以Swift编写的iOS应用程序中实现提及。 我确信有很多方法可以实现此功能,但是我在这里写这篇文章是为了以更简单的步骤实现它。 当然,您可以从库的页面https://engineering.linkedin.com/ios/introducing-hakawai-powerful-mentions-enabled-text-view-ios中查看官方文档,但是我认为这已经过时了。 我花了一些时间在Swift中实现提及插件的功能。 这篇文章并不伪装成确切的文档,但最后,您将在iOS Swift应用中实现提及未来。 另外,我将展示如何实现自定义选择器视图。 因此,在不浪费更多时间的情况下,让我们更深入地研究这些步骤。 实施HAKAWAI的基本步骤提到了未来: 如果要在同一视图控制器类中实现textView委托功能,请使用HKWTextView实例创建UIViewController并将其externalDelegate属性分配给该视图控制器。 创建一个符合HKWMentionsEntityProtocol的类,以返回实体进行搜索并提及数组; 创建一个帮助程序类,以实现HKWMentionsDelegate中提到的必需功能; 将HKWMentionsPlugin实例的委托属性分配给您的助手类的实例; 设置textView实例的controlFlowPlugin以注册该插件。 因此,让我们更深入地研究每个步骤。 首先,创建一个UIViewController,将UITextView从对象库拖到控制器中,并将该类分配给HKWTextView 现在,创建一个名为User的新类,使他实现HKWMentionsEntityProtocol 您会看到一个错误,指出您的类不符合HKWMentionsEntityProtocol,但请放心,我们将修复它。 如果您转到HKWMentionsEntityProtocol的声明,则会看到它具有3个必须实现(返回)的必需属性。 因此,只需实施即可。 如果您喜欢我喜欢的Swift扩展,只需编写一个,并在此扩展中实现所需的功能,否则,您可以直接执行。 Swift扩展是语言的美好未来,它使您可以按逻辑对代码进行分组,您可以在这里阅读更多内容:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html 在上面的代码中,我们声明了基本的用户字段并在扩展中实现了协议。 我们只是以这种方法返回字段。 注意,对于实现entityMetadata而言,这不是必需的,仅作为示例,您可以在此处放置所需的内容。 和用于创建实体的基本构造函数。 注意,如果您已经具有要在提及列表中包含其实体的类,则可以为模型类进行扩展并实现这些方法。 现在,我们将创建一个符合HKWMentionsDelegate的帮助程序类。 您可以将其称为MentionsManager或任何您想要的名称。 我们创建了MentionsManager类,并在此处声明一个静态实例,以供将来注册IM提及插件时使用。 在扩展中,我们实现HKWMentionsDelegate 。 我们创建了MentionsManager类,并在此处为提及插件中的将来注册声明了一个静态实例。 在扩展中,我们实现HKWMentionsDelegate。 它包含3个需要实现的必需方法。 这些方法是asyncRetrieveEntitiesForKeyString,cellForMentionsEntity和heightForCellForMentionsEntity,这些方法的详细信息可以在协议中阅读,但简称为: asyncRetrieveEntitiesForKeyString-在这里,您应该提供用户键入到textview中的某些键串的数据。 在此方法的最后,您应该调用completionBlock并将符合HKWMentionsEntityProtocol协议的数据传递给ID,并根据是否希望稍后附加其他结果而传递YES或NO。 cellForMentionsEntity —返回要在选择器视图中显示给定提及实体的表视图单元格。 如果使用默认选择器视图,则为true,但如果要使用自定义视图,则可以只返回nil。 heightForCellForMentionsEntity -最后一个,正如我从标题中所清楚看到的那样,返回被提及实体的高度。 在上面的屏幕截图中,在asyncRetrieveEntities方法中,我们刚刚创建了一个包含两个用户实体的数组。 这是一个基本示例,但是您可以在此处从某个存储库层类加载数据。 在cellForMentionsEntity方法中,我们只需要在表视图中注册单元格(UserTableViewCell),然后将其出队并设置nameL(UILabel)属性以显示实体名称,该实体名称是我们从方法entityName()返回的🙂 注意,这里的UserTableViewCell只是一个自定义单元格,我想用来展示如何实现自定义选择器视图。 最后在heightForCellForMentionsEntity方法中返回44.0。 关于HKWMentionsDelegate中所需方法的所有内容。 我们需要做的最后一件事是创建插件实例并设置其属性。 我们创建了用于显示提及选择器视图的模式,然后当用户键入此(或其中一个)符号时,我们创建了控制字符,我们应该显示建议列表。 然后我们使用这些属性以及不同模式的颜色创建插件。 将新创建的插件分配给我们的var,然后在我们的textview中注册插件,最后将委托属性分配给我们的MentionsManager共享实例。 因此,让我们构建应用程序并查看结果。 […]

RxSwift:Swift中的反应式编程

RxSwift是iOS的反应式编程库。 它使对响应应用程序中的数据更改和用户事件的动态应用程序进行编程变得容易。 为什么使用它: 多平台 简化多线程 可比较的组件。 清洁代码与架构 因为您可以用一种优雅的方式处理异步问题。 因为您可以编写更好,更简洁的代码,并创建可以在健壮的代码库中重用的组件,所以这些代码库可以不断发展。 缺点: 一开始,学习过程可能会令人生畏–没有一篇文章可以教您RxSwift 内存管理问题-如果您不小心闭包内部的自引用,很容易造成内存泄漏 考虑到堆栈跟踪要大得多,调试可能很难 最后的话: 选择应用程序的隔离部分,然后将其迁移到反应式 支持MVVM和MVC的最佳架构 为什么要使用RxSwift? : 因为您可以用一种优雅的方式处理异步问题。 因为您可以编写更好,更简洁的代码,并创建可以在健壮的代码库中重用的组件,所以这些代码库可以不断发展。 您应该一直使用它吗? 作为任何工具,如果适合,则应使用它。 考虑您的团队知识,背景,时间表,并尝试做出有根据的决定。 从长远来看,我认为值得付出努力。 阅读更多:https://medium.com/@leandromperez/why-use-rxswift-a176b553a705 建议〜慢点RxSwift : 将RxSwift应用于项目时,不要全力以赴。 选择应用程序的隔离部分,将其迁移到响应式,然后权衡此新方法的优点,区别,优点和缺点。 阅读更多:https://techbeacon.com/reactive-programming-rxswift-how-get-started

WatchOS 5-Swift上iPhone和Apple Watch之间的通信,反之亦然-第1部分

你要学什么? 使用WKInterfaceTable和管理为Apple Watch制作一个小界面 IBActions-第一部分 使用sendMessage(_:replyHandler:errorHandler 🙂从Apple Watch向iPhone应用程序请求信息—第2部分 从iPhone向Apple Watch发送信息sendMessage(_:replyHandler ) —第3部分 重构我们的代码, 以便在一处管理WCSession 。 —第4部分 使用updateApplicationContext(_ 🙂更新应用程序—第5部分 首先,我们需要一些关于可能性和可能性交流场景的理论: —关于与对方应用进行通信 您可以通过以下任意一种方式启动传输和通信: 🎓Apple 官方文件 –使用updateApplicationContext(_:)方法将最新状态信息传达给对方。 当对方唤醒时,它可以使用此信息来更新其自身的状态。 例如,支持后台应用刷新的iOS应用可以使用其后台执行时间的一部分来更新相应的Watch应用。 此方法将覆盖以前的数据字典,因此当您的应用程序仅需要最新的数据值时,请使用此方法。 –使用sendMessage(_:replyHandler:errorHandler:)或sendMessageData(_:replyHandler:errorHandler:)方法将数据传输到可访问的对应对象。 这些方法用于在iOS应用和WatchKit扩展之间进行即时通信。 当前, isReachable属性必须为true才能使这些方法成功。 –使用transferUserInfo(_:)方法在后台传输数据字典。 您发送的字典排队等待传递给对方,并且在当前应用被暂停或终止时,传输继续进行。 –使用transferFile(_:metadata:)方法在后台传输文件。 如果您要发送的不只是值字典,请使用此方法。 例如,使用此方法发送图像或基于文件的文档。 –在iOS中,使用transferCurrentComplicationUserInfo(_:)方法发送与Watch应用程序并发症有关的数据。 使用此方法会影响并发症的时间预算。 —好吧,现在您知道苹果在两个平台之间进行通信提供了不同的可能性,我们可以开始开发一系列有关如何使用其中最重要的一些教程– 建立新专案 我们将创建一个新项目,为“ 带有WatchKit App的iOS App ”选择模板,并继续执行基本步骤来创建它。 苹果手表界面 现在,我们将为由WKInterfaceTable和WKInterfaceButton组成的Apple Watch创建一个小界面,一个界面紧挨另一个。 接下来,在Table内部,我们将插入WKInterfaceLabel并将其行数设置为0。 表类和标识符 转到界面生成器上的TableRowController项,并将其放入类名,在我的情况下为Row并作为标识符设置相同的名称。 应该与下一张图片具有相同的外观 界面构建器连接 现在,将表从Interface Builder中连接到InterfaceController中的代码,并且还连接按钮的IBAction 。 […]

IOS面试常见问题解答(2018年9月)第3部分

iOS面试题2018 Q1。 您有一个iOS应用程序处于前台,用户在iPhone上按“主页”按钮,将调用UIViewController的哪个API,并按正确的顺序进行描述? 解决方案: ViewWillDisappear-> ViewDidDisappear 加载视图控制器的方法有以下三种: 要从情节instantiateViewController(withIdentifier:)加载视图控制器,请调用相应的UIStoryboard对象的UIStoryboard instantiateViewController(withIdentifier:)方法。 要使用nib文件初始化视图控制器对象,请以编程方式创建视图控制器类,然后使用init(nibName:bundle:)方法对其进行init(nibName:bundle:) 。 使用loadView()方法为视图控制器指定视图。 在该方法中,以编程方式创建视图层次结构,并将该层次结构的根视图分配给视图控制器的view属性。 Q2。 什么是固有内容大小? 解决方案 :具有基于内容大小的自然大小的视图称为其固有内容大小。 例如,按钮的固有内容大小是其标题的大小加上很小的空白。 Q3。 什么是内容拥抱,抗压缩性,您能否说出视图的默认值? 解决方案 :自动版式使用每个尺寸的一对约束来表示视图的固有内容大小。 内容拥抱将视图向内拉,使其紧贴内容周围。 压缩阻力将视图向外推,因此它不会剪切内容。 这些约束中的每一个都有其自己的优先级。 默认情况下,视图使用250优先级表示内容,并使用750优先级表示抗压缩性。 因此,拉伸视图比收缩视图更容易。 Q4。 考虑以下情形:考虑应用程序中的图像详细信息页面,该页面相对于Superview定位。 但是在iPhone X上,即使此特定视图使用“自动布局”,页面控件在屏幕底部的位置也太低了。 它正在运行到“主页”指示器中。 您将如何解决这个问题? 解决方案 :这里的问题是页面控件的底部约束是相对于超级视图的,超级视图是全屏显示,并且位于“主页”指示器后面。 除了限制超级视图,我们还应该将页面控件限制在底部的“安全区域”布局指南中。 如果我们将其更改为连接到“安全区域”,而不是“超级视图”,那么在iPhone X上,页面指示器将自动向上移到“主页”指示器上方。 Q5。 什么是View自动布局生命周期? 解决方案:在自动布局周期中初始化UIView之后,需要执行3个步骤。 更新通过 (根据其约束计算视框) 系统从上到下 (即从超级 视图到子视图 updateConstraints()遍历视图层次结构,并为每个视图调用updateConstraints() 。 布局阶段 (每个视图的框架都使用在“ 更新”阶段中计算出的矩形进行更新 。) 它是自下而上发生的 ,即系统将视图从子 视图遍历到超级视图,并为每个视图调用layoutSubviews […]