作为开发人员,一种常见的做法是一次又一次地编写相同的代码。 我们每天都会编写数百行代码,其中一些代码需要我们编写和重写,因此会花费大量时间。 无需复制代码或重写代码,我们可以使用代码片段库— Xcode(IDE)中存在的有用且有价值的功能。 总览 代码段是一项非常有用的功能,它使我们可以保存我们经常编写/使用的一段代码,并创建一个快捷方式来重用项目中其他地方的同一段代码。 Xcode的代码片段库仅包含少量默认的可用代码片段,但是您始终可以为自己经常使用的代码模式创建自己的自定义代码片段,并将其保存在代码片段库中。 由于我们不必重复/重写代码,因此节省了大量时间,并且还有助于避免代码中的错误。 使用可用的代码片段 要查看可用的代码段,请转到编辑器右侧的“实用程序”面板。 然后,在“实用工具”面板的下半部分,将有一个带有4个图标的水平分隔线。 可从对象库旁边的第二个选项卡访问Xcode代码段库,在这里我们可以抓取所有UI组件以将它们拖到Storyboard上。 单击{}图标以显示代码段库。 在这里,您可以找到一些预定义的代码片段。 有两种方法可以使用这些代码片段或将其插入代码中。 您只需在需要的地方将其拖放到源代码中即可使用它们。 您开始输入一些代码,然后代码完成提示会提示您 这是Xcode内置的一些可用片段的列表: 枚举,结构联合和块的Typedef声明 控制流程语句,例如if,if…else和switch 循环,例如for,while和do…while 内联块变量声明 @interface(包括类扩展名和类别),@ implementation,@ protocol的Objective-C声明 Swift函数语句,Guard语句,枚举类型声明 初始化,initWithCoder:和initWithFrame:方法实现或快速的Initializer / Deinitializer声明的Objective-C咒语 Swift Do-Catch语句或Objective-C try-catch-finally块 如何添加自定义代码段? 在Xcode中,您可以添加自己的代码段。 要添加自定义代码段,请按照以下简单步骤操作: 在代码编辑器中写下您的代码。 现在,在Xcode的右下角打开代码段库视图。 选择您的代码段,然后将其拖到代码段库中即可。 它将提示一个窗口,用于添加标题,快捷方式,语言和摘要。 在标题中,输入将用于标识代码段的代码段的名称。 总之,您可以给出简短说明,以指定此代码段的功能。 输入您的代码段的快捷方式。 如果在代码编辑器中键入快捷方式文本,则会弹出自动完成代码。 通过使用这个你可以 选择平台和代码段应使用的相应语言。 完成范围对于确定代码片段应在哪些范围(方法,类实现,初始化器等)中也很方便。 您还可以编辑刚刚保存的代码段,并添加代码占位符。 要创建占位符,只需输入 在处理仅需要将不同变量传递到其中的某些代码时,它确实很有用。 编辑自定义代码段 添加新代码段后,我们也可以选择对其进行编辑。 双击代码片段,将出现一个弹出窗口。 在此弹出窗口中,左下角有一个编辑按钮,通过选择编辑按钮,您可以在库中编辑代码段。 瞧! 现在,您已经创建了一个新代码段,它将使Xcode在您下次使用时自动为您完成代码。 […]
这篇文章是了解如何在Swift Cocoa Touch Framework项目中的Objective-C中添加第三个 库或文件的提示。 三个简单的步骤,让我们开始吧! 步骤1 首先要做的是在项目内部添加 Objective-C文件 (可以拖放) 。 第2步 将文件放入项目后,必须进入“ 项目目标” ->“ 构建阶段” ->“ 标题” 。 在“ 项目”选项卡中将看到所有“ .h”文件。 您必须将所有文件拖放到“ 公共”选项卡。 见下面: 现在,所有“ .h”文件都是您项目中的公共文件。 使它们可用是另一件事。 第三步 最后要做的是将它们导入 Bridge文件(由Xcode自动创建)。 桥通常是扩展名为“ .h”的项目的名称 。 注意 :如果项目名为 MyProject ,则Bridge文件的名称将为MyProject.h 。 打开Bridge文件,然后在导入中添加项目中的所有Objective-C标头。 #import #import “SomeImportedFile.h” 做完了! 现在所有项目都可以在Swift文件中使用那些Objective-C文件了。 谢谢!
变量表示信息性名称,该名称存储任何数据类型的值。 数据类型是指变量保存的数据类型,并且可以对其应用数学,关系或逻辑运算的类型而不会引起错误。 例如,字符串是用于对文本进行分类的数据类型,而整数是用于对整数进行分类的数据类型。 让我们看看在目标C语言中使用的主要数据类型。 1. int保持数字值不带小数 整数数量= 10; 此处int =数据类型,数量=变量,10 =变量值 NSLog(@“ quantity =%d”,quantity); //使用带有%d的NSLog打印int值 输出:数量= 10 2.浮点数保存带有十进制的数字值 浮动pi = 3.14; 此处float =数据类型,pi =变量,10 =变量值 NSLog(@“ pi的值=%f”,pi); //使用带%f的NSLog打印浮点值 输出:pi的值= 3.14 3. Char保留单个字符值 char a =’A’; 这里char =数据类型,a =变量,A =变量值 NSLog(@” a的值=%c”,a); //使用带有%c的NSLog打印浮点值 输出:a = A的值 4.字符串也包含单个字符和文本。 NSString * strName = @“ Verma Mukesh”; 此处String =数据类型,strName […]
“开发硬件产品非常困难。 在RUBICON的帮助下,我们得以将我们的产品推向市场。 RUBICON成功地为我们的扬声器和耳机创建了一个移动应用程序以及软件。 他们的团队灵活,敬业,高效。 我们对结果感到非常满意,无法选择更好的软件开发团队来与之合作!” (天秤座的阿尔米尔·梅萨诺维奇) RUBICON满足Libratone 2015年,Libratone与我们的团队联系并提出了愿景。 在设计了一系列现代无线扬声器和耳机之后,他们计划将它们投放市场。 我们的软件开发团队共同努力,为其产品开发iOS应用程序和云解决方案。 我们与Libratone合作,帮助他们释放声音。 但是天秤到底是谁呢? Libratone的总部位于哥本哈根,在中国,英国,德国,美国和法国设有全球办事处。 他们生产的无线扬声器具有时尚,时尚的丹麦设计,并可以产生高保真音质。 Libratone的目标是创建一个交互式iOS应用程序和云解决方案,以与其产品和客户建立联系。 Libratone的产品 Libratone同时生产扬声器和耳机。 以下是Libratone核心产品的一些说明: 讲者 Libratone设计现代的MFi Apple Program扬声器可产生惊人的音质。 扬声器具有360 FullRoom声音设计功能,可在各个方向上为整个房间提供丰富的声音。 该应用程序具有预设,允许用户选择和播放自己喜欢的音乐。 多房间扬声器分组连接,因此您可以配对和控制不同房间中的多个扬声器以发出声音。 用户可以通过Libratone的移动应用程序直接与扬声器进行交流。 Libratone的发言人: ZIPP 2 循环扬声器 ZIPP迷你扬声器 一和TOO扬声器 头戴式耳机 可调,超轻和时尚的耳机,可为您提供惊人的音质和有趣的功能,从而完善您的声音体验。 入耳式耳机 入耳式耳机 LIBRATONE的要求 为了进一步推动业务发展,Libratone设想创建一个移动应用程序,以将用户与其产品联系起来。 Libratone委托RUBICON创建带有云解决方案的iOS应用,以支持移动应用和扬声器。 Libratone的移动应用程序 目标是开发一个视觉上吸引人的,用户友好的移动应用程序。 移动应用程序背后的目的是让Libratone用户能够从移动设备轻松控制其扬声器,从而连接用户和产品。 该移动应用程序将与国际广播市场集成,使用户能够访问自己喜欢的广播电台和音乐。 该应用程序通过UDP,TCP和蓝牙自定义协议与扬声器进行通信。 该移动应用程序与云解决方案一起,为Libratone设备启用了全球无线固件更新。 下表显示了RUBICON在该应用程序上开发和实现的功能: Libratone的云解决方案 目标是创建一个安全稳定的云解决方案,该解决方案包含以下功能: 空中更新(OTA) 注册演讲者以获得更好的支持并确定客户的问题 OTA智能推送通知通过电子邮件或移动应用程序通知用户可以下载其扬声器的新更新 设计时要考虑长期支持(LTS) 全球内容交付网络(CDN)支持应用程序,发言人和OTA流程 挑战 […]
本文是关于UIView , UIViewController和UIWindow如何连接的。 我将说明如何遍历视图,视图控制器和响应者链的层次结构。 我们将通过推送,模式和嵌入演示来探索应用程序的结构外观。 并在Xcode中构建控制台版本的Debug View Hierarchy工具。 UI工具 Xcode中的Debug View Hierarchy捕获用户界面的快照,并允许浏览和检查视图对象。 有时控制台更方便。 我们可以使用私有方法对UI进行内部检查。 -[UIView recursiveDescription] -[UIViewController _printHierarchy] 您可以暂停应用程序执行,并在控制台中使用表达式来调用recursiveDescription和_printHierarchy 。 (lldb) expr -l objc -O — [[[[UIApplication sharedApplication] keyWindow] recursiveDescription] (lldb) expr -l objc -O — [[[[[UIApplication sharedApplication] keyWindow] rootViewController] _printHierarchy] -l objc -O –用于将上下文从Swift切换到Objective-C。 View Hierarchy 应用程序通常包含许多视图和一个以上的视图控制器,从而建立了两个层次结构: UIView层次结构是一棵树,它的根位于窗口中( UIWindow是UIView的子类)。 我们可以使用subviews和superview属性遍历此树。 UIViewController层次结构从窗口的rootViewController开始。 视图控制器可以提供其他视图控制器或作为其他视图控制器的容器,从而创建两个不同的层次结构。 呈现的视图控制器 当我们使用Present […]
在iOS App开发中,创建自定义视图是非常常见的做法。 我们经常创建自定义视图以实现可重用性,以分隔责任或分离依赖关系等。尽管在该主题上有大量的stackoverflow答案,媒体,博客等,但是要找到一个简洁而全面的创建自定义视图的示例非常困难来自.xib。 让我们从以下步骤开始: 步骤1 创建一个单视图应用程序项目 Setp 2 如下图所示添加一个.xib文件,并将其命名为“ CustomView” 第三步 就像上一步一样,添加CustomView类。 这次选择CocoaTouch文件,并在subclassof部分中选择UIView,并将其命名为“ CustomView” 步骤4 选择CustomView.xib文件,然后从Xcode的属性检查器中将CustomView.xib的文件所有者设置为CustomView类,如下所示。 现在,出现了许多问题,例如:什么是文件所有者? 或为什么不设置子类而不是文件所有者? 等等 需要记住的几点: 文件fileowner是加载笔尖的对象,即文件loadNibName:收到消息loadNibName:或initWithNibName: loadNibName: 如果要在装载后访问笔尖中的任何对象,则可以在文件所有者中设置出口。 ViewController充当情节fileowner中View的文件所有者,这就是为什么我们没有在情节fileowner显式设置View的文件所有者。 之所以将其称为文件所有者并给予特殊的位置,是因为与笔尖中的其他对象不同,文件所有者位于笔尖外部,而不是笔尖的一部分。 实际上,只有在装入笔尖时它才可用。 因此,文件所有者是实际对象的替代者或代理,该对象随后将加载笔尖。 因此,您创建了带有许多子视图的精美视图,例如:按钮,标签等。 如果要在加载笔尖之后随时修改这些子视图中的任何一个,我们可以将这些对象的出口设置为fileowner 。 每当我们从xib创建自定义视图时,我们都将其文件所有者设置为自定义子类。 如果现在在Xcode中选择助手编辑器,它将为选定的CustomView显示相应的类CustomView ,如下所示。 第5步 将以下代码添加到CustomView类 我们在两个地方设置文件fileowner 在.xib文件中,如步骤4所示。 我们这样做是为了我们可以得出结果和采取行动。 如果不设置文件fileowner Xcode将无法连接出口和动作 如下所示,在fromNib方法中以编程方式显示为loadNibName方法,将fileowner作为参数。 如果我们发送nil而不是self,它将覆盖先前将fileowner分配给nill 。 将下面的代码添加到您的视图控制器 结论 这就是从.xib创建自定义视图的全部内容。 如果您喜欢本教程,我强烈建议您阅读有关表视图预取的另一篇文章。 够说话了。 现在让代码谈谈: rokonuddin / CustomView 通过在GitHub上创建一个帐户为rokonuddin / CustomView开发做出贡献。 […]
自2008年iOS推出以来,已有超过200万个应用下载了1300亿次。 iOS平台的普及并不是什么秘密,每次新的迭代都带有巨大的期望。 借助iOS 10,Apple为iPhone和iPad开发人员提供了对该软件的更多控制权,引入了允许创建新类别的应用程序和功能的新框架和工具。 为iOS 10开发的应用程序还扩展了系统服务,以提供更多引人入胜的功能。 iOS 10中有许多新功能,但是在本文中,我们将为发现最有趣和有用的示例提供示例。 UIViewPropertyAnimator iOS 10引入了一种编写动画代码的新方法:使用UIViewPropertyAnimator。 这不是现有API的替代,也不是客观上“更好”,但它确实为开发团队提供了以前无法实现的控制水平。 从本质上讲,UIViewPropertyAnimator增强了在我们的应用程序中创建动画的选项。 新选项包括停止动画和恢复动画(以及其他时间参数),随时结束动画,反转动画或将其移动到任何选定的时刻等等。 另一个新颖的事实是,除了以前使用的动画定时选项(例如EaseInEaseOut)之外,我们现在还能够基于三次函数的检查点定义自己的时间函数。 在iOS 10之前,在iOS上执行基于手势的可中断动画是一项麻烦的任务,通常需要第三方框架。 仅动画时间的精细控制就可以使Property Animator改进我们现有的UIView动画。 但是,它们真正闪耀的地方是当您创建的动画不只是一劳永逸时-我们希望用户能够抓取动画对象并与之互动。 在Objective-C和Swift 3.0中查看UIViewPropertyAnimator的代码示例。 呼叫工具 iOS 10 CallKit是一个全新框架,在WWDC 2016上首次引入。CallKit使您的Internet协议语音(VoIP)应用程序与本机Phone UI紧密集成,从而极大地增强了用户体验。 VoIP并发症 在CallKit之前,VoIP呼叫只是一个通知。 用户无法区分传入的文本消息通知和传入的电话通知之间的差异。 自然,这导致大量未接电话。 在锁定的屏幕上,即使用户设法通过滑动通知来接听电话,他/她也需要输入密码,并被重定向到应用程序,然后才可以开始讲话。 在未锁定的屏幕上,体验同样差劲,因为来电通知只是屏幕顶部的横幅。 更进一步,发出呼叫要求用户启动VoIP应用程序并从那里启动它。 iOS 10 CallKit的改进 CallKit解决了所有这些复杂问题。 借助iOS 10 CallKit,第三方VoIP应用程序可能成为用户拨打和接听电话的主要方式。 来电具有丰富的本机UI,带有接听和拒绝按钮以及用户的自定义铃声。 可以通过本地电话应用程序的联系人,收藏夹和最新消息(通过Siri,通过蓝牙或CarPlay)完成通话。 iOS 10 CallKit允许VoIP呼叫与电话呼叫,FaceTime呼叫甚至其他VoIP呼叫相互作用。 系统知道所有呼叫后,便以相同的优先级处理它们。 这意味着当接到电话时,VoIP呼叫不再处于保留状态。 此外,用户可以使用“请勿打扰”功能,可以阻止联系人或静音呼叫,甚至可以在进行中的呼叫和保持的呼叫之间进行交换,无论其类型如何。 **注意:此示例需要在设备上构建** 在Objective-C和Swift 3.0中查看CallKit的代码示例。 SiriKit SiriKit是一个新框架,允许开发人员将其应用程序的内容和服务与Siri集成在一起,因此用户可以仅凭自己的声音进行操作。 […]
我的要求是限制用户录制视频,因为我的应用中的所有视频仅适用于付费用户。 如果我的应用程序处于活动状态,我想限制屏幕录制。 我找不到任何解决方案可以防止仅针对我们的应用进行屏幕记录(或屏幕截图)。 这是操作系统级别的功能,不能被覆盖( 我找不到任何解决方案。如果您对此有所了解,请发表评论 )。 因此,唯一的解决方案是在发生屏幕录制时暂停或停止播放器。 幸运的是,iOS为此提供了解决方案。 iOS 11的UIScreen可用的实例属性名为isCaptured (以快速captured isCaptured )。 它是一个Boolean值,指示是否将屏幕内容克隆到另一个目标。 // Obj-C @property(nonatomic, readonly, getter=isCaptured) BOOL captured ; //迅速 var isCaptured : Bool { get } 我还使用了mirroredScreen属性,该属性检测屏幕是否被外部显示器镜像。 因此,其想法是检查这些 bool 值,并在其中任何一个为 true 停止玩家 。 我必须创建一个通知,该通知将在bool值变为true时帮助我们进行通知。 该代码在ObjC中,非常容易理解。 看看下面的代码。 这是正在运行的应用程序的gif。 而已。 ! 请享用!! 如果您喜欢阅读这篇文章,请分享并给予鼓掌,以便其他人可以找到它! 您可以在Medium上关注我以获取新文章。 另外,在LinkedIn上与我联系。 如果您有任何评论,问题或建议,请随时在下面的评论部分中发布它们!
Apple在iOS 9.0+(WWDC 2015)中引入了App Thinning。 在本文中,您将获得App Thining的简化概述。 App Thinning通过使用iOS 9.0+中可用的一些API来减小应用程序的大小。 这涉及使用称为切片 , 按需资源和位码的三个过程中的一个或三个的组合。 应用切片 如今,为iOS生态系统开发的大多数应用都是通用的。 换句话说,一个应用程序可以安装在所有设备上,无论是iPhone还是iPod,都不需要为每个设备安装单独的应用程序。 启用应用程序切片可让应用程序开发人员根据要为其下载应用程序的设备打包资产。 如果同一用户在其他设备上下载相同的应用程序,则仅会下载在该设备上运行所需的资产。 按需资源 可以使用关键字来标记诸如图像和声音之类的资源,并根据标记以组的形式进行请求。 ODR支持更快的下载速度和更小的应用程序大小,从而改善了首次启动体验。 让我们考虑一个带有关卡的游戏的例子。 游戏可以将资源划分为多个级别,并仅在应用程序预期用户会移动到下一个级别时请求下一个资源级别。 同样,仅当用户购买相应的应用内购买时,应用才可以请求应用内购买资源。 位码 位码是已编译程序的中间表示。 它允许Apple重新优化应用程序二进制文件。 可以从Xcode启用和禁用它。 默认情况下,位码设置为YES ,对于iOS是可选的,但对于watchOS和tvOS是必选的。 转到项目的构建设置->确保您位于“所有”选项卡上。 搜索启用位码并设置为是/否分别启用/禁用位码。
对于iOS开发人员而言,Objective-C现代化确实非常重要。 它提供了更好的类型安全性,并改善了与Swift代码库的交互。 有关更多信息,请查看我的第一篇文章:了解Objective-C现代化。 首先,我们将讨论可空性注释,它们为何重要以及它如何工作。 背景 与Java等运行时错误语言不同,Swift和Objective-C都具有编译时错误的优势。 即使这些错误有时会令人讨厌,但编译时错误通过帮助我们追踪那些绝对会导致应用程序在运行时崩溃的愚蠢错误,为我们提供了巨大的优势。 尽管Objective-C出现编译时错误,但在涉及类型安全之类的某些问题时,它往往比Swift更宽松。 一个这样的示例就是它如何处理缺少值的问题: null (对于ObjC指针引用,为nil )。 在Objective-C中,您可以使用nil指针做一些事情,因为Objective-C将nil视为0 。 如果将消息发送到nil指针,则会返回nil (或其他类似的“falsy”值)。 在Swift中, nil在功能上等效于其他语言,例如C ++中的null 。 如果您尝试在nil上调用函数,则会得到如下异常: 致命错误:展开一个可选值时意外发现nil 因此,确定您的价值是否可以为零非常重要。 Swift中现有的Objective-C API Swift通过可选(可以为nil )和非可选(不能为nil )来实现这一点。 但是,直到几年前,Objective-C还无法表达这一概念。 因此,您的Objective-C代码: @property(非原子,副本,只读)NSString * email;-(BOOL)setUserEmail:(NSString *)email密码:(NSString *)password; -(BOOL)setUserImage:(UIImage *)图像; 将会翻译成Swift这样的东西: var email:字符串{get} func setUserEmail(_ email:字符串!,密码:字符串!) 函数setUserImage(_ image:UIImage!) 如果没有文档,此代码会造成混乱,因为所有这些函数都将nil作为有效的参数值,但尚不清楚nil是否应被接受。 另外,如果我们在Objective-C代码中传递nil,则不会出现Objective-C编译错误。 这可能不会导致崩溃,但是肯定是模棱两可的。 歧义很少是好的。 大规模的歧义是危险的。 随着Swift开始起飞,苹果公司开始使用自己的一些框架启用适当的Swift可选翻译.2015年3月,苹果发布了一篇有关Nullability和Objective-C的文章,向我们展示了我们如何也可以启用这种适当的翻译。 基本 核心是2个关键字: _Nullable和_Nonnull 。 […]