Tag: iOS应用程序开发

SFSafariViewController

什么是SFSafariViewController? SFSafariViewController是一个对象,提供了用于浏览Web的可见标准界面。 视图控制器包括Safari功能,例如阅读器,自动填充,欺诈性网站检测和内容阻止。 需要注意的是,您的应用程序看SFSafariViewController用户的活动以及与SFSafariViewController交互,因此无法访问自动填充数据,浏览历史记录或网站数据。 重要 根据《 App Store审查指南》 ,必须使用此视图控制器将信息可视地呈现给用户。 控制器可能不会被其他视图或图层隐藏或遮盖。 此外,在 未经用户知情和同意的情况下 ,应用程序可能不会使用 SFSafariViewController 来跟踪用户。 如何使用它? SFSafariViewController是SafariServices框架的一部分,因此首先您需要导入此框架,然后创建SFSafariViewController实例,然后将其呈现。 您的视图控制器应如下所示: 资源 苹果文档:SFSafariViewController

如何使用NSAttributedString转换HTML

本教程将向您展示如何使用NSAttributedString转换HTML。 通过使用NSAttributedString转换HTML,我的意思是转换HTML标记并从中创建属性字符串。 然后将其加载到UILabel或UITextView之类的文本组件中。 有时,您可能会从API得到响应,在该响应中,您将拥有一个字符串以及其中的所有HTML标记,并且需要以属性字符串的形式将其呈现给UI。 HTML示例 This is heading 1 This is heading 2 This is heading 3 This is heading 4 This is heading 5 This is heading 6 创建扩展 我经常使用扩展,并会建议您同样的扩展 ,因为它们是组织Swift代码和使函数可重用的关键。 现在,我们将创建字符串扩展名,在其中保留我们的convertHtml()函数,该函数将为我们完成所有工作。 此函数会将所有HTML标记转换为NSAttributedString 。 让我们将扩展名命名为String + Extensions.swift。 extension String{ func convertHtml() -> NSAttributedString{ guard let data = data(using: .utf8) else { return NSAttributedString() } […]

iOS:使用服务器中的图像

如果您是移动应用程序开发人员,则有时需要与后端进行交互。 您可能需要执行的任务之一是从服务器检索并显示图像,或将图像提交到该服务器。 提交图像时应使用哪种格式? 您如何将从服务调用中收到的字节转换为图像? 让我们构建从服务器到iOS App的整个堆栈,以了解操作方法。 设置一个后端 我们将首先构建一个Kitura服务器,该服务器提供RESTful API来完成两件事: 从客户端接收图像 提供接收到客户端的最新图像 我已经把完成的服务器放在我的Github上了 。 创建服务器项目 创建一个目录,并初始化一个新的可执行Swift包。 mkdir mkdir SwiftImageServer && cd SwiftImageServer swift package init –type可执行文件 编辑您的Package.swift文件,以指定您需要Kitura软件包。 导入PackageDescription 让package = Package( 名称:“ SwiftImageServer”, 依赖项:[ .Package(URL:“ https://github.com/IBM-Swift/Kitura.git”,majorVersion:1 ) ]) 您可以运行swift package fetch并且应该看到SwiftPM克隆Kitura及其所需的一切。 使用swift package generate-xcodeproj ,让我们开始编码! 创建一个Kitura服务器 后端将非常简单,因此我们将在main.swift 。 让我们从添加所需的所有样板开始: 进口Kitura import Foundation //创建一个可用于创建REST端点的路由器 let router = […]

Swift:查找未使用的代码

是否想在您的Xcode项目中找到所有未使用的Swift代码? 没问题。 我们将使用外围设备。 这是一个免费工具,而且非常准确。 安装外围设备 首先,我们需要安装Homebrew-如果您已经安装了Homebrew,则可以跳过此步骤。 / usr / bin / ruby​​ -e“ $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” 接下来,我们需要告诉Homebrew在哪里可以找到Periphery版本。 酿造水龙头外围设备/外围设备 最后,安装Periphery本身。 酿造桶安装外围 扫描您的项目 现在已经安装了Periphery,我们准备让它扫描Xcode项目。 转到您的项目目录并运行: 周边扫描 这将开始引导式设置。 第一步是选择要分析的构建目标。 选择正确的目标很重要。 假设Class A是目标Acme Kit的成员,并且只能在一次使用:目标Acme App Class B 。 如果您选择仅分析Acme Kit ,则Periphery将无法识别Acme App使用了它。 因此,在此示例中,我们必须分析AcmeApp和AcmeKit ,这一点很重要。 接下来,我们需要告诉Periphery需要哪些方案来构建我们选择的目标。 现在,我们需要确定是否假定已标记为public类,函数,枚举等…正在使用。 如果您的项目包含使用所有public接口的应用程序,请选择“ No ,或者如果您的项目只是一个框架,请选择“ Yes 。 最后,我们需要告诉Periphery假定正在使用@objc注释的任何内容,因此现在选择Yes 。 当您感到有点冒险时,您总是可以稍后再回来尝试不同的选择。 按Enter键,Periphery将开始扫描您的项目,并以未使用的声明列表结束。 恭喜你! 现在,您可以开始从项目中删除未使用的代码。 但是首先,让我们通过将Periphery集成到Xcode中,使它成为更好的体验。 Xcode整合 […]

玩Swift ..故事板Segues

《玩转周围》是一篇实验性文章,探讨了Swift中不同的处理方式。 在一个项目中表现出色的技术在下一个项目中可能并不理想,因此,这些文章将很少讨论什么是做事的最佳方法,而更多是关于做事的更好方法。 如果您使用情节提要,您可能会看到类似以下内容: 覆盖func prepare(用于segue:UIStoryboardSegue,发件人:任意?){ 如果segue.identifier ==“ pushMovie” { 让电影=电影[tableView.indexPathForSelectedRow!.row] 让movieVC = segue.destination作为! MovieViewController movieVC.movi​​e =电影 }否则,如果segue.identifier ==“ addMovie” { 让movieFormNC = segue.destination作为! UINavigationController 让movieFormVC = movieFormNC.viewControllers.first作为! MovieFormViewController movieFormVC.delegate =自我 } } 这段代码确实还不错。 它可能会给我们的视图控制器增加不必要的膨胀? 并且可以肯定,我们会错误地复制segue标识符。 我们必须进行一些强制施法。 但是,任何错误都会在我们看到运行时错误后立即解决。 尽管进行了合理化,但让我们看看是否可以使其变得更好…… 首先,让我们看看Google是否可以帮助我们。 这使我想到了2015年的Natasha The Robot博客文章(猜测我们来晚了),她在WWDC会话中进行了详细阐述(希望您单击该链接就使用Safari),以解决此问题。 此技术利用协议扩展。 创建一个类型以将我们的segue标识符表示为枚举 Segues协议{ relatedtype SegueIdentifier:RawRepresentable } 2.扩展协议,限制它只能在UIViewController上使用 扩展Segues,其中Self:UIViewController,SegueIdentifier.RawValue ==字符串{ //方法来 } 3.添加一个接受我们的SegueIdentifier类型的performSegue方法,并将其rawValue传递给默认的performSegue方法 func […]

Swift中的“ inout”

最近,在使用swift时,我想到了一个用例,其中我需要修改作为参数传递给函数的变量。 最终,传递给函数的所有变量都是不可变类型,无法更改,类似于let变量。 如果它是一个类对象,则不能创建新对象,但可以操纵该类对象的属性,也可以使用该对象调用任何函数。 班级员工{ var名称:字符串 变量年龄:整数 init(名称:字符串,年龄:整数){ self.name =名称 自我年龄=年龄 } } func changeEmployeeData(emp:Employee){ employee.name =“ Suneet” 员工年龄= 25 } 让员工=员工(姓名:“随机”,年龄:10) print(employee.name)//随机 print(employee.age)// 10 changeEmployeeData(emp:员工) print(employee.name)// Suneet print(employee.age)// 25 现在,当您的参数为原始数据类型时,就会发生问题,您根本无法更改该值。 变量:Int = 1 func changeNumber(数字:整数){ num = 2 打印(数字) } changeNumber(num:变量) 它将显示错误“无法分配给值:’num’是’let’常量”,这是不言自明的。 我们不能修改作为参数传递的参数,因为它们是let类型的。 现在,如果要修改此值怎么办? inout救援。 您可以在inout传递参数的地方使用它作为参考。 变量:Int = 1 func changeNumber(num:inout Int){ num = 2 […]

NSScanner

Tengo侦察员que大豆和乌斯别克拉斯正规军。 信息安全法治之父的儿子之死 可以从苹果或苹果公司的NSScanner或Scanner上获取更多的信息。 是否需要定期扫描扫描仪? 墨西哥联邦储蓄银行在西班牙联邦储蓄银行/西班牙联邦储蓄银行/墨西哥联邦储蓄银行,西班牙联邦储蓄银行和墨西哥联邦储蓄银行,墨西哥联邦储蓄银行,西班牙联邦储蓄银行,西班牙联邦储蓄银行,墨西哥联邦储蓄银行埃斯塔格式。 虚幻的奇幻怪兽在礼仪上的使用和娱乐,无论是玩耍还是玩耍。 没有任何形式的行为 , 没有任何权利的 诉讼 ,也没有因诉讼而被罚款 。 Es en estos casos en los que Scanner seconvertiráen nuestra nuevo是主要的框架。 竞争性竞争者0..n礼节性交易 Ahora爆炸了我们扫描仪。 NSScanner对象将NSString对象的字符解释并转换为数字和字符串值。 您可以在创建扫描器的字符串时为其指定一个字符串,然后当您请求项目时,扫描器会从头到尾逐步浏览该字符串的字符。 查找干草或军刀或扫描仪的字符串和字符集 。 报名参加在埃尔卡纳德科多纳举行的体育比赛。 El segundo esunpresentaciónde los conjuntos de caracteres Unicode,或由unsotros定义。 您在扫描仪上看到的军刀… 公交车上的caden de texto en la que mos — 字符串 Como empieza lo que queremos公交车— CharacterSet 科莫终点站que […]

Swift 4中的主函数

目的 介绍在Swift 4中使用函数的所有有用信息。希望到本文结尾,您将对在Swift 4中使用函数有深刻的了解,然后将其优雅地应用到您的项目中。 我给出的例子将是相关的。 基本上使用我们已经知道的东西来解释一些新东西。 我会尽力而为。 清晰,简洁,实用。 目前为止就这样了。 打开Playground,让我们直接潜水。 什么是功能? 函数是执行特定任务的独立代码块。 – 苹果 我们定义函数来执行某些任务,稍后可以调用。 就像具有已定义功能的“打开”按钮的交流遥控器一样。 我们可以通过按“开”按钮来调用该已定义的函数,AC会尝试冻结您。 有史以来最简单的功能 让我们从零地面开始,然后逐步发展。 这样我们就不会错过任何一件事情。 在我下面是一个空函数,请检查一下: func emptyFunction(){ } 我可以在我的代码中这样调用: emptyFunction() 目前,它绝对不执行任何操作。 这样,我们就可以剖析函数并了解Swift中创建函数的每个细节。 与iOS开发人员,代码访问员和书面交流时,下一部分特别有用。 要“命令”我们刚刚对另一个人所做的事情,可以说定义一个称为“空函数”的函数。 func→定义一个功能 emptyFunction→函数名称 现在可以使用 如今,我们中的很多人都沉迷于皇家冲突。 也许只是我。 无论如何,让我们从Clash Royale的场景中举例说明。 我们将定义一个函数,对其进行调用,然后逐步学习一些东西。 让我们来看看它的作用。 限定 尝试看看是否可以根据我收到的描述提供一个功能。 定义一个名为“ battle with”的函数,该函数带有两个参数。 第一个参数是字符串类型的播放器名称。 第二个参数是我们要使用的战斗甲板。 如果您没有获得参数部分,请不要担心,因为我尚未向您介绍参数,但是在本文中将进行详细介绍。 这是函数编写方式的示例: func BattleWith(playerName名称:String,BattleDeck卡座:Int = 2)->字符串{ return(“使用甲板编号\(甲板)的战斗\(名称)。”) } 不要惊慌。 […]

Swift中的内存管理

什么是弱变量? 您知道吗,在IBOutlets前面。 查看苹果的文档,我发现了自动引用计数(ARC)。 Apple使用ARC进行内存管理并跟踪内存使用情况。 诸如强,弱或无主之类的关键字会在何时添加或释放保留计数时向ARC发出信号。 坚强的默认Default 每次我们声明一个class属性时,默认值都是一个强引用。 神奇宝贝类{ var名称:String =“ Pikachu” var skill:Skill = Skill() } 班级技能{ var类型:字符串=“ Pika Thunder” } 让myPokemon = Pokemon() 打印(“我的新皮卡丘技能:”,myPokemon.skill.type) 宠物小精灵具有技能属性。 当我们创建Pokemon类时,也会创建Skill类。 因此,Pokemon类具有指向Skill类的强大指针,并增加了Skill的保留计数。 当Pokemon类被释放后,指针将被删除,Skill类将其保留计数减少为零。 参考不足 等一下,如果指针指向两个方向的是双向关系呢? 如果Skill类具有指向Pokemon类的指针,并且Pokemon类被分配了一个值,我们将创建一个保留周期 🔄这可能导致内存泄漏🙁 class Pokemon {var name:String =“ Pikachu” var技能:Skill = Skill()} class Skill {var type:String =“ Pika Thunder” var pokemon:Pokemon?} let myPokemon = Pokemon()myPokemon.skill.pokemon […]

Swift 5.0引入了新的结果类型…..?

Swift 5.0引入了新的 结果类型 作为通用枚举实现的,有两种情况 :。 成功和。 失败 , 在每种情况下都包括一个关联值。 值与大小写关联。 成功可以是任何值(取决于您)。 值与case关联。failure必须是采用Error协议的类型 。 为什么? 结果类型 — 它 提供 了一种更清晰,类型安全的错误处理方式。 例如-让我们创建一个简单的函数toInteger ,它将字符串转换为整数并返回Result 。 请注意, case .success的关联值是Int类型,而case .failure的关联值是AnErrorType类型,该值采用Error协议。 现在我们可以像这样使用它: 因此,通过使用 Result类型 ,很明显,我们可以获取 Int 类型的 结果值 或 AnErrorType 类型的强类型错误值 。 不可能 全有 或 全无 结果类型 提供 了更清晰,类型安全的错误处理方式。 另外, Result类型支持特定的初始化器,该初始化器接受引发的闭包- 例如 – 目前为止就这样了。 感谢您的阅读! 这是我有史以来第一篇中级职位。 我希望本快速阅读可以使您快速了解利用枚举功能在Swift 5.0中引入的新Result类型。 我真的很感激我的任何建设性批评,请随时在这里发表您的看法。 请通过与世界各地的Swift爱好者分享并分享这篇帖子,来帮助我传播信息。 […]