Tag: Objective C

您是否熟悉viewWillAppear,viewDidAppear,viewDidLoad,viewWillDisappear和viewDidDisappear?

在此之前,让我问您viewWillAppear , viewDidAppear , viewDidLoad , viewWillDisappear和viewDidDisappear的运行顺序是什么? 如果您知道答案,请关闭此网页并进行游戏。 🙂 因此,编写了一个简单的片段代码来验证这一点: Example code: Objective-C代码 适用于Swift爱好者的Swift代码 运行结果: 2017-04-14 08:18:18.923 TestBlock[3940:264012] viewDidLoad is running 2017-04-14 08:18:18.924 TestBlock[3940:264012] viewWillAppear is running 2017-04-14 08:18:18.946 TestBlock[3940:264012] viewDidAppear is running 2017-04-14 08:18:22.187 TestBlock[3940:264012] viewWillDisappear is running 2017-04-14 08:18:22.689 TestBlock[3940:264012] viewDidDisappear is running 单击按钮后,您将看到顺序: viewDidLoad viewWillAppear viewDidAppear viewWillDisappear viewDidDisappear

我在为iOS制作应用程序时学到了什么

我想知道的三个简单提示。 注意:此文章面向初学者iOS开发人员,如果您是中级或高级开发人员,则可以在此处找到明显的内容。 我于2014年开始为iOS开发应用程序,Swift刚刚发布,但我不确定要使用哪种语言(与Objective-C相比)。 所有的教程和课程都是面向Objective-C的,但是我知道Swift将成为平台的未来,所以我决定稍等一下,着手开发Swift。 我在斯坦福大学的iTunes U上找到了在线课程(此处为更新版本),我做了一个小游戏,如今不再发行。 该游戏称为“ Sweet Touch”,基本上,您必须在10秒内尽可能快地点击一个糖果形状的按钮。 该应用程序确实帮助我了解了Cocoa和UIKit的基础知识,如何管理数据,为简单的事物制作动画,登录Facebook用户等等……这是我的第一个提示: #1 —做中学 很好奇,在课程或教程结束时不要停止编程。 寻找想法并运用您在一个非常个人的项目中获得的知识,并找到添加一些课程中没有的内容的方法,这将迫使您搜索特定的问题解决方法。

在五分钟内用[Space Commander]和[xcpretty]插入您的Objective-C项目

为什么您的Objective-C存储库没有统一的代码格式? 使用Space Commander,您可以: 在提交代码之前强制执行格式约定。 使用单个命令(单个文件或整个存储库)格式化代码。 如果未格式化的代码进入分支,则构建会失败(在请求请求期间)。 (* https://github.com/square/spacecommander) 将spacecommader拖放到项目文件夹中 2.运行setup-config.sh ./config/spacecommander/setup-config.sh 3.要就地格式化存储库中的所有Objective-C文件,请运行 ./config/spacecommander/format-objc-files-in-repo.sh

Xcode 8-将Alcatraz的插件转换为Source Editor Extension

数组XCSourceEditorCommandDefinitions将保存选项的详细信息。 复制/粘贴项目0并将其修改为上面的plist。 XCSourceEditorCommandIdentifier,它是一个标识符,将在SourceEditorCommand中使用该标识符来识别按下了哪个按钮。 XCSourceEditorCommandName是将显示在“编辑器”菜单中的文本。 现在,如果您运行该项目,您将注意到带有灰色图标的Xcode新实例已启动。 这意味着它是包含我们扩展名的Xcode。打开一个项目,然后单击any。 m或。 迅速的文件。 然后转到编辑器,您会注意到一个选项Manage Logs和另外两个选项Enable Logs和Disable Logs 。 尝试单击它们,当然什么也不会发生。 PS。 ( 编辑器->管理日志->禁用日志)中的“ 管理日志”选项出现,因为它是目标的名称。 因此,如果您需要更改该选项,只需更改目标名称。 回到SourceEditorCommand.m 好的,我们现在可以开始开发了! 我们只需要用// NSLog替换NSLog(,用// print(替换print() 。那应该很容易吧? 不幸的是,这个问题并不是那么容易,它有点复杂,但是最后也不是那么困难。 因此,让我们看看我们需要做什么: 识别当前文件是.swift还是.m文件 确定按下了哪个按钮(“ 启用日志”或“ 禁用日志” ) 使用NSArray获取当前文件的行 遍历各行,查找包含日志的行 用注释掉的日志替换特定行。 这是我们项目的代码: 不用担心 我们将讨论每个步骤。 识别当前文件的类型 因此,识别当前文件的类型非常容易。 只需检查invocation.buffer.contentUTI中的字符串值以获取public.objective-c-source或public.swift-source。 由于在我们的项目中, 正则表达式和用于注释日志的字符串对于Swift和Objective-C而言是不同的,因此我们需要检查文件的类型并设置适当的变量。 识别按下了哪个按钮 还记得我们为Info.plist上的每个按钮设置键XCSourceEditorCommandIdentifier的值的时候吗? 在第2行中,我们使用invocation.commandIdentifier来检查单击了哪个按钮。 循环浏览当前文件的各行 在第5行上,我们遍历invocation.buffer.lines ,这是一个保存当前文件行的数组。 您可以作为NSString访问该行。 在第8行,我们检查当前行是否已被注释掉。 如果是真的,我们将其跳过。 在第13行,我们检查当前行是否包含NSLog(或print(。如果包含字符串,则它将继续进行进一步的检查。否则,它将跳过当前行。 在第16行,我们调用了我创建的函数。 此函数正在检查字符串是否包含有效的日志消息,如果该字符串为true,则返回修改后的字符串(注释掉的日志)。 […]

iOS应用程序中的推送通知

+ Shubaham Jain 对于iOS应用,您可以通过以下两种方式实施Firebase Cloud Messaging: 通过Firebase Cloud Messaging APNs界面接收最大4KB的基本推送通知消息。 在前台应用程序中向上游发送消息和/或接收高达4KB的下游数据有效载荷。 将Firebase添加到您的iOS项目 对于iOS客户端应用程序,您可以通过两种互补的方式实施Firebase Cloud Messaging: 通过Firebase Cloud Messaging APNs界面接收最大4KB的基本推送消息。 在前台应用程序中向上游发送消息和/或接收高达4KB的下游数据有效载荷。 将Firebase添加到您的iOS项目 先决条件 在开始之前,您需要在环境中进行一些设置: Xcode 8.0或更高版本 针对iOS 8或更高版本的Xcode项目 Swift项目必须使用Swift 3.0或更高版本 您的应用程序的捆绑标识符 CocoaPods 1.2.0或更高版本 对于云消息传递: 物理iOS设备 您的Apple Developer帐户的Apple Push Notification身份验证密钥 在Xcode中,在“ 应用”>“功能”中启用“推送通知” 在Mac机器上安装Cocoapods的步骤: 步骤1:如果您的计算机上未安装cocoapods,请首先在终端sudo gem install cocoapods上使用以下命令将其安装在计算机上 步骤2:将汇出至 导出PATH = $ PATH:/ Library / Ruby / bin […]

Swift vs Obj-C:开发人员的观点

许多对开发iOS应用程序感兴趣的人心中有一个主要问题,即应该学习Swift还是使用Objective-C来制作iOS应用程序。 现在这是一个非常普遍的问题,因为这两种语言似乎仍然是彼此的竞争者。 在Swift被Apple宣布为一种新的编程语言后,它在开发人员社区中引起了很多惊喜和困惑。 作为Objective-C的替代产品,Swift被认为比其前身更好。 但是真的是这样吗? 仅在完成了Swift中的几个主要应用程序之后(从头开始),我才能够找到这些问题的答案。 让我们从外部看一下Swift与Objective-C的战斗,并试图定义两者之间的优势。 Swift比Objective-C的优势 1. Swift更快 。 它的性能与C ++的性能相匹配,后者被认为是最快的算法计算算法。 Objective-C较慢,因为它包含C API旧版。 我们都知道苹果如何努力提高Swift的速度。 到目前为止,他们实际上已经非常成功地做到了。 例如,Swift 2.0在几种计算算法中击败了C ++。 例如,使用Swift可以更快地完成常见的搜索算法: 比Objective-C快2.6倍 比Python 2.7快8.4倍 2. Swift更安全。 Swift的语法和语言构造排除了Objective-C中潜在的几种错误类型。 这种稳定性意味着更少的崩溃和意外行为。 当然,它不能防止编写错误的代码,但是可以更好地保护开发人员避免发生不必要的错误。 可以将其称为“质量控制”。 一个很好的例子就是迅速的“可选”功能。 让我们看一下下面的实现: var firstName:字符串? firstName =“ abc” 警卫队让名=名,其他{ 返回 } //在未包装firstName的控制语句之外使用名称 print(“ \(name)”)//“ abc” 所有这些使我们有理由将Swift视为一种安全的编程语言,这非常重要。 3. Swift是竞争者 。 Swift是一种更紧凑的编程语言。 更少的代码等于更好的可读性。 当然,这个事实并不意味着代码简单。 有时,编写起来可能非常困难,但是却带来了更多好处,并且具有很高的可重用性。 这不能应用于Objective-C。 例如,有一个著名的应用程序,称为“ Lyft”。 […]

“派生数据”文件夹中有什么?

(本文最初是为我的博客 vojtastavik.com撰写的 ) 删除派生数据-每次Xcode行为异常而无明显原因时,都会有用的众所周知的技巧。 我仍然清楚地记得,当我的长辈第一次告诉我有关此基本的iOS开发技巧时。 随着岁月的流逝,并获得了更多的经验,我开始了解可以解决什么样的错误。 但是,我从未真正了解DerivedData文件夹中的确切内容 。 我决定改变这一点,这是我的发现。 注意: DerivedData的内容随Xcode版本的不同而不同。 我在这篇文章中使用了Xcode 10.0 beta 6。 我完全删除了现有的DeriveData文件夹。 然后,我从单视图应用程序模板创建了一个名为DDExample的示例项目,并在Xcode DDExample其打开。 Xcode立即创建一个新的Derived Data文件夹,其中包含两个子文件夹-一个名为ModuleCache文件夹,另一个带有项目名称的名称,后跟某种哈希。 顾名思义,这是Xcode存储预编译模块文件( .pcm )的地方。 模块是组织和共享可重用代码的方式。 几年前,模块已引入Clang(Xcode使用的编译器),主要是为了确保合理且可扩展的编译时间。 通常,对于源文件中的每个单个import ,编译器都必须包含并解析兆字节的附加头。 多亏了模块,标头仅被解析和编译一次。 您可以在其中看到两个名为AIEKQT3S8ZS7和391J0EBN0O3XH子文件夹。 这些文件夹的数量及其名称在您的计算机上很可能会有所不同。 每个子文件夹的名称均指从传递给编译器的参数计算得出的哈希值。 项目使用的唯一编译器配置越多,此文件夹中带有.pcm文件的子文件夹越多。 每个子文件夹都包含使用给定参数预编译的同一组.pcm文件。 有关此过程的更多信息: Xcode构建过程的幕后 。 值得一提的是, ModuleCache文件夹不是特定于项目的,而是在所有项目之间共享的 。 Xcode在这里存储在索引阶段收集的数据。 此数据用于项目内的搜索,快速导航和重构。 在Xcode 9之前,使用SQLite以易于理解的形式存储数据。 通过Xcode 9,Apple更改了索引数据的存储方式,现在正在使用LMDB。 没什么大不了的,因为您仍然可以打开并检查mdb文件。 但是,Apple使用的是某种哈希,而不是人类可读的密钥。 我无法进一步告诉您当前格式的工作原理,因为我找不到有关该主题的任何其他信息。 如果您有更多信息,请在下面发表评论或在Twitter上ping我。 在此文件夹中,Xcode存储按域划分的各种日志( Install , Build等)。 记住,我还没有构建项目,因此Build logs文件夹为空。 […]

UITableView iOS中的分隔线

编辑分隔线的宽度 您可以通过更改单元格上的layoutMargins:属性来设置使表格视图的分隔线在表格中扩展到各种宽度。 这可以通过多种方式来实现。 更改特定单元格的分隔线 在表视图数据源的cellForRowAtIndexPath:方法或 willDisplayCell:方法中,将单元格的layoutMargins:属性设置为UIEdgeInsetsZero(扩展到表的整个宽度),或者设置为此处所需的值。 目标C [cell setLayoutMargins:UIEdgeInsetsZero]; //也可以使用spacerInset [cell setSeparatorInset:UIEdgeInsetsZero]; 迅速 func tableView(tableView:UITableView,willDisplayCell单元格:UITableViewCell,forRowAtIndexPath indexPath:NSIndexPath){ cell.separatorInset = UIEdgeInsetsZero cell.layoutMargins = UIEdgeInsetsZero } func tableView(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath)-> UITableViewCell { cell.separatorInset = UIEdgeInsetsZero cell.layoutMargins = UIEdgeInsetsZero } 删除所有分隔线 每个单元格之间的细灰色线可能并不完全是您要的外观。 将它们隐藏起来非常简单。 在您周围的UIViewController的viewDidLoad:方法中,添加以下代码。 您也可以在加载或重新加载表视图之前随时设置此属性(不一定需要在viewDidLoad:方法中)。 迅速: tableView.separatorStyle = .None 目标C: tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 另外,可以通过选择tableView并将分隔符(在属性检查器下)设置为None来在Storyboard或XIB中更改属性。 隐藏多余的分隔线 您可以通过在UITableView的底部设置一个空的页脚视图来隐藏空单元格的UITableViewCell分隔线: 迅速 tableView.tableFooterView = UIView() […]

目标C中的局部和全局类型变量

可以在声明它们的方法内访问局部变量,但不能在此方法之外使用它们。 让我们通过示例来了解它。 让我们创建一个将两个数字相加的方法,如下所示。 -(void)AddTwoNumbers:(int)a SecondNumber:(int)b { int结果= a + b; NSLog(@“输出=%d”,结果); //输出:output = 30 } 在这里,变量a和b都是方法参数。 结果是在AddTwoNumbers方法中声明的局部变量。 由于在方法中声明了它,因此您只能在此方法中使用它。 例如,我们使用变量c打印其值。 如果您尝试将结果打印到另一种方法中,则Xcode将不允许这样做,而是会给您错误。 请检查以下屏幕截图以了解局部变量。 这是局部变量的正确使用 这是对局部变量结果的错误使用 可以在整个类文件中的任何位置访问全局变量 。 它们在头(.h)文件中声明。 在上面的示例中,如果要访问viewDidLoad方法中的结果,则将结果声明为ViewController.h文件中的全局变量,如下所示。 ViewController.m文件将如下所示。 希望您了解局部和全局变量及其用法和范围。 谢谢您阅读🙂 请查看我的YouTube频道以获取视频教程并订阅,并与您的朋友分享。 youtube频道链接: https : //www.youtube.com/channel/UCWjT8XgKescscxlPbMSVzbQ

Swift比目标C快多少

支持动态库。 Swift支持的动态库,它们直接加载到应用程序的内存中,可以优化应用程序的性能。 与应用程序的直接连接允许它们独立于操作系统进行更新。 它有助于使您的解决方案保持最新状态,减小应用程序大小,并加快新内容的加载时间。 Objective-C不支持动态库,这是一个主要缺点。 事实是它们更大,因为外部程序内置在可执行文件中。 动态库较小,因为动态库只有一个副本存储在内存中。 2. 运行时代码编译 目标C使用运行时代码编译,而不是编译时间。 这意味着当Objective-C对象在代码中调用另一个对象时,将涉及额外的间接级别。 通常,这发生得非常快,但是当代码编译发生很多次时,它变得可以测量,而swift需要更少的编译时间。 3. 参考类型与值类型 Swift的String,Dictionary和Array是结构。 这意味着它们是值类型的,并且不支持继承,因此Swift可以静态链接并可以内联调用其方法。 它们也是写时复制的,因此,如果您仅从这些数据结构之一中读取数据,Swift可以通过边界检查将许多访问转换为指针算法。 4. 常量和可选的用法 与C相比,Swift允许和鼓励使用常量的次数更多。 优化器可以假设常量永远不会改变-甚至禁止使用后门技术(例如对常量形成UnsafePointer)-这样它就可以安全地缓存先前获取的值并执行其他优化。 可选选项可确保某些指针永远不会为nil,因此编译器可以省略nil检查。 6. 更多注意事项 Swift对象可以彼此调用,而无需执行消息发送,这是Objective-C性能的瓶颈。 Objective-C的对象具有神奇的属性,可以对消息进行自省和动态处理。 这是非常强大的功能,但是会增加每条消息的成本。 迅捷对象不需要此。 因此可以更加轻巧。 从理论上讲,没有理由说Swift代码不能跟C ++一样快。 在简单的测试中,将优化器设置为“ 11”,Swift代码似乎具有与C / C ++类似的性能。