Tag: Swift编程

Swift – UINavigationController的层次结构(以编程方式)🎯

大家好,我们今天将讨论UINavigationController 。 🤠 UINavigationController允许您管理堆栈中的大量视图控制器。 我来解释一下 您有一个具有主 控制器 ,登录 控制器和注册控制器的应用程序,该应用程序开始在主控制器上运行, 您有两个按钮可以推动登录/注册控制器。 是的,您可以通过UINavigationController! 如何使用导航控制器(以编程方式,没有情节提要)设置项目 1-您必须删除项目上的.storyboard文件。 2-如下所示,您必须在项目导航器>选择项目>常规>部署信息>主界面上删除情节提要名称。 3- 让我们修改AppDelegate文件 我们在主控制器上有两个按钮, 您可以通过按钮来推送登录/注册控制器。 您可以在GitHub上访问项目文件。 😎 strawb3rryx7 / UINavigationController-示例 UINavigationController-示例–如何在没有情节提要的情况下创建基于UINavigationController的应用程序。 github.com 1-动态更改UINavigationController的rootViewController 这是一个好话题。 让我们解释一下, 为什么我们需要更改Root View Controller? 您的用户已成功登录到您的应用程序,然后在已经登录时终止了该应用程序。在下一次,您不希望他们能够遇到主控制器或 登录控制器。 因此,您将在启动应用程序时确定AppDelegate,可以确定它们是否已登录并相应地设置rootViewController 。 但是,是否要注销? 在这种情况下,您必须将其rootViewController设置为主控制器。 我将与您分享我的解决方案。 在此扩展中,您将能够设置新的rootViewController 。 我建议您遵循注释行。 我解释了他们在那里做什么。 另外,UINavigationBar有一些项目,如您在图像上看到的,这些项目在下面列出。 backItem topItem.title topItem.leftBarButtonItem topItem.rightBarButtonItem backItem 您可以将以前的控制器备份到导航堆栈中。 有一些属性可以管理它们,您可以在 Apple Docs 上找到它们 。 Apple文档提供的backBarButtonItem […]

将iOS应用集成到设置应用

该捆绑包包含一个“ en.lproj ”文件夹,该文件夹具有用于本地化 (值)资源的“ Root.strings ”文件,该文件是可选的实现方式,但推荐用于最佳实践。 另一个是“ Root.plist ”,我们需要对其进行配置。 →Root.plist:这是iPhone设置架构字典,其中的键包括“字符串文件名 ”,“ SettingsPageTitle ”和最重要的“ 首选项 ”,后者是数组类型。 它仅接受6个值,这些值也是字典类型。 我们可以选择拨动开关,滑块,组,文本字段,标题和多值。 选择类型后,我们可以对其进行更多配置,例如提供其默认值等。 偏好项及其属性: 1.组:组类型用于在单个页面上组织首选项组。 组类型不代表可配置的首选项。 它仅包含一个标题字符串,该字符串立即显示在一个或多个可配置的首选项(例如headerView或tableView标头)之前。 特性: Type :此属性指定首选项的类型。 例如TextField,Title,Toggle Switch,Slider等 标题 :此属性用于设置首选项的标题。 →这两个属性对于所有首选项都是通用的。 2.标题:标题类型显示一个只读字符串值。 您可以使用此类型显示只读首选项值(例如应用程序版本信息)。 特性: 默认值:此属性用于设置默认值。 例如应用程式版本 标识符:此唯一标识符用于保存和检索首选项值。 3. TextField:文本字段类型显示标题(可选)和可编辑的文本字段。 它用于接受用户的输入。 此类型的键是PSTextFieldSpecifier。 特性: 标识符:此唯一标识符用于保存和检索首选项值。 TextField是安全的:此属性用于输入安全文本,例如密码。 它具有两个值:1.是,2.否 KeyboardType:此属性用于设置键盘类型,例如URL,电子邮件地址,数字键盘等。 自动大写:此属性用于设置大写。 例如句子,单词,所有字符 4.拨动开关:拨动开关是一个ON / OFF类型的按钮。 在需要两个值之一的情况下,可以使用它来配置首选项。 特性: 默认值:用于将默认切换设置为ON或OFF。 它有两个值“是”和“否” OFF值:用于设置切换OFF值 […]

使用Swift进行iOS应用开发的5大好处

相当长一段时间以来,Objective-C是一种用于制作OSX和iOS应用程序的基本编程语言。 Objective-C本质上是C的超集,其中包含面向对象的元素和动态列表。 几年前,苹果公司推出了另一种编程方言Swift,它被描述为“没有C的Objective-C”。 它确实是一种快速,安全和现代的应用程序开发解决方案。 它包含各种元素,例如闭包,泛型和排序归纳,这使得它成为Objective-C的一部分变得非常容易。 它可以合并C和Objective-C的组件,而无需直接进行C兼容性及其附带的所有限制。 借助Cocoa Touch,Swift完全成为面向iOS产品的独家解决方案。 以下是在下一个移动业务中使用Swift而不是Objective-C的5个主要优点: 1.易读性:选择Swift的主要首选立场表面上是其一尘不染的语法的直接结果,这使得阅读和编辑变得相当容易。 在Swift上执行选择的代码行深度比Objective-C小得多。 快速解决方案还利用逗号分隔的机柜内部参数。 因此,代码具有更清晰的语言结构。 2.维护和支持:如果不先开发C,Objective-C前进是不现实的。 相反,Swift没有这些条件,这使得跟上来要容易得多。 3.更安全的平台:在这个不断发展的移动应用程序开发市场中,应建立一个安全的应用程序。 Swift的结构和方言开发避免了Objective-C中可能出现的几种错误。 这种稳定性意味着将减少崩溃和出现问题行为的情况。 这包括在改进过程中附加的价值控制层。 4.更少的代码和遗留问题:鉴于其用于控制​​内容字符串和信息的内联支持,Swift平台提供的代码不易出错。 5.速度: Swift在开发中还提供了多种速度优势,从而节省了金钱和精力。 例如,令人难以置信的对象排序比使用Python中类似计算的运行速度快3.9倍。 这是优于Objective-C的,后者比Python版本的速度快2.8倍。 它的执行方法被视为最快的算法计算算法。 SynapseIndia是一家领先的快速应用开发公司,在提供定制解决方案方面提供一流的服务。 他们相信最好,他们利用多年的专业知识和久经考验的方法来创造屡获殊荣的结果。

快速进行UI测试— iOSSnapshotTestCase

以前称为FBSnapshotTestCase和 目前由Uber维护, 此框架创建UIView的参考图像,并使用它们来测试同一视图的后续图像以检查它们是否相同。 uber / ios快照测试案例 ios-snapshot-test-case – iOS的快照视图单元测试 github.com 我发现了几个用例: 用代码编写UI 对我来说,这是一个很大的机会。 在我的团队中,我们已经不再使用xib和Storyboard,而是以编程方式创建所有UI。 一个明显的缺点是,直到运行应用程序,您才能看到UI的外观。 特别是在较大的应用程序中,这尤其麻烦,尤其是当您要查看的屏幕嵌套在导航堆栈的深处时。 通过使用iOSSnapshotTestCase,您可以通过运行测试并检查参考图像来检查视图。 UITesting 没有人喜欢编写测试。 那里有很多文章概述了烦恼 。 我发现使用iOSSnapshotTestCase创建测试相对简单。 在初始设置之后 ,通过子类化FBSnapshotTestCase而不是XCTest来创建测试。 然后将recordMode = true设置为允许在运行测试时生成参考图像。 最后创建一个实例化视图的测试,然后调用FBSnapshotVerifyView() 。 这是一个例子: 现在已经创建了参考图像,设置recordMode = false 。 现在,如果未对视图进行任何更改,则测试将通过! 使用FBSnapshotVerifyView() ,可以传递几个参数以提供更多控制。 如以下内容: FBSnapshotVerifyView(view, identitifer: “simpleView”, tolerance: 0.5) 在引擎盖下,它通过将视图渲染为两个CGContextRefs来比较视图。 然后,使用C函数memcmp()查看它们的内存,以确保它们相等。 自从遇到这个框架以来,我的工作流程已大大简化 。 我在大型应用程序上工作,并且能够在每次我要检查UI更改时不编译和运行该应用程序,从而节省了很多时间 。 这是一个简单但功能强大的工具,我建议人们尝试一下!

使用协议和MVVM的可重用视图布局

想法💡 之所以将其命名为“可重用视图布局..”而不是简单地命名为“可重用视图..”,是因为在这里我不是指视图的对象级可重用性。 相反,我将讨论如何在protocol和MVVM的帮助下重用视图布局。 在这个过程中,我将分享我们如何使用一个protocol概述一个视图的界面, 基本不同的配置状态 ,该protocol将使我们能够将不同的view-models注入到一个视图中。 换句话说,这里的想法是设计视图布局的数据不可知模型。 MVVM 在继续之前,让我们先简单了解一下MVVM 。 这是目前最令人困惑的设计模式之一,因此只需要确保我们在同一页面上即可。 这是一种设计模式,其中,我们使视图依赖于称为视图模型的中间模型对象。 这个视图模型获取一些数据(与网络或持久层无关),并应用一些装饰方法,这些方法最终被视图消耗。 例如,如果我们有一个配置文件视图类– ProfileView ,我们可以创建它的视图模型ProfileViewModel进行配置并保存其状态。 class ProfileView: UIView { var nameLabel: UILabel! func configure(with model: ProfileViewModel) { nameLabel.text = model.nameTitle } } struct ProfileViewModel { var nameTitle: String { return “Profile Title” } } 捆绑 我们可以看到,使用MVVM时, ProfileViewModel与ProfileViewModel结合在一起ProfileViewModel进行任何类型的配置。 如果您的视图在整个生命周期中仅具有一种视图模型,则此方法效果很好。 现在,我们要重用ProfileView类,该类应该能够显示Owner配置文件和Guest配置文件。 枚举 为了支持这一点,我们可以将ProfileViewModel转换成一个所有者和来宾情况不同的枚举。 enum ProfileViewModel { […]

玩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 […]

TestFlight公共Beta链接。

通过TestFlight,可以轻松邀请用户测试您的应用程序并收集有价值的反馈,然后再在App Store上发布您的应用程序。 仅使用他们的电子邮件地址或公共邀请链接,您最多可以邀请10,000名测试人员。 之前: 获取UUID,然后共享一个测试版 在iTunesConnect中将用户添加为测试者并共享邀请。 现在: TestFlight使它更简单,因此请使用它。 优点- 您可以使用单个网址将构建共享给任何iPhone用户 通过Beta版获得反馈。 随时禁用链接。 链接有效期为90天 。 登录到iTunes Connect 在以下URL的帮助下 https://itunesconnect.apple.com/login 2.转到MyApps部分 3.选择要与测试人员共享的应用程序。 4.现在转到TestFlight部分 5.现在您将看到所有测试人员,在那里您将找到2个选项。 !)测试仪 !!)建立 现在选择构建。 点击后,您将看到以下弹出窗口 只需选择构建并启用它即可。 添加构建以进行测试后。 现在,您只需要启用公共链接。 并随时随地共享该链接。 如果要禁用该链接,只需在同一位置将其禁用。 URL将变为无效,没有人可以利用URL下载该应用程序。 因此,用户将不再可以访问此链接。 就是这样。 请随时添加评论(如有)。 随时通过Twitter @ jitendradeore5与我联系

如何在React-Native应用程序中添加iOS Today扩展或小部件

我们或多或少都熟悉适用于iOS的精美应用程序扩展。 例如天气扩展,它以一种非常漂亮的方式为我们提供了天气更新。 当您想要快速浏览重要人物时,有时应用程序扩展或窗口小部件非常方便。 在本教程中,我们将介绍如何在React-Native应用程序中添加iOS Today应用程序扩展。 我们将通过本教程逐步实现以下目标: 创建基本的应用扩展程序或小部件(步骤1-11) 具有表格视图布局的小部件(步骤12–18) 一个小部件将通过区块链API获取比特币价格数据,并将定期获取更新。 此小工具将显示美元,INR和THB的比特币汇率。 (步骤19) 我们将创建一个新的应用程序只是为了从一开始就演示它,如果您有现有的应用程序,则可以按照方法的其余部分(从第4步开始)进行操作。 步骤1 :创建一个新应用“ HelloWorldApp ”。 打开终端>导航到您要保存新项目的文件夹,然后运行以下命令 react-native初始化HelloWorldApp 步骤2:创建项目后,在项目文件夹中导航。 cd HelloWorldApp 第3步 :通过运行命令安装所有基本依赖项- npm安装 步骤4 :进入“ ios ”文件夹,然后在xcode中打开 .xcodeproj文件(如果有,则打开 .xcworkspace文件),方法是双击该文件或使用命令“ open 。 xcworkspace> ” 步骤5 :在Xcode中打开项目后,单击左侧项目浏览器中的主项目文件,然后选择“ 常规”选项卡。 对于新项目,您可以设置Bundle Identifier值。 第6步 :从菜单中选择文件 > 新建 > 目标… 步骤7 :将显示目标窗口列表。 单击顶部的“ iOS ”选项卡,然后在“ 应用程序扩展 ”下选择“ 今日扩展 ”,然后单击下一步。 步骤8 […]

在Swift中从不内部工作

在Swift 3中添加的Never类型可以让您定义一个确保您的应用程序崩溃的方法。 尽管我们很少编写直接使用此类型的方法,但由于它是强制崩溃方法的返回类型(如fatalError() ,因此我们会不断与之交互。 这种类型带来的好处是,调用另一个Never -returning方法的方法不需要提供返回值,毕竟肯定会发生崩溃: func getSomeNumber()->整数 致命错误() //我没有返回Int,但是仍然可以编译 //因为fatalError()返回“从不”。 } 内心深处, Never只是@noreturn的经过改进的“ swifty”版本:该属性提供了完全相同的功能,但由于其性质太复杂而被删除。 将此行为连接到返回类型可以使编译器更好地工作,并且当然也可以最终为开发人员带来更好的外观。 不过,关于Never一些事情吸引了我。 我们知道语言本身没有什么可以让您跳过返回值,那么在编译器中做了什么神奇的事情呢? 就像我以前关于CaseIterable的内在特性的文章一样,我将深入研究编译器,以提取和分析可拦截并更改返回Never的方法功能的代码段,以详细了解如何Swift编译器有效。 免责声明:与往常一样,这是我自己的研究和反向工程的结果。 由于我显然与 Never 的原始开发无关 ,因此某些假设可能并不完全正确。 如果您知道编译器的工作原理,请随时纠正我! (如果您发现在Medium上难以阅读的代码,请单击此处在我的博客上阅读本文!) 期望找到复杂的代码,标准库中Never的实现向我们展示了其他东西-类型不过是一个空的枚举: 公共枚举从来没有{} 尽管这看上去确实很奇怪,但从理论上讲是正确的。 当Never实现时,Swift还在其术语中增加了无人居住类型的概念-一种没有价值的类型,通常用于表示永远不会发生的事情的不存在的结果。 由于无法以任何方式实例化没有大小写的枚举,因此可以完美地表示该概念。 但是,如果类型本身不执行任何操作,那么魔术在哪里完成呢? 在Swift回购中快速搜索”never typecheck”发现一个名为isNoReturnFunction()的方法,该方法搜索是否存在无人类型的返回: bool SILFunctionType :: isNoReturnFunction()const { for(无符号i = 0,e = getNumResults(); i <e; ++ i){ 如果(getResults()[i] .getType()-> isUninhabited()) 返回true; } 返回false; } […]

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 […]