Tag: swift

Organizando环境没有Xcode

Quantas否视URL的apontando para diversos环境差异,trocandoconfiguraçéescomo Mixpanel,New Relic entre支出? Muitas凝视着,nãoémesmo吗? 用户定义的设置,简单的Podemos简化处理,tornando-o indolor,por meio? Nesse artigo vamos ver comar criar e acessar essasconfigurações,para que nosso应用程序可用于构建独立于目标estamos buildando的方案。 在配置文件中显示新的配置文件。 参照信息的配置。 发行公告,然后发布或调试: 在应用商店中购买,销售和销售的应用程序均已发布。 Neste caso,vamos criar mais duas配置:uma duplicando de版本e外部调试: Agora que definimos quaisserãoos Environmentales do nosso应用程序。 Podemos,então和déodesejada用户定义的设置。 参数菜单:Build Settings(设置设置)参数: Adicionando esse novo设置,将URL作为环境的URL。 Assim,vamos nomear nosso设置como BASE_URL: Podemos观测所使用的配置文件可以在成功的情况下使用,并且可以在环境中使用固定的顺序。 Nesses campos,vamos addicionar作为URL的desejadas e […]

探索NSTextField

最近,我正在一个简单的待办事项列表应用程序中玩NSTextField。 我想在每个待办事项中包含一个可编辑的文本字符串。 我写这篇文章是为了谈论我一直在申请的东西。 建立项目 这是一个待办事项列表,我将使用NSCollectionView构建基本的UI。 该布局是一个简单的基于行的垂直布局。 我可以使用NSCollectionViewFlowLayout轻松实现这一点。 显示待办事项 由于我要显示的待办事项内容非常简单,因此我选择一个NSTextField作为容器。 我还将默认textField变量链接到放置在该项目中的NSTextField组件。 现在,我可以通过设置“ textField?.stringValue ”轻松显示待办事项。 NSTextFieldDelegate中的回调 该协议实际上是NSControlTextEditingDelegate的扩展,其中提供了一些基于NSControl的委托方法,这些方法仅适用于文本编辑功能。 默认协议方法提供了在编辑文本内容之前和之后的挂钩。 通过编辑,这意味着在更改内容时在键盘上键入。 实际上,我想在单击该项目时收到通知。 然后,我可以修改内容,然后按“ Return ”以保存更改。 子类化NSTextField 为了通过单击该项目获得通知,我将在NSTextField中重写成为firstFirstResponder() 。 我还创建了相应的委托方法,以便可以在单击项目的基础上进行更改,例如显示插入符号或将应用程序更改为编辑模式等。 拦截返回键 这是通过实现有关命令选择器的委托方法来完成的。 每个键盘命令键都会生成此方法的回调。 通过比较当前的命令选择器,当按下“ Return ”键时,我会收到通知,命令选择器为“ insertNewline(_ 🙂 ”。 然后,我可以保存待办事项,然后更改回查看模式,等等。 摘要 NSTextField的工作逻辑与iOS的UITextField完全不同。 NSTextField委托的文档非常含糊。 在实现您的欲望逻辑之前,应该更谨慎一些,并回避这些回调。

编译Swift源

当您在专业领域有一定经验时,您希望与世界各地分享。 有人写文章,有人帮助另一个开发人员。 但是有人为开源项目做出了贡献。 几年前,Apple开源了Swift编程语言,因此任何人都可以获取源代码,对其进行构建,对其进行修改等。 在本文中,我将向您展示如何从源代码构建Swift,向您介绍一些陷阱,并向您展示可以在Swift中搜索错误的位置。 因此,让我们开始吧! 从源代码构建Swift 构建Swift很容易! 首先,您需要安装cmake和ninja 。 您可以通过从Homebrew或MacPorts安装它来做到这一点: brew install cmake ninja // via Homebrew sudo port install cmake ninja // via MacPorts 然后从git创建用于克隆源的文件夹并导航到该文件夹​​,例如: mkdir swift-source cd swift-source 将这个Swift仓库克隆到您的文件夹后: git clone https://github.com/apple/swift.git 接着: ./swift/utils/update-checkout –clone 至此,您的计算机上已经有了源。 然后,您需要构建它。 首先,您需要在计算机上安装Xcode 9 Beta 6(还必须为Xcode Beta 6安装命令行工具)。 如果您的计算机上安装了多个Xcode版本,则必须选择要使用的版本: 须藤xcode选择-switch /Applications/Xcode-beta.app 然后,您可以构建Swift: ./swift/utils/build-script -x 请注意,构建Swift需要大量时间。 对于我来说,在Macbook Pro […]

为iOS Release Train构建增量技术

XCBlog上的原始帖子在 这里 持续交付iOS应用对于保持在竞争市场中的重要性至关重要。 拥有基础架构以在向客户发布功能后立即向客户发布功能的公司赢得了公司之间的竞争,他们必须从本地Xcode的人那里进行手动发布。 在“持续交付”模式下,我们应该不断将iOS内部版本上载到iTunes Connect或TestFlight,以获取发布中涉及的所有技术人员和非技术人员的反馈。 只要我们具有适当的构建和版本控制过程,将构建上传到iTunes Connects不会有任何危害。 在这篇文章中,我们将看到在持续交付管道中自动递增内部版本号的最佳技术。 在进入iOS应用程序的自动内部版本号之前,我们将了解将iOS应用程序提交到App Store时版本号,内部版本号和发行火车的工作方式。 Apple拥有有关每个iOS开发人员都应了解的版本号和内部版本号的出色文档。 版本号和内部版本号的组合唯一标识一个应用程序向应用程序商店提交的内容。 版本号 iOS应用的版本号与以前的版本不同。 我们需要为新的应用发布创建单独的版本号。 它类似于使用语义版本控制在Github上创建发行版。 合法版本号将是1.0,1.1.1等,但是您不能将字母和数字(如abc.123)组合在一起,这将是非法版本号。 版本号无法重复使用,因此您必须预先确定主要版本和次要版本。 新版本号值必须大于以前使用的值,并且随后应递增。 当前版本号的值可以通过CFBundleShortVersionString键在iOS应用程序的Info.plist文件中找到,或者如果是上载的iOS应用程序,我们可以在iTunes Connect中进行检查以找到版本号。 我们可以使用Apple的agvtool命令行工具检查当前版本号 $ xcrun agvtool what-marketing-version 内部编号 可以为特定的版本号上载多个版本,但是,为特定的版本号上载的版本号应该是唯一的,并且应该是递增的。 内部版本号的值可以重新用于其他版本号。 使用CFBundleVersion键可在iOS应用程序的Info.plist文件中找到当前内部版本号的值。 我们可以使用Apple的agvtool命令行工具检查当前版本号 $ xcrun agvtool what-version 发布火车 针对特定版本的特定版本表单的发布版本提交的构建数量。 在发行版中,内部版本号按递增顺序排列且唯一。 该火车可以使用特定功能进行多个构建,并且如果需要,我们可以将任何构建升级到App Store。 简而言之,发布火车是持续交付的基础。 在发行系列中,很少有用于增加内部版本号的策略。 我们将看到它们中的每一个,并讨论哪一个最适合发布火车。 1. agvtool 苹果有本机命令行工具来处理版本和内部版本号。 我们可以启用agvtool并编写脚本来自动增加特定发行版中的内部版本号。 为了启用agvtool,我们需要确保在目标构建设置中正确设置了“ 当前项目版本”和“ 版本控制系统”属性。 选择目标构建设置,然后搜索“版本”。 现在,将“ 当前项目版本”设置为1,并将“ 版本控制系统”值选择为“ […]

Swift 4中的Web视图

您是iOS开发(Swift)的新手吗? 您要实现Web View吗? 如果您的回答是“是”,那么本教程适合您。 所以开始做这个。 注意:UIWebView已从XCode 9开始弃用,因此,如果您还支持iOS 10或更低版本,则适合您。 如果您的应用仅支持iOS 11+设备,请不要使用WKWebView而不是UIWebView 。 您可以使用SFSafariViewController轻松获得相同的结果。 阅读如何使用SFSafariViewController 点击这里。 步骤1: 创建一个快速项目。 第2步: 在视图控制器中添加一个UIwebView 。 添加一个UIActivityIndi​​catorView。 或您的自定义加载程序。 并为UIwebView , UIActivityIndi​​catorView (或自定义加载程序)设置自动布局。 第三步: 将您的所有连接与View controller连接。 1. WebView连接 2.装载程序连接。 连接后,View Controller将如下所示。 见下文。 👇 步骤4: 现在,我们将继续进行编码部分。 1.导入WebKit。 2.导入类中的Delegate(UIWebViewDelegate) 3.添加代理。 (webView.delegate =自我) 所以你的班级看起来像这样 步骤5: 现在这一点很重要,因为您需要首先了解UIwebView有多少个委托方法。 UIWebViewDelegate有4种方法 ,但是只用三种方法 复制这3种方法并粘贴到您的View Controller中。 👇 步骤6: 现在是时候在视图控制器中添加代码和逻辑了。 因此,让我们继续前进。 见下文👇 现在在 […]

iOS本地化Swift

Вотивсе,можетенаписатьдляпроверкивоviewDidLoad 打印(“ title” .localized) Иполучить Теперьлокализуемназваниеприложениянаустройстве СновасоздаемString File, называемегоInfoPlist 本地化…本地化: Должнополучитсятак Заполняеманглийскуюверсию “ CFBundleDisplayName” =“测试”; Вауля! PS: Мойканалпосвифтовымзаметкамвтелеграме@SwiftBox

iOS快速提示:切换多个BEMCheckBox项

嘿! 我想分享我在玩BEMCheckBox时学到的东西。 https://github.com/Boris-Em/BEMCheckBox 我们将以“ 风味”部分为例。 假设我只能选择一种口味。 我将必须将所选调味料的属性设置为true ,而其余​​复选框的属性设置为false 。 1.为复选框创建出口。 @IBOutlet弱var vanillaFlavourCheckbox:BEMCheckBox! @IBOutlet弱var ChocolateFlavourCheckbox:BEMCheckBox @IBOutlet弱var StrawberryFlavourCheckbox:BEMCheckBox! 2.将复选框存储在数组中。 var flavourCheckBoxes:[BEMCheckBox]? 覆盖func viewDidLoad(){ super.viewDidLoad() flavourCheckBoxes = [vanillaFlavourCheckbox,chocolateflavorCheckbox,strawberryFlavourCheckbox] } 3.将标签添加到每个复选框。 0、1、2。 标签是我们将用来识别已选中哪个复选框的标签。 4.制作您的 ViewController 符合 BEMCheckBoxDelegate ,并添加 didTap 函数。 ViewController类:UIViewController,BEMCheckBoxDelegate { … func didTap(_ checkBox:BEMCheckBox){ //在这里做事 } … } 我们将使用模式匹配和where关键字。 让我们先编写代码,我会解释! 5.填写 didTap 。 func didTap(_ checkBox:BEMCheckBox){ // […]

通过委托和协议在ViewController之间传递数据

我们都知道如何通过prepareForSegue方法在ViewController之间传递数据。 它有其自身的局限性和优势。 好消息是,这不是在ViewController之间传递数据的唯一方法。 在ViewController之间传递数据的最流行和最常用的方法之一是通过Delegate和Protocols。 在开始本教程之前,如果尚未开始,请阅读我关于协议的文章。 如果您了解协议,那么本文将更有意义。 与其说太多,不如让我们看一个例子,看看它是如何完成的。 让我们创建一个名为“间谍和基础”的单页应用程序。 现在删除默认的ViewController.Swift,然后再创建两个名为“ HomeBaseVC”和“ EnemyBaseVC”的ViewController。 创建ViewController之后,它应该如下所示。 现在是在StoryBoard中进行一些更改的时候了。 让我们打开情节提要,并将现有ViewController的类名称更改为“ HomeBaseVC”。 现在是时候向故事板添加另一个Viewcontroller并将其与ViewController类“ EnemyBaseVC”相关联了 现在是时候通过segue连接两个VC了。 我们将在“ HomeBaseVC”中添加一个名为“将我们的间谍发送到敌人的基地”的UIButton。 点击此按钮后,我们将进入“ EnemyBaseVC”。 (我将保留“自动布局”约束部分,因为它不是本教程的一部分) 我们将EnemyBaseVC显示为Modal(又名弹出窗口)。 还要确保segue标识符为“ sendSpySegue”。 查看下面的gif图片,了解如何完成此操作。 凉! 现在我们可以从我们的基地向间谍基地发送间谍了。 假设我们的间谍渗透了敌人的基地。 因此,现在该给他一个UIButton了,该按钮将使他能够入侵敌方通信系统并将数据传递回Home Base。 所以我要在“ EnemyBaseVC”中添加一个UIButton作为“ HACK AND SEND MESSAGE HOME” 因此,情节提要板应类似于以下内容。 在离开情节提要之前,让我们连接“ HACK AND SEND MESSAGE HOME”按钮,并创建一个IBAction。 是时候用数据设置“ EnemyBaseVC”了。 我将如下更新VC。 我希望这是自我解释。 另外请注意,我已经从VC中删除了所有样板代码,以提高可读性。 凉! 可以吗? 很棒,让我们做一些最后的调整。 发送消息时,首先关闭EnemyBaseVC。

[iOS]带Firebase教程的远程通知

我将向您展示如何使用Firebase在iOS中设置远程通知。 对于iOS而言,这不是新话题,而且API或新库总是有新变化。 如果您是初级开发人员,本教程可能会对您有所帮助。 如果您是高级学生,那么回顾一下也很不错。 我们走吧。 Environment: iOS 10 & 9, Swift 3.1, Xcode 8.3.3 安装Firebase 我希望使用CocoaPods安装Firebase PodFile: 源’https://github.com/CocoaPods/Specs.git’use_frameworks!platform:ios,’9.3’def base_pods pod“ Firebase / Core” pod“ Firebase /消息传递” pod“ Firebase / Crash” 最终目标“ RemoteNotificationDemo”做 base_pods 结束 pod install并运行您的Xcode工作区 准备证书 要为您的iOS应用启用推送通知: 在目标->常规中设置您的团队,资料和证书 或简单地使用Xcode 自动管理签名 调整目标中的推送通知 ->功能 您应该看到两个刻度: ps有时Xcode可能无法管理您的应用程序。 然后,您需要转到Apple Developer Console(https://developer.apple.com/)来打开应用程序的“推送通知”: 在密钥中创建APNs身份验证密钥 建议使用身份验证密钥进行配置,因为它们是将通知发送到iOS的最新方法。 验证码的优点: 无需每年重新生成推送证书 一个身份验证密钥可用于您的所有应用 但是您仍然可以使用旧方法:创建开发和生产SSL证书 ps。 […]

序列化自定义词典

更新:新的Swift 4过度简化了此过程, 请查看如何 通过Swift 字典和NSDictionary编码之间的自动桥接,更常见的String到Object字典非常简单。 但是,当我们想使用任意对象作为键时,情况会发生变化。 常规词典仅对键类型强制实施可哈希和等价协议。 如果我们要构建持久性类,则可以从NSObject继承这些属性。 另外,我们需要实现NSCoding进行序列化。 类项目:NSObject,NSCoding {…}各种数量:[Item:Int] 使用NSKeyedArchiver保存该对象的方式应为: 让_ = NSKeyedArchiver.archiveRootObject(self,toFile:file) 但是,当尝试还原实例时,会发生一个模糊的错误: 让restore = NSKeyedUnarchiver.unarchiveObject(withFile:file) //例外:[MyClassName copyWithZone:]无法识别的选择器发送到实例 事实证明,由于某种原因,NSDictionary还要求密钥类型符合NSCopying。 一个简单的实现可以解决: 类项目:NSObject,NSCoding,NSCopying { func copy(with zone:NSZone?= nil)->任何{ 返回项目(名称:名称,库存:库存) } … 这是一个完整的工作示例: