Tag: Swift 4

掌握CoreData(第13部分,多线程并发策略通知)

Core Data支持两种流行的策略,即通知和父子托管对象上下文。 在本部分中,我们将仅查看Notifications。Apple不建议使用此策略,因此我们将不做进一步的介绍。 通知类型 托管对象上下文发布了三种类型的通知,以通知对象在托管对象上下文中发生的更改 NSManagedObjectContextObjectsDidChangeNotification:当托管对象上下文的一个托管对象已更改时,将发布此通知 NSManagedObjectContextWillSaveNotification:在托管对象上下文执行保存操作之前发布此通知 NSManagedObjectContextDidSaveNotification:在托管对象上下文执行保存操作后发布此通知 注意:仅当您在上下文上调用save()方法时,这些通知才会发布。 当您调用save()方法WillSaveNotification和NDidSaveNotification通知 肯定会调用,而DidChangeNotification仅在您实际在上下文中进行了某些更改时才调用。 当托管对象上下文通过持久性存储协调器将其更改保存到持久性存储时,其他托管对象上下文可能希望了解这些更改。 这很容易做到,甚至更容易将更改包含或合并到另一个托管对象上下文中。 注意:如果您正在执行NSBatchUpdateRequest / NSBatchDeleteRequest,这些通知将不会触发( 暂时忽略) 处理通知 在此处下载启动项目,如果您已经先删除了该应用程序 我们可以通过在NotificationCenter添加观察者来观察这些通知,如图1所示。 如您在图2中看到的,我们处理了DidChangeNotification 只。 notifications只是整个故事的一半。 如您所见,所有观察者方法都是通过通知对象传递的。 通知对象具有一个userInfo实例属性,该属性在Dictionary中保存所有信息。 这些都是用于检索更改的数据的键 NSUpdatedObjectsKey密钥包含所有更新的NSManagedObject 。 NSInsertedObjectsKey密钥包含所有插入的NSManagedObject 。 NSDeletedObjectsKey密钥包含所有已删除的NSManagedObject 。 NSRefreshedObjectsKey密钥包含所有刷新的NSManagedObject 。 插入盒 如您所见,我们在图3中插入了User对象。 执行save()方法时将触发通知 正如您在图4中看到的那样,由于我们在图3中插入了对象,这意味着将首先DidChangeNotification上下文中的更改,而DidChangeNotification将触发,并且我们对此进行了处理,这就是在控制台中打印出插入对象的原因。 之后, WillSaveNotification和DidSaveNotification通知将依次触发,并且由于我们未在选择器方法中执行任何操作,因此将不会发生任何事情。 如图4所示,我们在图3中插入的用户被打印在控制台上。 更新案例 如图5所示,我们获取了刚才插入的User对象,并在我们调用save()方法时更新了它的值。Notification handler打印了Updated值。 我们通过执行以下操作来完成此操作 从appdelegate单例对象引用persistentContainer 从persistentContainer创建/访问单例托管对象上下文 添加了托管对象上下文观察器以侦听上下文事件 我们刚刚从持久性存储中插入的Fetched User并更新了它的firstName和secondName属性,如图5所示。 在主上下文中使用save方法执行对持久性存储的提交 通知DidChangeNotification 方法在控制台中打印更新的值 之后, WillSaveNotification和DidSaveNotification通知将依次触发,并且由于我们未在选择器方法中执行任何操作,因此将不会发生任何事情 […]

Swift’te嵌套函数Kullanımı

Swift’teaşağıdakigibifonksiyonlarımızvar。 func birSeyYap(){ } func baskaBirSeyDahaYap(){ } Bu iki fonksiyonuiçeyazdığımızdabuna嵌套函数diyoruz。 Nasılmı? func birSeyYap(){ func baskaBirSeyDahaYap(){ } } 常见问题解答Birincisiningövdesiolmuşdurumda。 Başkabirörneğebakalım。 func isimAl(_ isim:String){ func selamSoyle(){ 打印(“ Selam \(isim)!”) } } isimAl(“ Ali”) Yukarıdakikodbloğunuçalıştırdığımdabeklediğimsonucualamıyorum。 Çünkü,ikinci fonksiyonutanımladımamaçağırmadım。 func isimAl(_ isim:String){ func selamSoyle(){ 打印(“ Selam \(isim)!”) } selamSoyle() } isimAl(“ Ali”) Peki bu selamSoyle fonksiyonunubaşkabir yerde kullanabilir miyim diyedüşünüyorumamaaklıma范围geliyor。 […]

Swift 100天:项目5 –提示计算器

环境:Swift 4 /日期:5 /日期:2017年10月21日/时间:1.5小时 我学到什么: ・ MVC模式 ・模型中的手柄计算 ・键盘添加“完成”按钮 ・从滑块获取价值 Github原始码:这里 小知识: 开发者踏过超级新手之后,下一步即要针对架构的问题,先推荐给大家文章 建立MVC: Model-View-Controller (简称MVC)是Cocoa框架的一部分,并且毋庸置疑是最常用的设计模式之一。它可以帮你把物件根据工作进行划分和归类。 作为划分依据的三个基本职责是: 模型层(Model):存储数据和定义如何操作这些数据。 透视层(View):负责模型层的显示,和负责用户的互动,一般来说都是继承自UIView这个父类别。 控制器(Controller):控制器是整个系统的掌控者,它连接了模型层和数据层,并且把数据在视图层展示出来,监听各种事件,负责数据的各种操作。 实际面:Controller的部份,明显的肥大,那是因为他除了要对事件导致相对应的逻辑判断之外,还要处理到一些应该是View要处理的问题。因此,许多iOS开发者会选择MVVM,在MVC架构之上,MVVM将阶层切分得更干净,有兴趣请看浅谈MVVM架构,这边就不多余述。 心得: 每个人都会累,没人能为你承担所有悲伤,人总有故障要学会自己长大。 欢乐星期六,白天狂嗑冰与火之歌,无法自拔,晚上花一小时通勤回老家(周末都会回家一趟),优先不中断健身房,固定的运动,坚定的工作,稳定的心情。只是现在,又已深夜,还在啃我的100天;( 我感觉就像这只狗…让我睡觉。 随便我吧。 突然发现,好像没有放松的空间。 总之,今天有点累,给自己压力,最终还是完成任务了,至少入眠前,是满足的释放。思考今天是不是不应该放纵,买了白天的自由,换来晚上的落魄。 近期在找工作,原本只打算选个实习也罢,一边准备出国工作/研究所,但身为工作狂代言人之一,面试后获得一些报价后,有了疯狂的想法:一个正职+一份实习+原本的实习+ Chatbot专案。 有约莫三日的考虑时间,好好想一想,评估一下,毕竟还是别在还没立起自己的招牌前就先把招牌砸了!有些不久即会初步完成,有些则是才刚开始,权衡了时间,如果没有意外,是可以扛下的,加速自己的成长。 说实话,还是有点担心自己做这样的决定,因为这种无敌密集的生活,也不是第一次,以往,虽然很累很干,但总是能咬牙撑过,而那些事情往往是自己非常讨厌的杂事工,如: 在学校大四期间,毕业委员会要每个系都推派一个毕委员会代表(标准累死杂事工人),理所当然没人有意图,我只好硬着头皮去了,接着各个的时候去了团照组,本来应是可以轻松的一组,只要要么你不是总召集,大家都重复同样的心态,所以我还是硬着头皮当了,接下来非常痛苦的度过一年,处理全校几千人的团照。 例子,不胜枚举,总是有这样的使命感,只要觉得生命没被填满,心情总是空。毕竟,生命如流水,只有在它的急流与奔向前去的时候,才美丽,才有意义。

Swift-Fileprivate ve openErişimBelirleyicileri Nedir,Ne Yaparlar?

Merhabaarkadaşlar, 苹果,苹果公司迅捷3’le birlikte fileprivate ve openerişimbelirleyicilerini dile dahil etti。 fileprivateErişimSınırlayıcısınedir ?, ne yapar吗? fileprivate’i anlatmadanönce私人erişimbelirleyicisi ne idihatırlayalım。 ☺️ 私人 erişimbelirleyicisi,方法论vb。 tamamen scope’dakullanılabilirkılar。 fileprivate eribel belirleyicisininamacıdeğişkenintanımlandığı作用域dışındaaynıdosyaiçerisindetanımlananbirdiğer类(sınıf)/扩展名( uzantı )tarafındanerişilmesidir。 Diyeceksiniz ki public negüneduruyor,onukullanırsamzatenaynıdosyaiçerisindeerişebilirim… Yanlış , neden mi? 公共尺寸istediğinizerişimseviyesininçokdahafazlasınısunuyor。 Ancak sizin bunaihtiyacınızyok,tanımladığınız私人değişkeninaynı类içerisindefarklı 类 / 延伸 tarafındankullanılabilirolmasınıistiyorsunuz,buununiçinfileprivate。 😎 打开ErişimSınırlayıcısıNedir,Ne Yapar吗? Aynışekildeburada da openerşimsınırlayıcısınıanlatmadanöncepublicerşimsınırlayıcısıüzerindenilerlemeninanlatımınyalınveözolmasıaııııııııııııını 🤪 公共 erışimsınırlayıcısıtümmodültarafındaerşilebilirdurumdadır,ancak ikimodülkullanıldığıdurumlarda altsınıflarda( 公共 […]

Swift 4 —动画NSLayoutConstraints:简单菜单

Swift 4(iOS)中的动画,我们可以使用多种方法来制作UI元素或过渡的动画。 我们可以使用Transform方法,CGRect,CGPoint甚至约束。 可以将动画代码添加到动画代码内部,该代码通常为UIView.animate(_ :)或UIView.animateKeyframes(_ :)。 由开发人员选择。 视频教程已添加到此处-SwiftDynamics YouTube频道。 在这里,我将向您展示如何使用UI元素的NSLayoutConstraints对象为UI元素设置动画。 NSLayoutConstraints对象可以是任何值,即; 高度,宽度,中心约束,顶部空间,底部空间,尾随或前导空间等。让我们深入研究示例。 我们将使用我在本文中创建的TableView应用程序:快速4的视差效果。 首先,在顶部菜单栏顶部的UIView。 让我们为其添加约束。 高度和宽度可以添加如下, 下一步是为按钮添加顶部空间和结尾空间约束。 将最高约束优先级更改为999 现在为UIView对象添加底部空间,并将其优先级设置为999 。 将值设置为40。 您可能会在情节提要中发现错误,而忽略它。 让我们为ViewController类的顶部和底部约束创建对象引用。 现在,在`scrollView`的`scrollViewDidScroll(_ :)`中添加用于更改菜单按钮底部和顶部约束的代码。 func scrollViewDidScroll(_ scrollView:UIScrollView){让contentOffset = scrollView.contentOffset.y-oldContentOffset.y如果contentOffset> 0 && scrollView.contentOffset.y> 0 {//向上滚动 if(menuUpConstraints.isActive){ menuBottomConstraints.isActive = true menuUpConstraints.isActive =否 animateConstraints() }} if contentOffset <0 && scrollView.contentOffset.y <0 {//向下滚动if(!menuUpConstraints.isActive){ menuBottomConstraints.isActive =否 menuUpConstraints.isActive = true […]

升级项目以支持Xcode 10和Swift 4.2

将项目升级到Xcode 10.1和Swift 4.2可能会导致错误和警告,因为Swift 4.2已重命名了常量,函数和类型。 当您在Xcode 10.1中打开Xcode 9项目时,您会在Xcode 10中看到一条警告消息,要求进行Swift转换。 除了使用Swift转换器,我们还可以手动进行转换: 首先,您需要在项目目标的“ 构建”设置中更改Swift语言版本。 默认情况下,Xcode 10支持Swift 4.2版本。 Xcode 10支持以下Swift版本:v3,v4,v4.2 我们可以看到一条警告消息来更新项目设置,单击“ 执行更改” 升级到Swift 4.2: 框架更新 套料 1.类型 2.常数 3.功能 嵌套类型: UIApplicationState: UIApplicationState转换为嵌套类型,如下所示—状态嵌套在UIApplication中。 UITabBarItemPositioning: ItemPositioning嵌套在UITabBar中。 嵌套常量: 通知:通知名称嵌套在UIApplicaiton中。 UIFloatingRange: UIFloatRangeZero和UIFloatRangeInfinite嵌套在UIFloatRange中。 嵌套函数: 插图和图像: UIEdgeInsetsInsetRect和UIImagePNGRepresentation嵌套在实例方法内部。 字符串转换: CGPoint,CGSize,CGRect等使用JSONEncoder进行编码,并且可以使用JSONDecoder进行解码。 注意:—引用自WWDC 2018 会议202 。 以下是其他错误: “ UIApplicationLaunchOptionsKey”已重命名为“ UIApplication.LaunchOptionsKey” “ UIApplicationOpenURLOptionsKey”已重命名为“ UIApplication.OpenURLOptionsKey” UIViewController的实例方法addChildViewController()已重命名为addChild() UIViewController的实例方法didMove(toParentViewController:)已重命名为didMove(toParent:) “ UIControlState”已重命名为“ UIControl.State” […]

自动关闭,作为参数的关闭,尾随关闭和Swift开罗

您可能要略过,这只是一个介绍。 我一直在与一个我要在开罗建立的新社区进行在线课程:Cairo-Swift,并且我们一直在进行在线活动,以阅读一个开源项目并了解其来龙去脉,所以每个人可以从该项目及其构建过程中学到一些东西。 该建议是由我们的一位成员提出的,因为她受到这次演讲的启发:https://www.youtube.com/watch?v = mW_xKGUKLpk 我自己没想到它会这么有用,我真的很感谢迄今为止的进展以及我们每周要经过的信息和搜索量,而这个博客确实是其中的一项特权! 我自己选择了要进行的第一个项目,因为我们是聚会,所以我选择了trySwift的聚会应用,这是一个很好的灵感,也许我们迟早可以为我们的社区构建类似的东西! 通过代码,我们发现了重复的代码,我建议我们可以通过使用泛型来将其修改为更好的版本,我最近一直在与他们一起玩,并且有点像锤子一样使用它,所以让我们看看它在哪里走! 基本代码是: func showAbout(){让aboutViewController = AboutTableViewController()performSegue(withIdentifier:moreDetailSegue,发件人:aboutViewController)} webViewController = WebDisplayViewController()webViewController.url = URL(字符串:conference.codeOfConductURL)! webViewController.displayTitle =“行为准则”。localized()performSegue(withIdentifier:moreDetailSegue,发送者:webViewController)} func showOrganizers(){让organizerViewController = OrganizersTableViewController()performSegue(withIdentifier:moreDetailSegue,发送者:organizerViewController)} func showLibraries() {let path = Bundle.main.path(forResource:“ Pods-trySwift-acknowledgements”,ofType:“ plist”)let ConfirmationesViewController = AcknowListViewController(acknowledgementsPlistPath:path)ConfirmationesViewController.edgesForExtendedLayout = [] confirmmentesViewController.headerText =“我们❤️打开源代码软件”。localized()performSegue(withIdentifier:moreDetailSegue,发送者:confirmationesViewController)} 你能发现吗? 这是使用特定控制器和String ID执行segue的重复代码,因此让我们将其转换为通用函数吗? func navigationTo (_ withType:T.Type,id:String =“ moreDetailSegue”){ performSegue(withIdentifier:id,发件人:T()) } //称呼它 navigationTo(UIViewController.self) 最初,我尝试使用T.initialize()碰壁,这是通过Xcode自动完成来完成的,而.init()甚至simple()根本不显示,花了大约15分钟的时间来尝试找出问题所在用我的代码,我去看了关于该功能的苹果文档,但我完全不了解。 只是一个奇怪的函数,不会像我想的那样初始化! 上面的函数将摆脱上面的几个函数,并保留最后两个,那么我们如何改进呢? […]

后台音频播放器同步控制中心

在本教程中,您将创建一个能够在后台模式下播放音频并与Control Center中的音乐控件同步的播放器。 特征: 播放声音文件。 使声音在后台模式下继续播放。 从控制中心控制音频。 处理完成。 处理中断。 处理路线更改。 如果您遇到任何问题,可以在这里下载完整的源代码项目,然后再使用每个功能。 1.播放声音文件 要播放声音文件,您需要初始化播放器。 阅读以下文章以了解有关AVAudioPlayer的信息: AVAudioPlayer 音频播放器,可播放文件或内存中的音频数据。 将以下块代码添加到视图控制器中以初始化播放器: 您还需要准备一个mp3文件进行测试。 要播放mp3文件,请按如下所示调用play()方法: player.play() 现在,您可以从导入的文件中听到声音。 但是,当您按“主页”按钮将应用程序移至背景模式时,声音已被静音。 因此,我们需要让它在下一指南中继续在后台模式下播放。 2.使声音在后台模式下继续播放 要使声音在后台模式下继续播放,您需要阅读以下文章: AVAudioSession 与系统通信的中介对象,您打算如何在应用程序中使用音频。 启用背景音频 配置您的应用,使其在进入后台时继续播放音频。 如下替换AppDelegate.swift文件的application(_:didFinishLaunchingWithOptions:)方法以配置音频会话: 现在运行该应用程序,播放声音,然后按“主页”按钮将应用程序移至背景模式,并检查声音是否仍继续播放。 3.从控制中心控制音频 阅读以下文章,了解如何从“控制中心”和“ iOS锁定”屏幕控制背景音频: 控制背景音频 支持从控制中心和iOS锁定屏幕控制背景音频。 将以下方法添加到视图控制器中,并从viewDidLoad()方法调用setupRemoteTransportControls() , setupNowPlaying() viewDidLoad()方法: 现在运行该应用程序,打开“控制中心”并进行检查。 4.处理完比赛 音频播放器播放完毕后,您需要更新nowPlayingInfo和UI。 要接收此事件,您需要实现AVAudioPlayerDelegate协议的audioPlayerDidFinishPlaying(_:successfully :)方法,并如下更新setUpPlayer()方法: 运行该应用程序并进行检查。 5.处理中断 在后台模式下播放时,如果打来电话,则声音会静音,但在挂断电话时,声音不会自动继续播放。 因此,我们需要阅读以下文章来处理这些中断事件: 响应音频会话中断 直接观察音频会话通知,以确保您的应用响应中断。 在中断结束时添加以下代码片段以自动播放: 现在运行该应用程序并进行测试。 6.处理路线变更 现在,当您将耳机插入手机时,声音将在耳机上发出。 但是当您拔下耳机插头时,声音会自动继续在内置扬声器上播放。 […]

3D触控-多点触控手势

▪如何添加预览动作 在这里,我们在“喜欢,评论和删除”项目上执行了“窥视和弹出”操作时添加了3个预览动作。 单击每个预览操作后,您可以为您提供要执行的方法。 覆盖var PreviewActionItems:[UIPreviewActionItem] { let likeAction = UIPreviewAction(title:“ Like”,style:.default){(action,viewController)->在 打印(“你喜欢这张照片”) //您的代码动作 } let commentAction = UIPreviewAction(title:“ Comment”,style:.default){(action,viewController)->在 打印(“发表评论”) //您的代码动作 } 让deleteAction = UIPreviewAction(title:“ Delete”,style:.destructive){(action,viewController)->在 打印(“您删除了照片”) //您的代码动作 } 返回[likeAction,commentAction,deleteAction] } 3D Touch是向您的应用程序添加令人愉悦的功能的好方法。 从GitHub https://github.com/nehasharma1101/3DTouch获取代码。 您如何看待本教程? 希望听到您的反馈。 在以下位置关注我: 推特 | GitHub | 领英

iOS- Swift 4.2 —使用键盘工具栏的箭头按钮,按顺序导航到文本字段。

iOS- Swift 4.2 —使用键盘工具栏的箭头按钮,按顺序导航到文本字段。 下面的TextFieldNavigation类将使用键盘箭头处理文本字段的移动。 2)使用带有六个文本字段的scrollView设计一个视图控制器。 3)在ViewController类中,我们将文本字段链接到TextFieldNavigation类(我们将所有文本字段按顺序存储在数组中,并将其传递给具有数组的TextFieldNavigation类) textFieldNavigator?.textFields = [firstTextfield,secondTextField,thirdTextfield,fourthTextfield,thirdTextfield,thirdTextField] GitHub链接:https://github.com/yugandh/TextFieldNavigationFromKeyboard 结论: 这是帮助您在ViewController中使用多个文本字段的项目中的一种简便方法。