Tag: xcode

Swift,Xcode和iOS我的冒险

书签忍者是一个Web应用程序,可在台式机和移动设备的浏览器中运行。 在移动设备上,它具有看起来像本地移动应用程序的移动专用Web UI。 在桌面浏览器中,它使用书签和浏览器扩展,可以将当前网页链接发送到Ninja。 当前,在移动设备上,您只能通过通过电子邮件将链接发送到专用电子邮件地址(点击共享然后选择电子邮件)来执行此操作。 但是,使用此解决方案,您将无法添加标签或设置目标选项卡/类别,而无法在书签和扩展名的帮助下在桌面浏览器中进行操作。 因此,现在该为移动浏览器找到更好的解决方案了。 最终的解决方案是本机移动应用程序,它实际上是移动浏览器的共享扩展应用程序。 计划A 最初的计划是开发一个完整的本机iOS应用程序,该应用程序通过RESTful API与Ninja服务器通信。 3年前,当我学习Java类时,我了解了REST,但是我从未使用过REST,因此经验为零。 此外,引入REST也会影响服务器端,而不仅是客户端iOS应用程序,因此还有更多工作要做。 另一个挑战是Swift。 5年前,我开始在Objective C中开发iOS游戏。我从事该游戏的时间为一年。 然后我放弃了,我没有完成项目。 我还记得我不是Objective C和Xcode的忠实拥护者。 我读到Swift比Objective C有很多改进,所以我非常期待熟悉Swift。 计划B 当我开始担心该项目所需的工作量时,尤其是考虑到REST和Swift的不确定性时,计划B就出现了。 我的想法是通过在iOS应用中拥有Webview来简化事情。 实际上,在Web视图中,就像在浏览器中一样,您通过https访问Ninja服务器,并且UI看起来像本机移动应用程序(使用PrimeFaces mobile / jQuery mobile)。 使用此解决方案,我可以赢得以下成就: 完全不需要REST,因为我通过https访问Web视图中的服务器 只需编写更少的Swift代码(所有“添加书签”功能都已包含在已经用Java开发的webview中) 用户身份验证也可以在webview中完成(已经使用Java开发) 我认为这是一个很棒的主意,因此我决定采用计划B。以这种方式实施iOS共享扩展只用了几天。 我可以为计划B节省很多时间,所以我认为这是一个不错的决定。 仍然不是Swift和Xcode的忠实拥护者 尽管实际上只花了几天时间就编写了共享扩展名,但是Swift和Xcode还是令人失望。 在使用Xcode在Swift中进行Java和Eclipse编程之后,感觉就像倒骑了。 我无法更好地解释我的感受,但我认为有些人可能知道我的意思。 我只想谈谈我的一些经历: 我觉得API支持并不是真的对开发人员友好。 创建项目时,我必须选择共享扩展目标。 例如,这是关于在浏览器中共享网页。 因此,我认为获取标题和URL有点是something.getUrl()和something.getTitle()。 不,不是这样。 您必须编写15(!)行代码才能获得url和标题。 而且我没有在苹果官方开发文档中找到这15行代码,而是在不同的论坛和Stackoverflow上找到了这15行代码。 向后兼容性…当我在网上搜索某些东西时,发现的大多数Swift代码都在Swift 1或2中。当我尝试使用这些功能时,结果发现它们中的大多数已被折旧,删除或重命名。 3.因此,每年都有新版本的iOS发布时,我必须更新代码,重新生成并重新提交应用程序吗? 我无法调试…断点不起作用,“打印”没有打印到控制台。 我在网上搜索了此问题,并找到了很多有关此主题的讨论。 我尝试了所有建议的方法,但没有帮助。 最后,在代码中添加了iOS“ tweet”音效,以检查代码的这一部分是否运行。 […]

XCode显示调试导航器

Yenifarkettiğimbuözelliksayesindeuygulamanızçalışırkenekstraözelliklerinigörselleştiripdurumunu monitor edebiliyorsunuz。 CPU Durumu 恩吉(Enerji Etkisi) 磁碟 网络 Bunun haricinde cihaza 4图片açısıile bakabiliyorsunuz Sizin UIbileşenlerinisoldaki gibigörselleştirerekhiyerarşisini运行时görmenizisağlatıyor。 Bellek adreshiyerarşisigörmenizisağlıyor。

配置MacOS进行iOS开发

您需要什么来开始在全新Mac上首次开发iOS应用程序? 在这篇简短的文章中,我将尝试描述我所做的事情,以确保不必因某些配置丢失而中断我的开发原因。 Xcode 当然,我们不能忘记Xcode。 某些人可能更喜欢使用JetBrains的AppCode,但是迟早要使用Apple的IDE及其随附的工具。 您可以从AppStore中获取它,但是根据您所开发的内容(或应用程序的发布距离),您可能希望从此处下载Xcode的较早版本-您不需要付费的开发人员帐户😉。 当您的应用程序处于稳定阶段时,通常需要较早版本的Xcode,此时切换到最新版本的Xcode可能会导致某些问题,因此最好坚持使用已经测试过的应用程序版本(除非您编写了不错的测试那么您可以更轻松地切换到新的Xcode)。 Visual Studio程式码 我最喜欢的编辑应用程序是我不使用Xcode进行编辑的任何应用程序,例如格式化JSON / XML,编写bash脚本等。我也将其用于Flutter开发-为此,您只需要Flutter的“入门”中提到的F​​lutter插件即可。指南。 源树 对于git相关的东西,我通常使用命令行工具或SourceTree。 真的不能再多说了,您要么喜欢,要么不喜欢。 家酿 它是一个程序包管理器,很可能需要在某个时候安装一些程序包/应用程序。 不过,您可以在开始iOS开发的过程中跳过此步骤。 邦德勒 什么是捆扎机? Bundler通过跟踪和安装所需的确切gem和版本,为Ruby项目提供了一致的环境。 对于使用CI / CD(连续集成/交付系统)的项目而言,这是非常重要的,因为所有(宝石)依赖项都将同步,并且您可以确保,如果您的构建在您的计算机上可以运行,则(应该)在其他计算机上也可以运行。机器也是如此。 同样,当一个新手加入项目时,只需用一个简单的命令下载所有项目(宝石)依赖项,而不是“一个接一个”地安装所有……而不是忘记正确的版本,会更容易。 我强烈建议安装和使用它 。 虽然,一旦尝试使用gem install bundler命令安装它,它可能会因权限错误而失败。 如果您用google搜索,将有一些有关如何解决该问题的建议(例如简单地使用sudo,但我们真的要这样做吗?)。 我更喜欢另一种方式,修改您的.bash_profile文件并添加以下行: 关于如何解决该问题的方法(就像简单地使用sudo一样,但是我们真的要这样做吗?)。 我更喜欢另一种方式,修改您的.bash_profile文件并添加以下行: export GEM_HOME=”$HOME/.gem” export PATH=”$GEM_HOME/bin:$PATH” 并且权限问题应该消失了。 它只是修改了gem的home路径,并将其设置到HOME文件夹中的一个文件夹中,因此您对此具有权限,并且不会与其他mac的用户覆盖gems。 可可豆 可能是iOS / MacOS开发中最受欢迎的依赖项(pod)管理器。 豆荚的基础非常广泛,这使得它真的很容易使用。 唯一的缺点是它的发布周期很慢,并且可能并不总是与Xcode的最新更改保持同步。 无论如何,通常开放源代码项目都使用它(以及很多商业广告也很有可能),因此您迟早会需要它。 快车道 如果您在一个项目中以更大的团队工作和/或使用CI / CD,则对同步应用程序测试及其发布过程将大有帮助。 尽管最近苹果公司开放了他们的App Store Connect API,所以很快就会出现一些更简单的应用程序/脚本来完成这项工作。 […]

整理您的Swift班

我一直使用Xcode注释来组织代码并提高其可读性。 最后,我得到了几乎在每个类中都使用的模式,这使我可以更高效地工作。 可读性 我努力在所有班级中建立一个良好的组织,它可以帮助我快速找到想要的内容。 无论选择哪种模式,重要的是始终在项目中重复使用同一组织 。 然后,您可以打开任何文件,直接进入感兴趣的部分,因为您知道文件的位置。 图案 看完有关高级集合视图的WWDC 2015示例代码后,我为类添加了注释模式(即使我知道,没有人喜欢Apple示例代码)。 此模式对于视图控制器和视图最为有效,这是常规iOS项目中最常见的类。 但是您仍然可以在其他类中重用它的一部分。 类型 :包含枚举, 属性 :所有属性(IBOutlet,let,var等), 查看生命周期 :所有viewDid…方法, 生命周期 :init和deinit方法, Layout :layoutSubviews…方法, 设置 :查看和数据初始化, 动作 :用户执行的动作(IBAction,UIGestureRecognizer等), UIStoryboardSegue处理 :prepareForSegue…方法, 通知 :通知方法, 便利性 :界面更新,所有便利性方法(例如cellForType), UI…Delegate :所有委托方法。 然后在每个注释中,按照Bob叔叔在他的书Clean Code中的建议,按调用顺序编写方法。 Swift扩展 Swift带来了使用Swift扩展将代码组织成较小的砖块的可能性。 我完全同意将这种方法用于协议一致性: class ViewController: UIViewController { // MARK: – Setup // Put all the setup methods here // […]

Swiftコンパイラの警告を无视できないようにする

Swift / iOS界隈では可选(2018年) そしてmonoさんがツーイートされたSWIFT_TREAT_WARNING_AS_ERRORS = YESは, SWIFT_TREAT_WARNING_AS_ERRORS = YESではなくエラー(🚨)にして无视できないようにします。 Xcode发行说明 描述Xcode中的新功能和已知问题。 developer.apple.com 添加了两个新的构建设置以启用Swift编译器选项: -禁止警告(SWIFT_SUPPRESS_WARNINGS) 错误警告(SWIFT_TREAT_WARNINGS_AS_ERRORS) 这些设置与相应的clang选项的构建设置无关。 (24213154) SWIFT_TREAT_WARNING_AS_ERRORSで検索すると见つけやすいです。 こうすると,これまでは警告で无视できたものがエラーになって无视できず,コードを修正しない限りリリースできなくなります。 可选(2018)年あけましておめでとうございます| 工程师博客 エ早々,大変お騒がせしております。申し訳ありませんの一点に尽きます。はてブや,Twitterなどで大きく话题にしていただいたので,この机会に,耻は承知の上で,なぜこんなことが起きてしまったのか,笔をと… moneyforward.com 非常に大きなサイズのPRであったことや,破壊的変更が行われたSwift 3への対応だったこと,そもそも古くから运用されているプロダクトであるがゆえの大量の警告を全て溃しきれておらず,そのまま埋もれてしまったとしか言いようがなく,とても耻ずかしい限りです。 たしかに理想は「リリース前に対处しておくべき」ですが,开発现场ではこのようにさまざまな事情があるでしょう。 転职がさかんな企业家ですのでどういう経纬で警告を无视してきたのか谁もわからない现场もありそうです。 ここで绍介したSWIFT_TREAT_WARNING_AS_ERRORS = YESにすることはあくまで対策のひとつです。 ,警告はすべて确认して解消していくべきですね。

ReactiveKit和Bond Part 1.1

Swift中的Target-Action模式 在我的上一篇文章中,我承诺要深入了解如何在反应式框架中制作香肠,以便更好地了解ReactiveKit和Bond中的情况。 这将是一个多步骤的过程,第一步是了解目标动作模式以及如何在Swift中实现它。 我将大量借鉴Ole Begemann在该主题上的文章。 如果您从未检查过他与克里斯·艾德霍夫(Chris Eidhof)所写的书,那我就百分之十推荐。 这是关于Swift的怪异/酷事:您可以创建对方法的引用,然后使用该方法所属的类的实例调用该方法。 在这里,马克·华伯格让我告诉你我的意思。 Ole使用“银行帐户”类进行解释,但这很无聊。 我们将使用蝙蝠侠类: 蝙蝠侠班:{ var罪犯Biffed:Int = 0 func biffCriminals(amount:Int){ 罪犯+ =金额 } } 让bruceWayne = Batman() bruceWayne.biffCriminals(金额:2) 打印(bruceWayne.criminalsBiffed) //打印“ 2” 好。 超级容易。 现在是棘手的部分。 让我们创建对罪犯的引用Biffed(amount:Int) 让biffer = Batman.biffCriminals “ biffer”不是对方法的调用。 这是一个常量,它引用方法Batman.biffCriminals。 Biffer的类型为(蝙蝠侠)->(内部)->()。 然后,我们可以创建一个新引用,该引用将Batman的实例作为参数: let wayneBiffer = biffer(布鲁斯·韦恩) 然后,我们可以使用参数调用新方法: wayneBiffer(数量:10) 打印(bruceWayne.biffedCriminals) //现在打印出“ 12” 可以缩短为一行: biffer(布鲁斯·韦恩)(10) 这就是所谓的咖喱函数。 在最终方法被调用之前,部分应用了函数并设置了一些参数。 当我们使用一个函数时,我们将返回另一个部分实现的函数。 真正有用的地方在于以一种类型安全的方式实现Target-Action模式。 […]

修复iOS中的“线程1:信号SIGABRT”错误

SIGABRT(信号中止)表示由于无法访问零或不存在的东西而导致应用程序崩溃,根据我的经验,通常是Outlets。 在情节提要中,检查每个视图控制器中的所有Outlet。 2.确保删除带有黄色警告的连接。 这些是无效的出口。 3.如果名称正确,请在身份检查器中检查您的情节提要ID。 4.检查代码左侧是否有断点。 希望这对某人有帮助! 请参阅我在Stackoverflow中的答案。

目标C中的局部和全局类型变量

可以在声明它们的方法内访问局部变量,但不能在此方法之外使用它们。 让我们通过示例来了解它。 让我们创建一个将两个数字相加的方法,如下所示。 -(void)AddTwoNumbers:(int)a SecondNumber:(int)b { int结果= a + b; NSLog(@“输出=%d”,结果); //输出:output = 30 } 在这里,变量a和b都是方法参数。 结果是在AddTwoNumbers方法中声明的局部变量。 由于在方法中声明了它,因此您只能在此方法中使用它。 例如,我们使用变量c打印其值。 如果您尝试将结果打印到另一种方法中,则Xcode将不允许这样做,而是会给您错误。 请检查以下屏幕截图以了解局部变量。 这是局部变量的正确使用 这是对局部变量结果的错误使用 可以在整个类文件中的任何位置访问全局变量 。 它们在头(.h)文件中声明。 在上面的示例中,如果要访问viewDidLoad方法中的结果,则将结果声明为ViewController.h文件中的全局变量,如下所示。 ViewController.m文件将如下所示。 希望您了解局部和全局变量及其用法和范围。 谢谢您阅读🙂 请查看我的YouTube频道以获取视频教程并订阅,并与您的朋友分享。 youtube频道链接: https : //www.youtube.com/channel/UCWjT8XgKescscxlPbMSVzbQ

Xcode 9自定义模板

作为开发人员,我们不断努力改善我们的开发流程。 无论是与编写代码,自动化某些事情有关,还是只是保持更高的生产力和专注力。 在这里,我们将讨论如何使用Xcode自定义模板来改进文件的创建。 我们中的许多人可能没有听说过它,因为Apple并未推广此功能,并且关于此主题的文档也很少。 但是无论如何,这样的功能仍然存在,并且可以使用一些预填充的样板代码极大地改善文件或整个模块的创建。 作为示例,我们将设置UIView模板,该模板还将创建一个相应的.xib文件,默认情况下Xcode无法创建该文件。 位置 这些用户定义的模板位于~/Library/Developer/Xcode/Templates/File Template 。 如果缺少此文件夹,则可以自己创建它,并且Xcode将在重新打开时链接到该文件夹​​。 您也可以将它们分组到该文件夹​​内的子文件夹中。 例如, ~/Library/Developer/Xcode/Templates/File Template/Custom Templates和Xcode在创建新文件时将正确地渲染这些组。 模板设置 每个模板都是一个扩展名为.xctemplate的文件夹。 该文件夹包含文件模板和资源,这些文件模板和资源将被填充并添加到项目和配置TemplateInfo.plist 。 用户可以在模板创建期间填写的所有模板设置和字段都在TemplateInfo.plist中定义。 在此plist文件中,您可以定义将用于模板选择对话框的图标。 模板的Kind可以有两个值,但大多数情况下是Xcode.IDEKit.TextSubstitutionFileTemplateKind ,另一个是Xcode.IDECoreDataModeler.ManagedObjectTemplateKind ,我们在这里不介绍它的用法。 下一项是Options数组,它可以包含各种输入字段,选择器,复选框等。每个字段都是不言自明的,只需注意Identifier字段用于用户提供的变量,这些变量可以在源代码模板中替换。 Type定义输入字段的类型。 可以是text , static , checkbox , combo , popup 。 让我们将TemplateInfo.plist文件放入用户定义模板下的UIView.xctemplate文件夹中。 文件结构应如下所示: └──文件\模板 │└──UIView.xctemplate │├──TemplateInfo.plist 重新启动Xcode之后,您应该看到模板如下所示: 并且在选择模板菜单后应如下所示: 现在,让我们看一下文件模板。 基本上,它们是具有预定义关键字的常规文件,这些关键字将在创建过程中被用户提供的值替换。 主要关键字是: ___FILEBASENAME___ —当前文件的名称,不带任何扩展名。 ___FILEHEADER___ —每个源文件的IDE预定义注释头。 ___VARIABLE_variable_name___ —用户在模板创建期间输入的自定义变量,以后可以在模板文件中使用,例如,我们有Subclass of:输入字段,用于为UIView定义继承。 让我们创建一个名为___FILEBASENAME___.swift文件,并使它看起来像这样: […]

在Swift中创建不可变的委托

最初发布于 swiftrocks.com 。 为了防止诸如委托之类的属性发生引用循环,通常使用weak关键字: weak var delegate: HomeViewDelegate? 不幸的是,由于它可以保护您避免丢失引用,因此weak关键字会强制使用var和可选类型,如果您要构建的UIView类的东西在没有委托的情况下不能使用,那么这可能会非常麻烦。突然减少变更代表: class HomeView: UIView { weak var delegate: HomeViewDelegate? func renderView() { guard let delegate = delegate else { //Timmy: this should never happen! return } let category = delegate.currentlySelectedCategory() categoryView.render(category: category) delegate.homeViewDidUpdate() } } 但是, weak不是打破参考周期的唯一方法。 就像在捕获列表中一样,关键字unowned可以在属性中使用以创建非强引用: unowned let delegate: HomeViewModelDelegate 与weak引用不同, unowned引用应始终具有价值。 这样,您不仅可以在声明非可选类型时使用它们,而且还可以通过let来使用它们,从而恢复不变性并确保您的对象不会以意外的方式起作用: class HomeView: […]