Tag: ios

Ruby on Rails的最佳做法

红宝石宝石 今天,我们将讨论使用MVC框架时众所周知的良好实践。 谁从未听说过“肥胖模型,瘦身控制器”这句话? 那是一个非常普遍的想法。 但是,有很多方法可以帮助您使我们的模型,视图和控制器变得更加瘦弱。 这可以帮助您进行更好的测试,并使代码可重复使用。 在本文中,我们将讨论方法和类中逻辑的分离,以及如何不将所有代码仅保留在模型,视图或控制器中。 首先,让我们记住MVC架构模式以及每个职责是什么。 基本上,MVC代表模型,视图,控制器,其主要目标是将逻辑分为三个主要层。 模型:负责表示数据,数据验证,业务逻辑以及与数据相关的所有事物。 查看:它向用户显示信息。 控制器:它是模型和视图之间的中间层。 它通过路由器接收用户请求,然后向模型询问数据并在视图中显示响应。 这里要强调的重要一点是,并非所有内容都应保存在这三个地方。 当您打算干燥应用程序时,其他一些类确实很有用。 让我们开始谈论它。 帮手 Rails允许您使用助手,以便您可以从视图中提取逻辑。 如果需要格式化或在显示之前进行验证,则应使用它。 例如,不要这样做: 你应该做这个: 模块ProductHelper def product_price(产品) product.price是否为product && product.price.present? 结束 结束 然后,在您的视图中,您只需要调用预定义的方法。 像这样: 这样,您可以轻松地测试您的助手,也可以多次重用它,而不必将逻辑带到视图中。 通常,它可以自动在视图和控制器中使用。 但是,更常见的是将其用于视图(后端还有其他辅助功能)。 您在模块中声明的所有帮助程序将在您的所有视图中可用-不仅仅是在同一个命名视图中。 服务 服务是一种干燥控制器的方法。 人们通常创建目录“ / service”并将文件放入其中。 每个文件都是一个类,具有一个初始化程序,输入和该类的特定/相关方法。 为什么要使用它? 如果您想集中精力应用程序的核心逻辑,并且还需要瘦小的模型和控制器,则应该这样做。 服务用例的一个示例: 类ProductLogisticService def initialize(参数) //初始化变量 结束def addInStock //在您的库存中添加产品的方法 结束def removeFromStock //从库存中删除产品的方法 结束 […]

尽早制作-Siri快捷方式入门| Byteout博客

让我们通过引用WWDC 2018中的Apple来开始这篇文章 Siri快捷方式是iOS 12中强大的新功能,可让您的应用向Siri公开其功能。 这使Siri可以根据各种上下文在相关时间建议您的快捷方式。 有了这项新功能,应用程序便有了新的面貌-语音。 而且,它们会在您可能想到的时候立即出现在Spotlight上,从而自动“变得更聪明”。 因此,在本教程中,我将向您展示使用NSUserActivity在应用中实现快捷方式的速度—包含2个代码块 。 我将指导您完成一些步骤,向Siri展示我们喜欢的应用程序的一些最有价值的功能。 注意:您可以 在 Byteout Software博客 上 找到带有 更好格式的代码 的原始帖子 。 简短介绍-我们示例的背景故事 早期游戏警报是一款闹钟应用,在用户赢得简单游戏之前,它不会停止响铃。 用户也可以随时随地玩游戏,即使没有警报也是如此。 为此,在没有新的快捷方式的情况下,他们必须: 启动应用 转到列出所有游戏的屏幕 滚动到他们最喜欢的一个 按“播放” 但是有了快捷方式,他们将只能使用自己的声音,或者在搜索中键入游戏名称。 因此,让我们深入研究代码! 第一步是进行用户活动并在适当的时间捐赠。 // GamesSelectionViewController.m // 1. Make activity – (void)donateActivity { NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@”com.your_appname.game_activity”]; // A activity.title = [NSString stringWithFormat:@”Play %@”, self.selectedGame.name]; // B […]

什么是Cydia下载iPhone 8?

Cydia Download是越狱设备的应用商店。 Cydia背后的开发商是Jay Freeman,他的名字叫Saurik。 Cydia下载实际上是二级应用商店,一旦设备越狱,用户便可以从中获取第三方的自定义应用。 只有通过越狱技术,才能在iOS设备上获取Cydia Download。 Cydia Download是越狱后用户能够下载,安装和管理设备活动的位置。 Cydia下载iOS 11无法从Cydia官方网站上安装,因此,您需要使用越狱工具(例如Pangu,Yalu或TaiG)来安装Cydia。 越狱过程会有所不同,具体取决于设备的型号和所使用的iOS版本。 因此,在启动越狱过程之前,需要确保已选择正确的越狱工具。 建议在下载Cydia之前先阅读与Cydia Download相关的教程。 Cydia Download可以提供比现有功能更多的功能,从而使您的iDevice更加智能。 因此,在Apple每次发行新固件后,等待新版本的Cydia出现都不会有危害或不利之处,因为它始终是使用户满意的版本。 使用所有Cydia应用程序以及进行调整,用户可以通过使其iOS设备脱离其有限的框架来提高其性能。 随着iPhone 8和iPhone 8 Plus的发布,iOS用户会想到的一个问题是Cydia是否与他们的设备兼容。 iOS 11越狱是实现这一目标的关键,因为iPhone 8和iPhone 8 Plus均运行在最新的Apple iOS 11固件上。 因此,iOS 11越狱的开发人员一定会确保已将Cydia支持添加到iPhone 8和iPhone 8 Plus中。 应当指出,有些应用程序可以在不越狱设备的情况下安装Cydia应用程序。 视频指南Cydia下载iPhone 8

raywenderlich.com的官方Swift样式指南

类前缀 Swift类型由包含它们的模块自动命名,并且您不应添加类前缀(例如RW)。 如果来自不同模块的两个名称冲突,则可以通过在类型名称前添加模块名称来消除歧义。 但是,仅在可能出现混淆的情况下指定模块名称,这种情况很少发生。 导入SomeModule 让myClass = MyModule.UsefulClass() 代表们 创建自定义委托方法时,未命名的第一个参数应该是委托源。 (UIKit包含许多示例。) 首选: func namePickerView(_ namePickerView:NamePickerView,didSelectName名称:字符串) func namePickerViewShouldReload(_ namePickerView:NamePickerView)->布尔 不推荐: func didSelectName(namePicker:NamePickerViewController,名称:字符串) func namePickerShouldReload()->布尔 使用类型推断上下文 使用编译器推断的上下文编写更简短的代码。 (另请参见类型推断。) 首选: 让选择器= #selector(viewDidLoad) view.backgroundColor = .red 让toView = context.view(forKey:.to) 让view = UIView(frame:.zero) 不推荐: 让选择器= #selector(ViewController.viewDidLoad) view.backgroundColor = UIColor.red 让toView = context.view(forKey:UITransitionContextViewKey.to) 让view = UIView(frame:CGRect.zero) 泛型 通用类型参数应为描述性的大写驼峰名称。 当类型名称没有有意义的关系或角色时,请使用传统的单个大写字母,例如T , U或V […]

iOS中的资源包和静态库

如何在静态库中使用图像,Xib和情节提要之类的资源。 默认情况下,这在动态库中很容易实现,但是当涉及静态库时,可能会遇到一些挑战。 在本文中,我希望解释如何在静态库中使用故事板和图像之类的资源。 让我们跳进去。 步骤1:创建静态库 导航到“文件”->“新建”->“项目”,然后选择“ Cocoa Touch静态库”。 让我们给静态库起个名字。 那很简单! 步骤2:设定资源套件 导航到您的库项目,然后选择“添加目标”。 然后导航到macOS并选择Bundle。 命名资源束,我将其命名为Resources🙃 由于我们正在为iOS开发,因此将您的资源包基础SDK设置更改为“最新的iOS…”。 最后,将资源作为目标依赖项添加到您的静态库中。 步骤3:设定资源 在静态库中使用所有适当的配置和链接设置一个简单的ViewController和Storyboard。 为了使Storyboard成为捆绑软件的资源,您要做的就是将它们添加到目标的“复制捆绑软件资源”构建阶段。 现在您的静态库已准备就绪。 步骤4:链接静态库和资源包 通过创建一个简单的单视图应用程序并在viewDidLoad上模态显示“ MyViewController:”,来使用我们的新静态库。 为此,您必须将静态库.xcodeproj拖放到基本应用程序中。 这可能看起来像这样。 然后,您可以通过“链接的框架和库”链接静态库,就像这样。 最后,添加将资源束从静态库链接到基本应用程序。 为此,我们只需要将其从导航器窗格拖到应用程序项目的“ Copy Bundle Resources”阶段即可。 这应该看起来像这样。 第5步:使用它吧! 🎉 将以下代码添加到基本应用程序的视图控制器中,以便可以从适当的资源包中加载Storyboard。 一旦捆绑包被加载,您就可以简单地实例化并呈现它。 小菜一碟吧! 图像呢? 是的,您可以将图像引入静态库,但是必须将图像资产添加到资源包中,然后通过Xib,Storyboard或Bundle加载它。 希望您发现本教程对您有所帮助。 如果您有任何问题,请给我ping通,我很想听听您关于在静态库中使用资源包的想法。 和平✌️

流行的Swift iOS图表库

大多数iOS开发人员正在学习中,或者现在正在Swift中进行全面开发。 我想快速汇总一下令人难以置信的code.com上三个评分最高的Swift iOS图表库。 这些是根据受欢迎程度,各种图表和功能选择的。 图表 流行的且恰当命名的Charts是一个很好的起点。 使用iOS,tvOS和OSX的Swift编写。 但是,值得注意的是该演示项目位于目标C中。 该库为我们提供了8种不同的图表类型: 线,条,组合,饼图,散点图,烛台,气泡和雷达 还有很多选择,例如 在两个轴上缩放(触摸手势,单独轴或捏缩放)。 使用触摸手势和组合图(线,条,散点图,烛台,气泡)进行拖动/平移。 可自定义的轴(x轴和y轴)和突出显示值(具有可自定义的弹出视图)。 将图表保存到相机胶卷并导出到PNG / JPEG。 图例是自动生成的,但也可以自定义。 2.汇票 这是适用于iOS的高度可定制的图表库,包括: 条形(普通,堆叠,分组,水平,垂直) 散点图,直线(直线/三次/自定义路径生成器) 面积,气泡,多轴。 蜡烛。 一切都是可自定义的,例如颜色,视图,单位,标签,动画,交互,轴等。 使用叠加层,信息视图等,可以轻松创建任意标记。 它使用模块化架构,应该可以轻松创建新的图表类型或添加效果。 3. PNChart-Swift-这是原始PNChart目标C库的快速版本。 它具有一些不错的动画并支持: 酒吧 线 雷达 馅饼 散点图。 如果您对此列表有任何补充,请联系我们,让我们知道。

自动布局使用的视图属性

有些视图会根据其持有的内容自动调整大小,这称为其intrinsic content size 。 EG按钮的固有内容大小是其标题的大小加上少量的空白。 并非所有视图都具有固有的内容大小。 对于包含视图的视图,固有内容大小可以定义视图的高度,宽度或两者。 假设我们有一个带有文本“ Click Me”的按钮。 我们绝对不希望按钮小于其内部的文本,否则文本将被剪切。 这就是所谓的Compression Resistance Priority 。 视图的“抗压缩优先级”越高,则视图抵抗增长到大于其固有内容大小的能力就越大。 仍在“单击我”按钮上,如果我们不希望按钮的大小大于其内部内容,如下图所示: 如果我们希望按钮在没有太多填充的情况下拥抱其内容,则必须增加Content Hugging Priority 。 视图的“内容拥抱优先级”越高,则视图抵抗增长到大于其固有内容大小的能力就越大。 我们可以通过编程方式设置内容拥抱和抗压缩优先级,如下所示: 这两个方法采用两个参数,分别是UILayoutPriority和UILayoutConstraintAxis 。 优先级可以是必填项 , defaultHigh , defaultLow , fittingSizeLevel ,其中必填项是最高的,而fittingSizeLevel是最低的。 UILayoutConstraintAxis可以是垂直轴或水平轴。 我将在UIStackview上写另一篇文章,之后我将展示以编程方式编写不同视图的方法。 谢谢阅读。

可编码协议

从Objective-C到Swift的过渡当然也取得了成果-尽管有时陡峭的学习曲线和不断发展的语言性质有时可能会带来挑战。 (当然也有挫折 。多年来,iOS处理设备轮换的多种方式越少说越好!) 对我来说,在不遥远的历史中最能引起欢乐的变化之一就是添加了Codable协议。 Swift 5 刚刚发布(并获得了广泛好评),但是-在Swift 4中增加了Codable-对我而言,这是一个更加令人兴奋的发行版。 可编码协议 Codable是一个非常漂亮的Swift协议。 在Swift中(与Objective-C相反),相比于继承,它更加强调组合,使用协议在不使用子类的情况下向类,结构或枚举实例添加功能。 实现协议的类,结构或枚举被称为与该协议兼容 ,从而在该过程中获得了该协议的功能。 可编码的独特之处在于,它实际上只是可Encodable和可Decodable协议的结合的Encodable Decodable 。 一个实例可以独立地符合任何一个,但是如果它同时符合两个,那么它也是可编码的。 这些协议给我们带来了什么? 让我们来看看! 编码利益 许多应用程序的一项常见操作是从API提取内容。 例如,我们的KPCC API客户端下载文章,剧集和节目时间表数据,并将其转换为适用于应用程序的模型实例。 这是解码的示例(也称为反序列化)。 我们使用数据的序列化表示形式(在本例中为JSON),并将其转换为可以使用的形式。 我们还可以反向执行此操作,将数据编码(序列化)为一种格式,该格式可以传递回服务器或以本地缓存的形式保存到用户的设备中。 总而言之,我们得到了一个用于编码/解码的标准化系统,并且有机会删除许多样板代码。 我们的KPCC API客户端项目在很大程度上依赖于使用Codable来获取API响应,并使用它们返回本地模型实例。 基本编码和解码 符合Codable很简单。 假设您有一个结构,只需将Codable协议添加到您的结构定义中,如下所示: struct Cat:可编码{ var age:Int 变量名称:字符串 } 而已! 现在,如果您希望对该Cat结构进行编码并将其保存到用户的设备中,然后将其读回,则可以这样进行: let apollo = Cat(年龄:10,名字:“ Apollo”) 让apolloData =尝试吗? JSONEncoder()。encode(apollo) 让documentsURL = FileManager.default.urls(用于:.documentDirectory,在:.userDomainMask中)。 让fileURL = documentsURL?.appendingPathComponent(“ Cat.json”) […]

AVAudioSession简介

这周,我将谈论一个小得多的话题,但这个话题与我的内心深处息息相关。 我从音频界开始从事iOS开发,我总是喜欢谈论Swift中的音频。 今天,我在写有关AVAudioSession的文章。 花一点时间考虑一下我们如何在应用程序中使用音频。 有时,我们会出现一些小错误和bloop来提醒用户某些事情。 其他时候,我们会提供游戏的背景音乐或视频中的声音。 有时,可以通过手机侧面的静音开关关闭声音。 一切都很好,但是如果我们有一个时钟应用程序,并且需要警报来覆盖该开关怎么办? 如果我们希望我们的应用在手机屏幕锁定时继续播放音乐怎么办? 当我们的应用程序播放声音而另一个应用程序播放音乐时会发生什么? 应用程序通过使用音频会话来处理此问题。 关于iOS应用中的音频的第一件事是,您的应用不会直接接触设备的任何音频硬件。 该应用程序通过中介与操作系统进行通信。 该中介是音频会话,特别是AVAudioSession。 看! Apple文档中的方便图形! 启动应用程序时,在幕后将为它提供AVAudioSession的单例实例。 我们的应用程序可以使用AVAudioSession的共享实例来配置应用程序中音频的行为(首先必须导入AVFoundation)。 要调整AVAudioSession的总体行为,我们可以将其设置为以下几类之一。 AVAudioSession具有一个简单的方法: setCategory(_:mode:options 🙂 。 请注意,您可以设置的类别由全局字符串常量表示,例如“ AVAudioSessionCategoryAmbient” 那么,这些类别中的每一个都有什么作用? 好吧,我不会遍历其中的每一个,因此,这里有一个方便的图表以获取更多详细信息。 AVAudioSessionCategoryAmbient是默认类别。 设置为此时,来自应用程序的音频将通过静音开关关闭,不会中断来自其他应用程序的音频,并且不会接受任何音频输入。 如果我们将类别设置为AVAudioSessionCategoryPlayAndRecord,则每个类别的情况都将相反。 重要说明:如果您打算在应用程序处于后台运行时播放音频,则必须更改info.plist文件中的某些设置。 幸运的是,Xcode有一个简单的方法可以做到这一点。 只需进入项目功能,打开背景模式,然后选择“音频,Airplay和画中画”即可。 在每个AVAudioSession类别中,可以设置许多模式,这将为您的会话添加更多功能。 同样,这些模式中的每一个都是由常量表示的字符串。 我想知道这些值是否是从较旧的Objective-C代码中遗留下来的,因为通常在Swift中,这看起来像枚举通常表示的那种。 无论如何, 这是每个列表 。 这些模式是针对特定用例进行优化的较小的性能调整。 例如,在具有多个麦克风的设备上,AVAudioSessionModeVideoRecording将打开最靠近该设备摄像机的麦克风。 仅当您设置了较大的类别AVAudioSessionCategoryRecord和AVAudioSessionCategoryPlayAndRecord时,它才起作用。 要考虑的另一重要事项是AVAudioSession的激活和停用,以及在激活或停用失败的情况下的错误处理。 首先,这是来自Apple文档的绝对荒谬的图像。 我发誓我没有化妆: 这是他们的…有关AVAudioSession激活工作原理的解释。 在适当的时间激活和停用音频会话非常重要。 如果您在激活音频会话后将其激活,则您的应用将崩溃。 这是直接从Apple文档中获得的所有内容 : let session = AVAudioSession.sharedInstance() 做{ […]

Swift中的原型设计模式

通过复制现有对象的所有属性并创建独立的克隆,原型模式用于实例化新对象。 当新对象的构造效率低下时,此做法特别有用。 想象一下,下面有一个SmartPhone类: 现在我们需要创建此类的5个实例,如下所示: 我们可以很容易地意识到许多实例具有相同的属性,因此我们经常复制代码行,然后以不同的方式编辑任何属性。 没关系,但不是经过优化且容易出错。 让我们尝试将Prototype模式应用到下面的SmartPhone类中: 我们声明一个带有默认可选参数的克隆 func与属性相同。 该函数通过复制现有实例的所有属性返回一个新实例,然后根据需要修改某些属性。 现在创建5个实例作为波纹管: 我们不再需要通过调用设计的初始化程序来初始化新实例,只需“克隆”当前实例然后对其进行修改! 就这样! 原型模式非常易于理解,也易于通过其他编程语言实现。 当新对象的构造效率低下时,此功能特别有用。 如果您有任何疑问,请留下您的赞赏,感谢您的阅读!