Tag: Objective C

消息传递在Objective-C中如何工作–刘关山–中等

消息传递在Objective-C中的工作方式 调用Objective-C方法时,该方法将转换为objc_msgSend函数。 objc_msgSend是objc / message.h文件中定义的C函数。 第一个参数是接收的Objective-C对象本身,第二个参数是选择器,其余参数是传递给Objective-C方法的参数。 该过程称为消息传递。 objc_msgSend函数确定在运行时如何处理到接收对象的消息。 大致是objc_msgSend函数的工作方式: 如果接收对象为nil,则将消息重定向到nil接收器(如果有)。 默认行为是什么也不做。 检查类的缓存。 如果实现已被缓存,请调用它。 将选择器与类中定义的选择器进行比较。 如果找到匹配项,则调用匹配的实现。 否则,请检查其超类,直到没有超类为止。 呼叫+ resolveInstanceMethod: / + resolveClassMethod : 。 如果返回“是”,则表示选择器将解决这个问题。 因此,请转到步骤2并重新开始。 在这里,您可以调用class_addMethod来动态提供给定选择器的实现。 致电-forwardingTargetForSelector:。 如果返回非零,则将消息发送到返回的对象。 请注意, 此处返回自身将导致无限循环。 调用– methodSignatureForSelector : 。 如果返回非nil,则创建一个NSInvocation实例,并将其传递给-forwardInvocation:。 找不到指定选择器的实现。 它将在接收对象上调用– didNotRecognizeSelector:。 默认实现会引发异常。

设置Swift和Objective-C互操作性

3.在此处添加要在swift类中使用的Objective-C类的导入头。 将头文件包含在Bridging头文件中后,就无需将其重新导入到任何Swift文件中。 可以在项目中的所有swift文件中访问它。 现在,您选择的Objective-C对象可用于您的快速班!! 做得好!! 使用Swift和Objective-C时要谨记的事情 Swift和Objective-C有一些根本的区别,在使用两种语言进行工作时,需要牢记一些非常重要的事情。 为了使从一种语言到另一种语言的过渡最顺畅,最好记住它们的独特功能。 Swift和Objective-C之间的区别 如果swift类中的方法或变量没有出现在Objective-C文件中,则可能是因为Objective-C不支持确定该方法或变量的特定功能。 以下是在Objective-C中不可用的Swift功能的简短列表:在swift中定义的元组,泛型,任何全局变量,结构,类型别名或枚举,以及顶级swift函数。 解决这个问题的一种方法是创建一个包装器类,该包装器类可以处理这些不可用的功能,并在与Objective-C类进行交谈时被调用。 子类限制 局限性之一是无法从子类快速分类。 Swift对象可以具有Objective-C类的子类,例如NSObject。 但是,快速类不能成为Objective-C类的基础类。 种类 幸运的是,objective-C类型和swift类型彼此之间具有很好的对应性,并且可以跨语言很好地进行翻译。 选装件 可选状态是Objective-C和Swift之间在功能上非常重要的区别。 当您从Objective-C将参数传递给Swift类时,Swift必须知道变量的可选状态。 在Swift中,任何事物都可以保持未定义状态,甚至可能为零。 由于Objective-C不满足此要求,因此传入的参数可能会自动后面跟一个!。 或爆炸符号,或其他更严重的问题和错误可能会发生。 理想情况下,您应该设置某种方式来检查要快速传递的每个变量的可选状态。 将属性传递给swift时,您可以采取的一种初步措施是在Objective-C类文件中从一开始就声明非null或可为null。 @属性(非原子,强,非空)NSString * name; 这使swift文件知道该变量在收到后不会为null。 作为捷径,您还可以指定整个文件为非空或可为空。 在文件的@interface之前添加以下行。 NS_ASSUME_NONNULL_BEGIN 然后在@end之后添加下一行。 NS_ASSUME_NONNULL_END 感谢您的阅读! 有用的链接和来源: 将Swift与Cocoa和Objective-C(Swift 3.1)结合使用:基本设置 描述Swift与Objective-C语言和Cocoa / Cocoa Touch框架的兼容性的各个方面。 developer.apple.com Swift和Objective-C:永远的好朋友? 我们很高兴在我们的SLUG聚会上欢迎Jonathan Blocksom。 经验丰富的行业资深人士,乔纳森(Jonathan)具有真正的… realm.io 将Swift与Cocoa和Objective-C(Swift 3.1)结合使用:与Objective-C API交互 描述Swift与Objective-C语言和Cocoa / Cocoa […]

可可豆:依赖管理变得更容易

您需要了解的所有有关豆荚的信息。 什么是CocoaPods “ CocoaPods是Swift / Objective-C项目的依赖项管理器。 它具有成千上万的库,可以帮助您优雅地扩展项目。”通过http://cocoapods.org 本质上,它可以帮助您将第三方库,框架整合到您的产品中,而不必担心如何设置它们和配置项目,这有时可能会很麻烦。 为什么要装豆荚? 为什么不Git? •由于库是第三方的,因此每次有新版本时,您都必须下载并将它们复制到您的项目中吗? 可以说,您的项目中有10个库或框架,现在想象一下您将花费多长时间检查其中是否有任何要更新的新版本? 最糟糕的是,如果某些操作不起作用,您需要还原到以前的版本吗? 这确实需要时间,而且很麻烦,使用CocoaPods只需键入pod update并更新具有可用的较新版本的Pod。 •现在是否要使用某个特定库的v1.1? 快速浏览Git提交历史以找出所需的那一个,这有多容易? 使用CocoaPods,您只需说出Pod’AFrameworkLib’,’1.1′ •每个库都需要使用一组特定的配置来设置您的项目,以使其正常工作,并为10个左右的库完成该工作,然后解决冲突本身就是痛苦。 使用CocoaPods,它会自动得到照顾。 •最后但并非最不重要的一点是,您必须包括所有用于向该库的原始开发者提供功劳的第三方库的许可证。 想像一下要复制10个许可文档并确保它们是最新的? CocoaPod在您的项目中自动创建一个确认文件,您可以在其中适当地添加一个确认文件。 通过 http://stackoverflow.com/questions/22261124/what-is-cocoapods 吊舱如何工作? 依赖关系列在pod文件中。 当触发pod update / install命令时,列出的pod被安装,并且CocoaPods创建一个新的项目文件,即.xcworkspace文件,其中列出了所有pod。 这使它更易于使用,但也减少了错误证明。 如何安装吊舱? 吊舱的安装非常简单,这使吊舱如此流行。 您可以通过4个简单的步骤安装Pod。 安装gems:从终端启动[sudo gem install pods] ,将安装gems。 制作pod文件:使用终端在项目目录中创建一个名为Podfile的文本文件,或者使用cocoa pods应用程序并将Pod添加到您的应用程序中。 搜索要添加的广告连播:在cocoapods.org上搜索要添加的广告连播的名称和版本 在Pod文件中添加Pod和版本:您需要提及在刚创建的Pod文件中添加Pod的依赖性。 可以使用任何编辑器完成此操作(最好使用可可豆荚应用程序 单击安装:触发命令[pod install]或单击可可豆荚应用程序中的安装按钮,将安装提到的依赖项。 做完了 刚开始使用可可豆荚而不是xcodeproj文件创建的工作区。 提及的依赖项已添加到您的项目中。 如何删除已安装的吊舱? 早些时候,从Xcode项目中删除已安装的Pod很麻烦。 仅删除pod文件和目录是不够的。 您需要从构建阶段中删除Pod资源,嵌入式Pod框架和其他一些东西。 但是可可豆的应用使这项工作变得非常容易。 […]

内顿·斯威夫特?

目标– C varken nerdençıktı? 迅速。 Herkesinmuhteşemuygulamalargeliştirebilmesiiçingüçlüveaçıkkaynaklıbir dil。 – 苹果 迅速; iOS,Mac,Apple TV和Apple Watch观看Apple Watch的应用程序。 Geliştiricilere和她的zamankinden daha fazlaözgürlüksağlamakiçintasarlandı。 斯威夫特(kullanımıkolay veaçıkkaynaklıbir dil)。 Buyüzden,bir fikri olan herkes,şimdiinanılmazşeyleryaratabilir。 – 苹果 Swift ,Apple iSletim sistemlerine(iOS,macOS,watchOS,tvOS)uygulama yazmakiçinkullanılan2 dilden biridir。 目标— C varken nerdençıktı? Swift 2010’un temmuzayındaChris Lattner *tarafındanyazılmayabaşlanıyor。 Swift“ Objective-C,Rust,Haskell,Ruby,Python,C#,CLU ”非常不错。 克里斯·拉特纳(Chris Lattner) 驾驶Apple’den特斯拉(Tesla)汽车公司的特斯拉自动驾驶仪。 Ordan da kendisine uygun bir yerolmadığınısöyleyerekçıktıveşu和Google’da kariyerini […]

VIPER:干净的代码架构

软件开发体系结构(或设计模式)非常关键,是“一个人”必须决定并采取的非常重要且初始的步骤之一(此处“一个人”是指软件开发者 😐😐,这是上帝的创造,可以将Coffee转换为软件 )。 在开发软件时遵循设计模式非常重要(当我这么说时,请相信我,我遇到了一些甚至不知道什么是“设计模式”但在App Store中拥有其应用程序的人。😶),因为它不仅是一种文件夹结构,但不止于此…。 对我来说,当您说您遵循特定的体系结构时,您应该至少了解以下几点: 您需要知道如何将每个功能部件定义和划分为责任,并将这些任务分配给不同的部分(类)。 始终注意实现的类之间的正确通信流程。 经过几分钟或几小时的思考,您编写的代码是可维护的,并且可以由任何其他“人员”进行增强(此处的“人员”也是软件开发人员)。 作为专业的iOS开发人员,我尝试了一种非常著名的最新架构VIPER 。 VIPER是当今世界范围内使用的一种设计模式,是您在进行大型项目时可以参考的最简洁的体系结构之一。 Viper是一种面向协议的编程以及模块化方法。 所有模块都分为5个不同的部分(类),每个部分都有其责任。 这些类必须仅执行特定任务,然后将所需结果传递给其他任务(如果需要)。 分解模块的5个不同部分或类是: 视图-视图包含您的所有UI元素。 每当发生用户交互时,View都有责任将信息传递给Presenter。 交互器-交互器是模块的大脑。 它包含不同的业务逻辑并使用案例实现。 演示者-演示者将获取的数据从View传递到Interactor,以根据业务逻辑进行进一步处理。 经过进一步处理后,交互器将数据传递给Presenter,然后将其传递给View以更新UI。 演示者还与路由器进行交互以执行导航。 实体是指按照应用程序流程进行处理和更新的自然趋势的数据模型。 实际上,数据模型和视图的组合效果对用户而言是可见的。 R外 -路由器负责所有与导航有关的任务,并在需要时传递任何数据。 这种职责分解称为“ 单一责任原则” 。 因此,它非常容易编写测试用例,这与其他在同一类中包含业务逻辑,UI处理,导航等内容的体系结构不同。 沟通流程 在上图中,您可以看到Interactor与其他两种类型的类进行通信 API数据管理器 本地数据管理器 这些不是其他组件,而是Interactor的帮助程序方法,仅用于隔离职责,例如用于进行API调用的API数据管理器和用于处理数据持久性的本地数据管理器 。 现在,通过查看该图,您可以非常清楚地了解流程。 如果没有,我举个例子来解决。 假设您在登录屏幕上。 登录完成后,您必须显示仪表板。 因此,流程将是这样的:

如何在iOS上使用CocoaPods?

CocoaPods 图书馆和图书馆 iOS , macOS , watchOS , tvOS和Swift Swift以及Objective-C图书馆和公共图书馆CocoaPods图书馆和公共图书馆 如何在CocoaPods上使用Library? 安装CocoaPods coริ่มแรกเลยเราต้องลงCocoaPodsสะก่อนด้วยการเปิดTerminalขึ้นมาและพิมพ์คำสั่งตามด้านล่างนี้ $ sudo gem install cocoapods จากนั้นทดลองใช้งานโดยพิมพ์ว่า $ pod –version **ถ้าก่อนหน้านี้เคยลงCocoaPodsมาก่อนและต้องการลงใหม่ก็สามารถลบCocoaPodsด้วยคำสั่ง $ sudo gem卸载cocoapods **และเราสามารถเลือกลงเวอร์ชันCocoaPodsได้ด้วยคำสั่ง $ sudo gem install cocoapods –v1.2.1 2.使用CocoaPods设置iOS项目 งร้างiOS项目ขึ้นมาเมื่อสร้างเสร็จแล้วกดปิดProjectจากนั้นเปิดTerminalขึ้นมาแล้วเข้าไปยังiOS Projectของเราจากนั้นเราจะInitial CocoaPodsด้วยคำสั่ง $ pod init InitialอInitial CocoaPodsแล้วจะมีPodfileขึ้นมาดังรูป Podfileนี้จะเป็นตัวที่ระบุถึงLibraryต่างๆราจะเอาเข้ามาใช้บนProjectของเราพร้อมระบุLibrary versionต่างๆอีกด้วย 3.从CocoaPods安装库 Libraryย​​การหา图书馆ต่างๆากhttps://cocoapods.orgตัวอย่างเช่น Libraryอเราเริ่มค้นหา图书馆ที่อยู่บนCocoaPodsนั้นคำถามลำดับต้นๆนที่ผุดขึ้าเลยคือเราจะเลือกใช้Libraryตัวไหนดีเพราะมันมีมากมายเหลือเกินเ ที่ากจำนวนที่下载ไปใช้งาน ที่ากจำนวนคนที่安装ไปใช้งาน ดูจากภาษาที่ใช้ในการพัฒนาและเวอร์ชันของภาษา ดูจากวันเวลาที่อัพเดตล่าสุด กได้แล้วให้กดไปที่ากนั้นเมื่อเราเลือกได้แล้วให้กดไปที่安装指南ที่อยู่ด้านขวาล่างมันจะบอกวิธีลงLibraryพร้อมบอกเวอกเวอร์ชัน dากนั้นให้เข้าไปที่Podfileที่อรู่ในiOS项目แบ่ง环境ของ项目Devน开发,测试,UAT,产品ตัวอย่างการเขียนบนPodfileมีดังนี้ 平台:ios,“ 10.0” […]

Mac开发人员提示:共享扩展中的NSTouchBar

您正在使用支持MacBook Pro的Touch Bar的Share扩展程序,但是它为空并且在加载扩展程序时没有出现? 解决方案很简单: 调用[self.view.window makeFirstResponder:self.view]; 它将把您光荣的NSTouchBar推入堆栈: 希望能有所帮助-如果我知道known,它将为我节省20分钟

让我们使用Bitrise自动化Swift构建

现在我和我的客户我们生活在真正的幸福中。 我 :我只是想掌握并自动执行,所以会增加内部版本号,进行编译并提交给Testflight。 他 :我不再将IPA文件拖放到iTunes中。 Testflight通知我,我可以访问开发人员提交的最新版本。 在Apple环境中,我们是安全的,但Bitrise是面向开发人员的开源持续集成工具。 现在,让我们澄清一下什么是自动化 。 配料 Xcode 7.3.1 存储在版本控制存储库中的Xcode项目(Swift或Objc) 一个存储您的存储库的git服务器( Bitbucket 和 Github 可以正常工作) 开发人员帐户,Apple电子邮件和密码。 密码应为字母数字。 可以从 iTunes Connect 获取的应用程序ID 一个免费的 Bitrise 帐户 应用程序的分发配置文件 有效的证书( 从钥匙串 导出的 .P12文件 。向其中添加密码。) 如果使用 Cocoapods,则为Podfile 。 食谱 打开Bitrise,然后使用您喜欢的GIT服务器登录。 我更喜欢Bitbucket,因为它们提供5个免费的私人存储库。 选择项目的存储库。 将ssh密钥添加到您的GIT服务器。 我让Bitrise自动执行此操作。 此ssh密钥将帮助Bitrise无需任何密码即可克隆存储库。 选择分支。 该分支应该是分发分支。 Bitrise将立即开始构建项目。 这是重要的一步,因此请务必小心,直到看到消息Validation👍🏻! 然后将一个Webhook添加到您的GIT服务器。 推送到GIT服务器时,Webhook很有用。 挂钩将在推送后通知Bitrise开始构建。 这也称为触发器 。 现在打开工作流程并进行管理。 将您的配置文件和证书添加到“代码签名和文件”页面。 在此输入.P12的密码。 […]

适用于Objective C开发人员的30个Swift概念-扩展

因此,让我猜想,您曾经是iOS开发人员一段时间,或者自己是初级开发人员,与Objective-C一起工作,并且擅长于此,您不想在您的应用程序中使用其他任何东西,如果没有将代码放在方括号中,将无法想象您的生活。 如果是这种情况,则此博客文章适合您。 如您所知,Swift如今变得越来越受欢迎,招聘人员和公司都要求开发人员更加了解这种语言。 这是我在过去的采访中曾问过的一些主题与其他一些主题之间的简短混合,这将有助于使从Objective-C过渡到Swift的过程稍微容易一些。 1 —结构和类之间有什么区别? 结构和类之间最重要的区别之一是,结构是值类型,并且在代码中传递它们时总是被复制,而类是引用类型并通过引用传递。 而且,类具有继承,该继承使一个类可以继承另一个类的特征。 2 —值类型和引用类型之间有什么区别? 要扩展有关结构和类之间差异的答案,有必要了解值和引用类型之间的差异, 当您复制值类型时,它会将要复制的内容中的所有数据复制到新变量中。 它们是2个独立的事物,更改其中一项不会影响另一项。 复制引用类型时,新变量将指向与要复制的对象相同的内存位置。 这意味着更改一个将更改另一个,因为它们都引用相同的存储位置。 如果还不清楚,这是一个例子 3 —关键字“ mutating”在Swift中是什么意思? 我们无法在实现中直接更改值类型的值,只有在创建副本并将我们想要的值分配给新副本时,才有可能。 但是,如果要在实现中更改值类型,可以在函数声明之前使用“ mutating”关键字。它表示该方法将修改结构的值,从而允许编译器创建该结构的副本。 这是一个代码示例 4 —“静态”,“类”,“最终”关键字在Swift类型方法中意味着什么? 在类型方法中,这些关键字的意思是: static:在值类型(例如结构)中,此关键字表示方法在类型级别而不是在实例级别关联。 在引用类型中,这还意味着该方法在类的类型级别上关联,但也不允许该方法可为子类覆盖。 class:在目标C中创建类方法的方式,它们可以被子类覆盖。 final:它是方法中static的别名,但是您也可以在类声明之前使用它,以使其不可变。 对于类,通常总是使用“静态”来创建类型方法,只有在您的子类确实需要重写它时,才应使用“ class”关键字。 这是代码示例。 5 — Swift中的可选项是什么? 在许多语言中,当遇到数据缺失时,必须通过编写代码的另一条路径来处理它。 没有迹象表明数据不存在,因此在程序中的许多地方都必须编写防御性代码。 这不是Swift中的情况,可选类型是Apple处理应用程序中数据缺失的方式。 有关可选项的更多信息,请转到此处 6 — Swift中的let和var是什么? 在Swift中,var表示变量。 变量是可以更改或更改的对象。 另一方面,let表示常量,表示分配给对象的值永远不会更改。 设置完成后,就完成了。 当需要设置永远不变的值时,可以使用常量。 欲了解更多详情,请点击这里 7 — Swift中的元组是什么? 元组只是值的有序集合,出于我们的目的,它们将多个值分组为一个复合值。 为什么这很重要? 在Objective-C中,如果希望一种方法返回多个值,则有两个选择-返回一个自定义对象,该对象具有存储返回值的属性或将这些值粘贴在字典中。 […]

为iOS创建自定义键盘

每个开发人员都希望在创建产品时尽最大努力。 通常,它需要超越自然设计的新颖感。 幸运的是,应用程序扩展允许开发人员在常规应用程序的边界之外添加自定义功能。 此扩展名的类型很少,其中一种是自定义键盘。 从iOS 8开始,开发人员可以使用此功能扩展其移动应用程序。 系统键盘很棒,很舒适,而且功能齐全,但是在某些情况下,第三方键盘可以通过滑动或预测用户意图等功能来加快文本输入速度(这是一种什么样的法术?)。 引入它时,我的第一个想法是创建一个简单的密码管理器。 在小型非物理键盘上输入复杂的密码从未如此简单。 从理论上讲,我只需要构建自己的自定义键盘并从此过上幸福的生活。 但是,后来我了解到某些并发症,例如… 自定义键盘限制 这种局限性可以用一句话来概括:不允许自定义键盘访问标准应用程序通常可以使用的许多功能。 首先,关于我的密码管理器,Apple担心用户隐私。 这就是为什么我们在与安全字段进行交互时不能使用自定义键盘的原因,因此无法创建带有魔术按钮的键盘来为我们完成所有这些密码键入操作。 此外,您不能在普通键盘框架上绘制任何元素。 真可惜,但是它与Apple的人机界面设计规则很好地结合在一起,就是这样。 除此之外:我们无法通过“自定义键盘”访问麦克风和摄像头,这使得听写输入变为不可能。 正如您所期望的那样,该列表还在不断增加。 您可以在《人机界面指南》中阅读有关限制和良好实践的更多信息 ……和必备 必须提供一个按钮以切换到其他键盘或返回普通键盘。 在系统键盘中,是那个神秘的地球仪图标按钮。 为了不干扰用户的期望,习惯和根深蒂固的行为,我建议保持这种状态。 我们需要做的就是将带有所有事件的addTarget添加到我们的键盘UIInputViewController到方法advanceToNextInputMode()中(用户可以点击此按钮以快速切换到下一个按钮,或者点击更长的时间以查看可用键盘的列表)。 要使用Internet连接,用户必须允许完全访问自定义键盘。 它允许键盘与包含的应用程序共享数据。 因此,该应用程序可能成为键盘的管理器应用程序。 因此,它可用于同步用户词典或调整并保留用户首选项。 但是,键盘必须在没有完全访问权限的情况下始终可用,因此也需要没有互联网连接。 实施技巧 只是一些代码片段 我不想逐步介绍您,因为我确定您知道如何创建xcode项目,添加视图等。要开始,您需要添加一个新目标(文件->新建->目标->自定义键盘扩展名)到现有项目。 您将获得InputViewController子类,它是键盘的起点-您可以在此处添加控件。 让我们跳到很酷的东西。 例子在Obj-c中,但是基本上它们没有任何特定于语言的怪癖,如果您使用Swift编写,翻译它们会非常容易。 我还建议阅读Krzysztof Pelczar文章中的更多实施技巧。 处理回车键类型和键盘类型 如果要创建可用作主键盘的应用程序,则需要准备不同的文本输入方案。 为了方便用户,您可以在用户输入电子邮件地址时添加“ @”按钮而不是其他按钮,或者在编辑仅允许数字的字段时仅显示数字键盘。 您可以通过在InputViewController中调用来获取当前的键盘上下文(UIKeyboardType): 我不建议使用可视界面构建器来放置按钮,因为完成该过程将花费更长的时间,并且从长远来看将变得很难维护。 通常,在我们的项目中,我们使用具有布局约束(可视格式语言-FTW!)的代码创建视图。 但是这次我决定计算每个键盘按钮的帧将是更好的解决方案。 它只会被计算一次,不需要在相邻视图之间保持约束,并且可以非常快速地调整大小。 一段代码只是为了展示它是如何完成的: 处理长按按键重复 当用户点击删除按钮时,他希望它将删除文本,直到他抬起手指。 这就是它在本机键盘上的工作方式,这也是根深蒂固的用户行为之一。 但是有一个缺陷。 据我所知,没有手势识别器会在每个给定的时间间隔被调用。 但是我们可以使用UILongPressGestureRecognizer和NSTimer做一个简单的技巧。 结果,当用户将手指放在删除按钮上时,我们每150毫秒接收一次事件。 […]