如何在iOS中修复错误的状态栏方向

当我第一次启动iOS时,当时是iOS 8,我有一个错误花了整整一天的时间才弄清楚。 问题是,尽管我已经将主ViewController锁定为纵向模式,但状态栏始终会定向为设备定向。 这就是为什么我在GitHub上启动notes项目的原因,该项目详细说明了我所面临的问题。 ViewController已锁定为人像,但设备旋转时状态栏也会旋转·问题2• 问题rootViewController被锁定为纵向。 当我旋转时,视图控制器为纵向,但状态为… github.com 现在是iOS 12,令我惊讶的是人们仍然遇到这个问题。 今天,我将在iOS 12项目中修订此问题并使用Swift。 支持的界面方向 大多数应用仅支持纵向模式,横向或横向有1或2个屏幕可用于图像查看或视频播放器。 因此,我们通常声明纵向,横向左和横向右。 从iOS 7开始,应用具有简单的设计,着重于内容。 UIViewController在外观规范中被赋予了更大的作用。 假设我们有一个MainViewController作为rootViewController ,我们希望将其锁定为纵向模式。 @UIApplicationMain 类AppDelegate:UIResponder,UIApplicationDelegate { var window:UIWindow? func application(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey:Any]?)->布尔{ 窗口= UIWindow(框架:UIScreen.main.bounds) window?.rootViewController = MainViewController() 窗口?.makeKeyAndVisible() 返回真 } } 我们可以在Info.plist指定一个名为UIViewControllerBasedStatusBarAppearance的属性,以断言我们希望UIViewController动态控制状态栏的外观。 一个布尔值,指示状态栏外观是否基于当前视图控制器的首选样式。 首先在Info.plist中进行声明 UIViewControllerBasedStatusBarAppearance 然后在MainViewController ,将状态栏锁定为纵向 导入UIKit 类MainViewController:UIViewController { 让标签= UILabel() 覆盖func viewDidLoad(){ super.viewDidLoad() view.backgroundColor = .yellow […]

使用Swift 3设置Parse-Server

首先,我只是刚刚开始使用Parse-Server,而我一生中从未使用过(或真正听说过)Parse.com。 但是,我确实具有NodeJS和MongoDB的经验。 我的目标读者是那些只想从本地托管的Parse-Server上获取一些数据的人,但是,只要您正确替换了URL,它也可以与托管在任何地方的Parse-Server一起使用。 好的,进入实际设置,转到https://github.com/parse-community/parse-server,然后按照说明将Parse安装到您的系统上。 只要您安装了NodeJS和MongoDB,这应该非常简单,如果您不这样做的话,请转至https://nodejs.org/en/download/和https://www.mongodb.com/download-center并按照他们的指示为您的计算机安装软件。 一旦完成,您将要运行parse-server命令“ parse-server-appId APP_ID-masterKey MASTER_KEY-databaseURI mongodb:// localhost / test” ,据我所知, APP_ID , MASTER_KEY和/ mongodb:// localhost / test的 测试位可以是您想要的任何位。 按下回车键运行该命令,祝贺您,Parse-Server已启动并正在运行! 您可能还需要安装Parse-Dashboard,我假设您确实想使用它,并且说实话我不知道为什么不这样做,这使工作变得更加轻松。 为此,请转到https://github.com/parse-community/parse-dashboard并按照那里的说明进行操作,设置非常简单,只需确保您的appId , masterKey和serverURL (您的serverURL将其输出作为parse-server命令的一部分)与您的Parse-Server匹配,则可以将appName设置为所需的任何名称。 一旦您将其运行到该网址,即会通过命令获得该网址(我的网址是http://0.0.0.0:4040/ )。 您应该看到一个如下所示的界面: 单击您的应用程序名称,然后单击左侧的“创建课程”按钮。 我们将创建一个名为TestClass的类来容纳一些TestObjects。 如下图所示,填写弹出窗口,然后单击“创建类” 下一步,单击“添加新列” ,其显示在屏幕顶部,并将其称为“ object_name” ,如下所示。 现在,您可以单击“添加一行” ,双击“ object_name”字段,然后根据需要命名为“ obj1” 。 您应该最终得到如下所示的内容。 接下来是Swift。 对于Swift而言,我们将使用CocoaPods安装所有内容,以防万一您在转到https://cocoapods.org并向下滚动到Install之前未使用过它们,则需要复制命令并在其中运行终端,则应安装CocoaPods。 接下来,您将要创建一个新的Xcode项目,它将是Single View Application,因此请在iOS下选择该项目,然后单击next。 随意命名项目并创建它,然后退出Xcode并在终端中打开Xcode项目。 运行“ ls”应显示类似下面的内容。 下一步运行“ pod init”创建一个PodFile,再次运行“ […]

在Swift中管理临时文件

引用计数非常适合将未使用的对象带出内存。 这同样适用于我们分配的临时文件。 假设您正在构建一个视频共享应用程序,这是每次用户决定从该应用程序上传一些内容时必须执行的操作: 拍摄电影并存储到临时文件中。 向用户展示过滤器/裁剪/任何编辑用户界面。 将最终视频渲染到另一个临时文件,现在可以安全地删除第一个文件。 将视频上传到云中,完成后删除第二个文件。 手动处理这些文件会增加额外的复杂性,并且可以很容易地进行监督,从而由于丢失数据而导致过多的存储使用。 当我的宠物项目突然接管了我所有的存储库时,我自己面对了这个问题😂 引用计数在这里很容易解决:我们可以创建包含常规URL TemporaryFileURL类,并在其deinit方法中执行清除。 现在,临时文件在从应用程序中取消引用时将自动删除。 请注意,我在这里使用了很少使用的带有赋值语法的捕获来传递contentURL进行延迟的文件清理:我们最好不要在释放过程中捕获self ,因此我们只复制基础文件URL并让self正确地释放。 现在,您可能希望统一处理文件的所有代码,无论它们是正常的还是临时的。 这就是ManagedURL协议的代表。 我们可以使URL struct和/或NSURL类符合协议,并在各处传递ManagedURL引用。 我还添加了一个no-op keepAlive函数,其唯一目的是允许通过用作完成处理程序的各种闭包轻松捕获对象。 这样我们可以在执行后台操作时保留文件,如下所示: 正如詹姆斯·理查德(James Richard)在Twitter上提醒的那样,这种技术称为“资源获取即初始化”或RAII,并且已经在C ++中使用很久了。 这个技巧对管理任何外部资源的生命周期都非常有用,但是由于析构函数在ARC,GC,延迟,try / finally和其他方法的现代世界中并不常见,因此常常被忽略。 感谢您的宝贵时间,并希望本文对您有所帮助。 如果您觉得本文有用,请不要忘记to。

如何避免协议导向沉迷于编程

大约一年前,我正在观看2015年的WWDC视频,当时一次特别的会议演讲引起了我的注意。 似乎引起了所有人的注意。 鉴于在过去一年中创建了与Swift相关的内容,许多人已跃入全新的编程范式。 我当然是指大卫·亚伯拉罕斯(David Abrahams)提出的有关面向协议的编程的精彩演讲。 如果您还没有看到它,并且使用Swift编写应用程序,那么绝对值得一试! 认真地做吧。 接下来的事情并不是试图减轻演讲中所呈现的内容的酷感。 如果正确应用协议扩展,它将是一个很棒的工具,它具有许多实际用途,我们将在本文的最后进行介绍。 问题是我们所有人都感到内gui(绝对包括我自己)。 当您拥有闪亮的新锤子时,一切都将变成钉子。 因此,在过去的一年半中,协议一直在敲定,我们的项目是钉子。 我们学到了什么? POOP的起源 它总是以一种天真的渴望学习新事物而开始。 与在圣诞节打开Nintendo 64的包装并整夜陪同兄弟姐妹玩Goldeneye并没有什么不同。 是的,我知道那与我约会的时间。 协议定向痴迷编程是过度使用协议扩展需求的产物,尤其是在不需要它们的情况下。 POOP是对令人敬畏的新工具的一种完全可以理解的反应,但是正如我之前所说的,在编程中所做的任何事情总会有取舍。 仅查看收益是远远不够的。 我们必须始终考虑成本。 那么面向协议编程的权衡是什么? 为什么我们要避免将所有内容重构为协议和协议扩展的冲动? 是什么使POOP便便? 一切都取决于 代码的 可读性 。 痴迷于协议定向的编程如何危害代码的可读性。 与开发人员团队合作时,有效的沟通是成功的关键。 可读的代码可导致更好的沟通。 不可读的代码使团队工作变慢,因为每个人都需要更多时间来弄清楚它的作用。 作为团队中的开发人员,您应该始终努力减少代码对同事的认知负担。 拥有可读的代码不仅仅意味着选择正确的类和函数名称。 与在单个位置中显示适当数量的信息有很多关系。 另一个开发人员应该只查看一个文件就可以弄清楚代码的作用。 这个有一个名词。 我们称其为本地推理。 这意味着人们应该能够推理您的代码,而不必到处移动太多。 它是一种支持预先的显式代码的设计哲学。 当您出于保留局部推理的目的而编写代码时,尝试避免使用复杂的类层次结构和设计,这些层次结构和设计迫使其他开发人员从一个文件跳到另一个文件,只是为了清楚地了解代码的作用。 协议定向痴迷编程是有问题的,因为它使本地推理几乎不可能。 为了更好地理解为什么会出现这种情况,我请您取悦 惊人的爆炸结构 假设您有一个基本的Milkshake结构。 它具有您可能熟悉的一些变量和功能。 现在我们可能不一定同意授予Milkshake结构的功能,但是我们可以同意这里有可读的代码块。 就是说,所有这些都为我们阐明了。 我们不需要去其他地方去了解这个结构的作用。 很容易推理。 如果我们将奶昔的一部分重构为一些单独的协议,将会发生什么? 好吧,这并不可怕。 从技术上讲,它仍然像我们的其他结构定义一样工作。 不幸的是,它的可读性差得多。 […]

Xcode中的花哨字面量

文字 今天,我将向您介绍Swift中可用的一些奇特的文字。 它们可以帮助您简化Swift程序员的生活。 首先,让我们解释一下“文字”一词​​实际上代表什么。 根据维基百科 : 在计算机科学中,文字是用于表示源代码中的固定值的符号。 这意味着在Swift中,以下论点是正确的: 让someNumber = 1 // 1是文字 let someString =“生日快乐” //“生日快乐”是一个文字 让optionalBool:布尔? = nil // nil是文字 通常,文字是程序员直接键入的值。 多年来,我们在其他编程语言中都有这种文字,因此,在Swift中这并不是什么前沿技术。 但是,并非所有人都知道Xcode还提供了颜色和图像的文字。 颜色文字 考虑一下您在代码中编写了多少次这样的代码: 让someShadeOfGreen = UIColor(红色:25/255,绿色:210/255,蓝色:95/255,alpha:1.0) 好的,也许您比我聪明一些,并且您已经为UIColor编写了自己的初始化程序,所以您不必每次想创建UIColor对象时都用255和alpha编写此奇怪的除法。 无论如何,它仍然不能使您对这种颜色有任何了解。 我为这个变量命名,所以我可以假设稍后再回到这部分代码后,它有些绿色。 但是,您知道,“ 灰色的五十道阴影 ”中的五十个字是有原因的。 有很多。 值得一提的是,Color Literals派上了用场,它使我们可以将值分配给UIColor变量并预览结果。 您只需开始在编辑器中键入colorliteral即可使用Color Literals 。 然后,将显示预览。 双击可以从调色板中选择所需的任何颜色,也可以只键入适当的RGB值: 我认为这是在代码中创建UIColor对象的不错选择。 图片文字 Xcode中另一个可用的奇特文字是Image Literals。 它们的工作方式与Color Literals类似。 让我们讨论一种创建UIImage对象的经典方法, 该对象包含资产中的一些图像: 让pepeImage = UIImage(命名为:“ […]

使用iOS 12中的自定义Siri快捷方式构建交互式语音应用

Siri Shortcut是Apple在iOS 12中基于SiriKit框架引入的新API。 它为开发人员提供了为用户在应用程序中经常使用的活动提供自定义快捷方式的方法。 用户通过向Siri发出语音命令来调用快捷方式,可以通过记录与快捷方式关联的自定义短语来自定义实际短语。 自iOS 10中发布SiriKit以来,Apple一直在其提供的多个内置域(例如乘车共享,付款,消息传递等)中限制Siri的使用。开发人员无法选择提供自己的自定义意图。 但是,借助iOS 12中的Siri Shortcut,Apple终于为开发人员提供了框架,供他们构建自己的自定义意图,该意图可以使用至少可以用于Siri Shortcut的自定义参数和响应进行配置。 开发人员创建自定义意图的能力为开发人员打开了许多与Siri进行交互的方式,例如: 点东西(例如披萨,咖啡,早餐😋); 搜索可以连接到任何API的信息; 执行我们希望Siri执行的任何自定义操作; 还有很多! Apple鼓励开发人员仅为用户创建有意义的快捷方式,例如,为用户在使用应用程序时希望重复的活动提供快捷方式。 不建议为用户仅在应用程序中执行一次的活动创建快捷方式。 我真的鼓励大家观看下面的Apple WWDC 2018视频,以从Siri工程师那里了解有关Siri Shortcut的更多信息: Siri快捷方式简介– WWDC 2018 –视频– Apple Developer Siri快捷方式是iOS 12中的一项强大新功能,可让您的应用向Siri公开其功能。 这个… developer.apple.com 使用Siri快捷键构建语音– WWDC 2018 –视频– Apple Developer Siri快捷方式是帮助人们执行操作或从您的应用程序获取信息的好方法,但是快捷方式可以是… developer.apple.com 在本文中,我想提供一个简单的示例,说明如何使用Siri Shortcut使用The Movie DB API对即将上映的电影进行搜索,然后使用自定义Intent UI Extension显示结果。 为了使用Siri快捷方式构建演示应用程序,我们将介绍以下内容: 创建新项目并设置Podfile。 创建共享框架以在主应用程序和扩展之间共享。 构建影片列表视图控制器 创建Siri意向定义文件 创建意图扩展 创建意图UI扩展 从View […]

第五幕基本礼品店

艾米(Aimi Samantha)Garcia Medellin A01570476

夏季应用开发

(反射) 今年夏天,通过“芝加哥一个夏天” , “午夜敲门”和芝加哥公立学校的CS4All ,该市的几名15至19岁的年轻人有机会从事应用程序开发工作。 支付给学生的费用是学习计算机编程,开发应用程序,然后将该应用程序上载到位于城市西南侧Gage Park高中的iPad或iPhone。 在整个叙述中,夏季工作的年轻人被描述为青年和学生,而员工则被描述为教师和教员,因为员工和老板所扮演的学习量往往比老师和老板的经历大得多。学生。 Swift和Xcode 苹果公司开发了自己的编程语言,称为Swift。 (https://developer.apple.com/swift/)学生学习了Swift,以及如何使用名为Xcode的Apple程序进行编码和编程。 苹果公司还开发了完整的课程表,他们称之为“每个人都可以编码(https://www.apple.com/ae/education/everyone-can-code/) ”,以使学生通过自己称之为的东西接触Swift一个游乐场。 在这种环境下,将指导学生学习一些编码概念,例如变量,常量,函数等,尤其是它们在Xcode中的工作方式。 还指导学生完成多项任务,例如创建 学生创建的应用程序是使用Swift在Xcode内开发的。 学生和教职员工 我们是谁? 我们是谁 谁参与了该计划? 二十名学生大部分来自Gage Park高中,周边的Englewood社区或更南端的学生,还有几名来自城市西侧的学生。 学生主要是非裔美国人以及三名拉丁裔学生。 在初步调查中,大约三分之一的学生以前从未做过编码。 一些人在可汗学院学习过JavaScript。 大多数人在以前的编码课程中只真正完成过Photoshop。 不用说,所有的学生都完全不熟悉Swift和Xcode,但是他们都对学习特别是与应用程序开发有关的学习感到非常兴奋。 每个人都想制作一个应用程序,进入应用程序商店并开始赚钱,或者他们一直说:“赚钱!” 该程序有两名讲师,可在出现故障排除需求时为学生提供帮助,并帮助学生浏览Apple的课程。 他们的任务是确保学生在遇到很多困难或混乱时能够解决问题并坚持不懈。 他们还必须想出办法,使这些材料更具吸引力并易于使用,特别是对于那些以前从未做过编码或要求大量阅读的学生来说,是必不可少的。 讲师发现了诸如Code.org之类的程序,该程序在CPS和全球范围内也广泛使用,以使青年人在不太繁重的文本环境下进行编码。 讲师还提供了有关演讲最佳实践的指导,并定期围绕工作场所礼仪问题提供咨询服务。 青年和工作人员一起工作了七个星期,目标是在计划结束时展示一些应用程序。 创建了一个小型数字社区,以通过应用程序开发解决现实世界中的问题。 入门 为便于教学,并跟踪日常活动和任务,创建了一个网站“ Summer App Development” (tinyurl.com/sumappdev) 。 在@summerappdev句柄下创建了一个Twitter帐户(https://twitter.com/summerappdev) ,以突出显示并跟踪我们在七个星期内的活动。 进行了初步调查(https://goo.gl/forms/Q2CtUuvPw85kKMmh2) ,以了解学生从一开始就在哪里使用编码和技术。 从这项调查中,我们发现大约三分之一的人以前从未做过任何编码。 最初的调查帮助我们意识到,在没有任何背景经验的情况下,学生将无法直接进入Xcode并使用Swift。 然后向该青年提供了Code.org的帐户。 成对学习时,学生在“加速课程”中进行配对编码 。 不久,学生开始创建循环,函数,然后将循环和函数嵌套在循环和函数中。 在此应简要说明设置。 学生可以使用iMac台式机和MacBook Pro笔记本电脑。 […]

如何为您的应用设置不同的图标

在构建应用程序时,我们通常会在设备上安装App Store版本,但是我们也需要安装beta版本,如果我们想将它们都安装在同一设备上,则需要区分它们。 最好的解决方案是使用不同的图标。 构型 第一步是为所需的每个图标创建配置。 例如: 开发环境的调试配置, Beta环境的Beta配置, 产品环境的发布配置。 默认情况下,将创建Debug和Release配置,我们可以通过复制现有配置来添加Beta配置。 应用程式图示 接下来,我们必须在Assets.xcassets文件中创建几个应用程序图标 。 您可以随意命名,理想情况下,您希望为每个配置创建一个“应用程序图标”。 构建设置 在目标的“构建设置”中,您需要为每个配置指定“ 应用程序图标”和“ 捆绑包标识符 ”。 资产目录应用程序图标集名称 这样,将根据当前配置自动选择应用程序图标。 产品捆绑包标识符 由于应用由其捆绑包标识符标识,因此我们需要为每个配置指定一个不同的捆绑包标识符。 然后,将为每个捆绑包标识符创建一个不同的应用程序。 代码配置 有时,您还想检测代码中的配置,这对于常量尤其有用,例如您的API的域。 有几种方法可以做到这一点,最简单的方法是在“构建设置”中添加一些标志。 然后,您可以在代码中访问这些标志: struct Constants { #if DEBUG static let domain = “dev.example.com” #elseif BETA static let domain = “beta.example.com” #else static let domain = “www.example.com” #endif } 当然,目标是避免在太多不同的文件中使用它们,这就是为什么我通常将所有常量放入此条件语句中。 方案 […]

与NSCollectionViewItem纠缠

如果我此时尝试运行该项目,将显示错误。 我最终进行了搜索,很多人以前都遇到过这个问题。 自2014年以来,它发生在大型API更新之前。 到目前为止,没有解决方案,只能删除它。 覆盖内容大小并不容易 我来自iOS开发背景,并且一直在使用UICollectionView。 一个常见的技巧是更改contentSize,以便获得更大的可滚动区域。 将偏移量设置为特定区域以进行显示很有用。 与UICollectionView不同,NSCollectionView中没有’contentSize’属性。 相反,可以使用NSCollectionViewLayout中的属性“ collectionViewContentSize”来更改contentSize。 这也存在于iOS的对应版本中。 这也意味着,该使用2015年更新中可用的新API了。 然后,假设我更喜欢流布局,我将创建NSCollectionViewFlowLayout的子类。 我现在可以覆盖该属性以允许更大的内容大小。 在替换布局时,我还将在代码中设置项目大小。 harryworld / NSCollectionViewItem 通过在GitHub上创建一个帐户为NSCollectionViewItem开发做出贡献。 github.com 创建项目的占位符可能会导致问题 每个项目都有一个大小。 有时,我不想使用数据源制作商品,而是想将其创建为占位符。 这是根据项目的内容执行一些尺寸计算的。 如果仅创建项目,则不会链接其中的UI组件。 通常,我们从对象连接那些组件。 当NSCollectionView制作项目时,它将正确链接它们。 但是,如果我使用构造函数初始化该项目,则这些组件不会连接。 有时,我什至会收到“视图未加载”的错误。 解决方案分为两部分。 第1部分:为了确保NSView在创建时可用,您应该将视图同时连接到文件的所有者和对象。 在这种情况下,我们将依靠文件的所有者连接来初始化视图。 第2部分:对于其他UI组件,它们充当Interface Builder中的子视图。 我们需要手动连接它们。 只需循环浏览所有子视图,并将它们与预定义的标识符进行匹配。 harryworld / NSCollectionViewItem 通过在GitHub上创建一个帐户为NSCollectionViewItem开发做出贡献。 github.com 我已经创建了解决所有这些问题的示例项目,您可以在此处找到源代码。