在Interface Builder中将UITableViewController转换为UIviewCntroller

当我需要在表视图之外添加视图时,通常必须将Interface Builder中的UITableViewController更改为UIViewController 。 那么,我们如何实现这一目标? 🤔 将UIViewController从Objects库拖到 IB并从UITableViewController获取表视图并设置合适的约束,不要忘记从IB中删除UITableViewController 打开您的情节提要作为源代码,并搜索有关tableview控制器的信息, 您将发现如下所示 : 因此,将<tableViewController更改为<viewController ,并将结束符 更改为 。 所以会像这样 作为Interface Builder打开情节提要,它将如下所示 但是我们需要将表视图嵌入容器视图🤔中,因此我们需要再次打开情节提要作为源代码并对其进行修改,因此添加视图标记以包含tablview: 我们希望已完成🤗,但是当您打开情节提要并需要在表视图中添加约束时,会得到此🤦‍♂️ 因此,要使约束可用,您需要从标签下面的标签中删除<autoresizingMask key =” autoresizingMask” widthSizable =” YES” heightSizable =“ YES” / >标签 ,然后将adtranslatesAutoresizingMaskIntoConstraints =“ NO”属性添加到标签,因此它看起来像这样 现在您可以向表视图添加约束view 您可能会看到这种方法有些困难,但是尝试使用它,我相信您会发现它很容易而且值得拥有,并且当表视图如此复杂时,我相信这将是一个很好的选择。 希望这对您将来的项目有所帮助Thanks,谢谢

如何使用Appium在iOS中自动执行“共享”

在移动Web应用程序上工作时,曾想过自动共享链接或iOS中的图片。 假设您具有Appium的基础知识,让我们逐步完成如何通过Appium完成任务。 这是当您意识到需要找到元素定位器的另一种方法时。 这是识别和单击特定图标以实现目标所需遵循的步骤。 第一步是在浏览器屏幕上单击“共享”按钮,这是一个本地iOS元素,而不是Web元素。 您需要使用appium将应用上下文切换为NATIVE,然后找到元素“ Share”,否则,如果您在浏览器模式下打开了Safari,则最终将出现“ no_such_element_error”。 以下是将上下文切换到本机视图的代码段。 //从webView切换到本机视图 Set contextNames = driver.getContextHandles(); 对于(String contextName:contextNames){ 如果(contextName.contains(“ NATIVE”)) driver.context(contextName); } 下一步,找到您实际想要共享的应用程序的标识符,并使用appium inspector检查布局,您将在其中找到布局的可访问性ID,如下所示,然后按照以下步骤操作。 现在,在同时打开模拟器的情况下,单击“开始检查跟随点”按钮,然后将焦点放在要使用其标识符的元素上。 您将获得布局可及性ID和标签名称,这足以使您到达确切的元素。 现在,只需开始用您喜欢的语言编写代码即可自动完成上述情况的测试。 这是用Java编写的代码片段。 //找到并单击元素 driver.findElementByAccessibilityId(“ Share”)。click(); driver.findElementByAccessibilityId(“ ActivityListView”) .findElement(By.xpath(“ // * [包含( @ label,’Reminders’)]“))。click(); 到这里,最终代码看起来像 //从webView切换到本机视图 Set contextNames = driver.getContextHandles(); 对于(String contextName:contextNames){ 如果(contextName.contains(“ NATIVE”)) driver.context(contextName); } //找到并单击元素 driver.findElementByAccessibilityId(“ Share”)。click(); driver.findElementByAccessibilityId(“ ActivityListView”) .findElement(By.xpath(“ […]

iOS —使用自定义表格视图单元格创建表格视图控制器

在本教程中,您将学习如何创建自定义表格视图单元格并在表格视图中使用它。 我们将像下面的表格一样制作表格视图单元格,并在左侧添加标签,在右侧添加图片。 步骤1:开始一个新的Xcode项目 使用Swift创建一个单视图应用程序。 步骤2:创建一个表视图控制器 在ViewController.swift中 ,在添加表格视图单元之前,我们需要添加表格视图。 在添加我们的自定义单元格类之前,我们将使用默认单元格创建一个最小的表视图。 采用UITableViewDataSource协议和UITableViewDelegate协议。 创建一个表视图实例。 创建一个组数组以用于我们的单元格。 将表视图添加为子视图。 设置表视图的约束。 设置表视图实例的数据源和委托属性。 符合UITableViewDataSource协议。 从UITableViewDelegate协议中实现heightForRowAt方法。

作为iOS开发人员实习生的12周-第三周

我深入研究了Chris Eidhof的“ Advanced Swift”,Ray Wenderlich团队的“ RxSwift”,并开始在我的第一个大型应用程序屏幕上工作。 Advanced Swift使我对Swift语言的工作方式有了更好的了解。 例如,您可以遍历数组和字典的原因不是因为它们是数组和字典。 因为数组和字典符合Sequence协议,所以可以迭代数组和字典。 序列 -一系列相同类型的值,可让您遍历这些值 遍历序列的最常见方法是for循环 为了符合序列协议,请提供一个返回迭代器的makeIterator()方法 为了符合序列协议,必须实现返回迭代器的makeIterator方法。 迭代器-一次生成序列的值,并在遍历序列时跟踪其迭代状态(for循环) 当然,迭代器必须符合迭代器协议。

WWDC 2018’在Ardından

Merhabalar, Apple苹果4战车大战2018年WWDC比赛在derledim举行。 主题演讲视频izlemekiçin:https://www.apple.com/apple-events/june-2018/ EtkinliklepaylaşılanIstatistikler: 20m uygulamageliştirici。 Haftalık500 milyon应用程序商店ziyaretçisi。 Yazılımcılaraödenen100 milarar美元。 iOS 11版本:%81 iOS 12 —更快,响应速度更快—给您带来更多动力。 iOS 11升级到iOS 12版本。 表演者: Uygulamalarınaçılışhızında%40,klavyegörüntülemehızında%50,kamerauygulamasındaise%70oranındabirhızartışıolacak。 Ayrıca股票表%50’ye kadar birhızartışıyaşanacak。 Bu oranlara bakarsak,ciddi bir performansartışıbekleniyor。 CPU是uygulamaaksiyonların表演,并且是art,düşüreceği,innerjikullanımında,tasarrufsağlanacak。 AR: Apple ve Pixar格式和USD格式的USDZ duyuruldu。 SahneyeçıkanAdobe CTO’su Abhay Parasn​​is,保留所有格式。 度量衡,ARkapsamındayeni bir uygulama duyuruldu。 Bu uygulama ile herhangi bir objeninboyutlarınıölçebiliyorsunuz。 ARKit 2 duyuruldu veçokluoyuncudesteğiaçıklandı。 Buna birörnekuygulamagösterildi。 Uygulama […]

使用Alamofire的iOS上的MVCS

MVC(模型-视图-控制器支架)是软件工程界的一种设计模式,已经存在了很多年。 使您的代码在Model,View和Controller之间具有单独的层始终是一件好事。 在iOS World中,MVC是默认的设计模式,因为苹果公司自己在开发生态系统中推荐了这种设计模式。 当您的应用需要保存数据以保存到设备或与服务器进行交互的功能时,MVCS设计模式对您的代码很有用,因为它将“ S”层与“ C”层分开。 那么,什么是“ S”层? MVCS(MVC存储/服务)是一种设计模式,可将数据库或网络交互与控制器分开。 出现此模式是因为Controller处理了许多不同的事情,因此需要对其进行简化。 有人说MVCN(用于联网的N)。 我将向您展示该模式如何在使用Alamofire和SDWebImage的简单网络项目中应用。 分组 这就是我在MVCS设计模式中的项目分组文件夹的方式。 层数 MVCS包含一些不同的层及其职责,分别是模型,视图,控制器和存储/服务。 视图 视图表示如何将数据呈现到视图。 此案例的情节提要文件负责此层。 在这里,我创建一个简单的视图,其中包含UIImageView和两个UILabel以向用户显示。 另外,将其连接到ViewController,以便我们可以通过代码与视图组件进行交互。 模型 我们将通过此链接获取JSON API,并将数据转换为该模型。 在这里,我使用quicktype.io从JSON API快速创建模型。 您可以在此处查看我的完整代码。 结论 MVCS是分离逻辑的一种很好的设计模式,因为每个组件都有自己的职责,但是MVC或MVCS并不总是正确的。 这取决于您的应用程序。 使用此模式,简单的应用会很好。 如果您的应用程序规模更大,我认为是时候转向另一种设计模式,例如MVVM(Model-View-ViewModel)或VIPER(View-Interactor-Presenter-Entity-Router)。

是否需要测量延迟和口形同步? 现在有一个应用程序!

如果您在某个时候从事任何类型的广播贡献路径或实时网络流工作,则将要同时检查延迟和口型同步。 在这种情况下, 延迟是指音频和视频经过压缩,编码,从发送端到接收端传输以及解码和解压缩后要花多长时间才能显示在屏幕,PC监视器或移动设备上。 有时称为“玻璃到玻璃延迟”,其中所讨论的玻璃是一端的相机镜头,另一端是您正在查看的显示器。 出于很多原因知道这一点很有用,但主要是这样,您可以准确地预测何时有人提示正在直播的节目。 这样一来,您就可以避免在开始实时捐款时出现长时间的停顿。 Lipsync正是您所期望的-当有人在视觉上讲话时,音频与视频同步吗? 他们的嘴唇在正确​​的时间运动吗? 观看口型同步何时结束是非常不受欢迎的,所以有一种简单的方法来检查它很有帮助。 有专门用于测量口型同步的专业广播产品。 它们工作得很好,但非常昂贵(一个链接的费用超过200英镑),因此它们的使用仅限于昂贵的广播设置,并且确保贡献链接结尾的每个人都拥有一个是不切实际的。 但是,请继续阅读,以了解仅使用iOS应用程序,如何以一种粗略而现成的方式(尽管在每秒精度的1/60之内)测量口型同步! CAVEAT:这些技术比仅仅试图“盯上眼球”要好得多,但是,如果您实际上是为大型广播用途而这样做,那么它们并不能代替适当的专业工具。 有一个应用程序! 所以,这是应用程序: CompuLabs的原子钟(Gorgy计时) 它的价格为2英镑,由MarkusGömmel开发 因此,首先,它是一个不错的时钟应用程序,可以模拟在世界各地的广播工作室和电视馆中发现的一些标志性时钟-您知道,带有数字和模拟扫描LED显示屏的时钟吗? 没有? 好。 继续… 其次,它使用NTP协议通过Internet同步到网络时间服务器,因此您知道该应用程序的所有正在运行的副本都已精确同步到某种荒谬的准确性水平。 这让我开始思考-如果该应用程序的所有副本都处于同步状态,那么这意味着在视频开始播放时(但在视频帧通过该帧时),文稿链接各端的副本都处于同步状态。链接将被冻结,并且过去的时间会非常短。 这就是我们要衡量的延迟。 最后,这款应用的价格仅为2英镑,其价格足够便宜,以至于每个可能位于捐款链接远端的人都可以默认将其安装在手机或平板电脑上,因此有机会找到有人将其举在相机前更高。 如何使用此应用测量延迟… 该应用程序已经非常适合使用我所谓的“两部iPhone和一个摄像头技术 ”来测量“玻璃到玻璃”延迟。 假定您已经具有类似于以下设置的内容: 偏远地区的专业相机。 一个IP编码器,能够将摄像机的视频和音频转换为数据,并将其流回到基础或云端。 您要测量其延迟的广播路径或IP / Internet连接。 合适的解码器和监视器,可以让您在解码后看到远程图像。 然后,您需要按以下方式部署智能手机(或平板电脑): iPhone 1运行Atomic Clock应用程序,并且必须位于“远端”,并且您要使用的摄像头指向它的实时流。 在本机上,您应打开“显示1/60秒”。 设置中第二个“视觉时钟样式”选项。 iPhone 2还运行Atomic Clock应用程序,并位于显示iPhone 1远程图像的电视或PC监视器旁边。再次,您应打开“显示1/60秒”。 设置的“视觉时钟样式”部分中的“选项”。 相机 (当然也可以是智能手机)只有一项工作-拍摄静态照片,其中包括监视器上智能手机1的图像和同一图像中智能手机2的实际屏幕。 您不一定非要这样,因为您可以盯着它看,但如果要精确,最好拍照。 拍摄照片时,它将显示捕获该视频帧的远端时间,以及接收,解码和显示该视频帧的近端时间。 通过从后者减去前者,您可以测量到延迟的1/60秒内。 当然,我跳过了有关世界不同地区不同帧率,可变延迟等的许多详细信息,因此您的确切结果可能会有所不同。 在确定结果之前,请记住这一点。 这是我捕获的一个示例:在这种情况下,我们使用的移动绑定编码器具有10秒的延迟设置(以使其能够恢复任何丢弃的数据包等),并且我们可以清楚地看到,远端恰好是11秒在本地端后面,因此两者之间有11秒的延迟。 现在,进行双向采访的时间很长,只有11秒,但这是我们在进行活动直播时设置的延迟时间的典型代表。 […]

iOS版Firefox Focus中的错误修复

大多数浏览器上的“私人浏览”并不全面,也不易于使用。 焦点是免费的,永远存在且始终在您身边的下一个级别的隐私-因为它得到了Mozilla的支持,Mozilla是为您的Web权利而战的非营利组织。 (摘自App Store中的应用说明) 它的功能之一是,如果您不想从Safari切换,仍然可以在Safari中使用Firefox Focus功能(请按照以下步骤操作)。 虫❌ 问题在于,使用前后导航后,URL栏中的搜索文本与实际搜索不匹配。 让我们来看一个例子: 搜索“监护人” 搜索“ mozilla” 按回 搜索“ firefox” 按回 搜索页面显示 “监护人”请求的结果,但URL栏包含“ mozilla”而不是“监护人”。 修复🔧 问题的作者在那里留下了注释,表明该问题可能存在于SearchHistoryUtils堆栈中。 它帮助我开始了对该问题的调查。 我找到了SearchHistoryUtils类,其中包含两个布尔属性。 isFromURLBar isNavigating 和四个功能: pushSearchToStack(with searchedText: String) —当用户发出新的搜索请求时,此函数将搜索推入堆栈。 pullSearchFromStack() -> String? —此函数不会从堆栈中弹出搜索,而是返回当前搜索文本(如果存在)的值。 goForward() —更新堆栈对象的isCurrentSearch值。 goBack() -与#3相同 当我分析代码时,我取消了pullSearchFromStack , goForward和goBack函数,因为它们并未真正处理堆栈更改。 因此,我开始调试pushSearchToStack函数。 我调试了几个测试用例,然后让我们看一下我的发现。 因此,我几乎重现了问题中描述的错误,然后发现了问题: 当最后一个搜索不是当前搜索(例如,在执行第一个“返回”用户操作后的堆栈中),并且用户进行了新搜索时,最后一个搜索不会被新搜索覆盖(请查看上表中的红线) )。 这就是为什么当用户返回时,URL Bar会采用旧的搜索文本,那时候甚至不应该将其放在堆栈中。 让我们看一下pushSearchToStack函数的一部分伪代码: 让我们分解上面的代码: 它声明一个空堆栈currentStack 。 它将currentStack的值设置为全局状态searchedHistory值的值。 然后,它遍历堆栈中的每个搜索,并将isCurrentSearch属性的值设置为false 。 […]

提取IPA文件和iOS应用程序的本地数据存储

本文介绍了将iOS应用程序的IPA和本地数据存储从iPhone / iPad提取到计算机上的物理磁盘的过程。 完成撰写后,您将能够从安全角度理解完成整个过程的重要性。 所需的先决条件是远程访问iPhone并了解iOS文件系统。 如果需要,请参阅我们之前的文章“了解iOS文件系统”。 让我们开始吧。 就像.APK文件被视为Android应用程序的安装文件一样,.IPA是iOS应用程序的打包文件。 区别在于,只能通过以下方法之一将.IPA文件安装在未越狱的iPhone上: 企业移动设备管理这需要Apple签署的全公司范围的证书。 通过侧面加载,即通过使用开发者的证书对应用进行签名并通过Xcode将其安装在设备上。 可以使用相同的证书安装数量有限的设备。 让我们看看如何提取从App Store安装的应用程序的IPA文件。 提取IPA文件的第一步是找到应用程序的“ .app目录”,该目录是应用程序的捆绑容器。 为此,我们将进入所需的应用程序目录。 现在,我们将尝试找到所需应用程序(例如Facebook)的.app目录。 这可以通过使用以下命令来完成: 屏幕快照中突出显示的文本是Facebook应用程序目录的名称。 请务必注意,.app目录的名称可能与应用程序的显示名称相同,也可能不同。 如果没有找到我们要查找的.app目录,我们可以简单地使用’ls *’,它将列出所有目录,然后我们可以进行手动搜索。 下一步是将.app目录复制到名称为 ‘Payload’的空目录。 如屏幕截图所示完成此操作。 现在,我们需要使用“ zip”实用程序将有效载荷目录压缩到任何所需的位置。 如果未安装“ zip”,则需要使用“ apt-get”进行安装。 安装“ zip”后,我们可以将zip压缩文件压缩并解压缩到我们的系统中。 我们应该将文件明确命名为“ .ipa”,以使其对进一步的分析,安装等有用。 为了在计算机上获取它,我们只需要使用scp或sftp即可,如屏幕截图所示。 为了提取本地数据存储,我们需要找出应用程序的数据容器的位置。 为此,我们必须首先了解以下几点: 在设备上首次启动该应用程序时,iOS将为该应用程序创建数据容器和捆绑容器。 在路径Library / Caches / Snapshots上,创建具有完全相同名称的目录。 因此,我们可以利用这一事实来定位应用程序的本地数据存储。 我们将以以下方式进行: 打开应用程序的Info.plist文件,然后搜索键“ Bundle Identifier”,如屏幕截图所示。 现在,我们需要在本地数据存储目录中搜索名称与CFBundleIdentifier相同的目录。 可以如图所示完成。 我们甚至可以优化搜索,如下所示。 可以使用Cydia的“ IPA Installer […]

我们在2016年发布的10篇最受欢迎的博客文章

从充分利用您的应用程序投资到备忘单,以选择最佳的移动消息渠道,我们过去一年的博客文章涵盖了很多领域。 根据我们的分析和读者反馈,我们将您从2016年以来最有用和最受欢迎的帖子汇总到一起。 希望您在这里找到今天可以使用的东西! 1)如何制作成功的应用程序:最大化您的投资的10个基本原则 是否需要知道如何构建一个可以在第一天为您和您的用户创造价值的应用程序? 这十个基本原理将帮助您从应用程序和开发投资中获得更多价值,并为成功做好准备。 提示一:为什么有人会下载您的应用程序? 要成功,您必须确保已确定自己的移动价值主张。>> 2)确保您的未来,我们的未来,每个人的未来都是开放的 我们今年推出了新的移动增长平台,引起了不小的轰动。 在此博客文章中,我们的工程副总裁Mike Herrick深入探讨了开放平台和开放渠道对Urban Airship客户的意义-以及为什么他对此感到非常兴奋。 迈克:“通过开放我们的核心平台组件,我们可以帮助企业解决当前存在或将来出现的任何渠道。” >> 3)移动消息速查表:每次都选择正确的移动消息通信渠道 曾经希望您有一个方便的清单来匹配要发送给具有正确的移动消息渠道的移动用户的消息吗? 现在您已经掌握了。 获取移动消息通道的清单。 >> 4)移动参与度循环:从入职到重新参与 对于移动营销人员而言,经典的“营销渠道”仍然有用吗? 在这篇文章中,Urban Airship产品营销高级总监Bill Schneider展示了移动营销如何有机会以一种新的,更有效的方式与客户互动。 Bill,“经典的营销渠道已死。 这是传统的广播营销时代的产物。 进入移动互动循环。” >> 5)关于手机钱包营销的十大常见问题解答 使用移动钱包通行证获取优惠券,会员卡,机票,登机证的客户数量继续呈指数增长。 在这篇文章中,我们回答了移动营销人员关于如何利用移动钱包机会以及制作和发送移动钱包通行证的基本要素的紧迫问题。 回答您的手机钱包问题。 >> 6)从移动应用用户获取转移到保留 应用程序参与度和应用程序保留率是在移动设备上成功的关键。 在这篇文章中,您将看到移动分析如何在确保您保持进度方面发挥关键作用。 获取三个有助于您更好地了解用户的指标,并利用自动化来更好地参与即时个性化消息传递。 >> 7)如何赚取推送通知参与:7个基本资源 选择加入推送通知的用户与应用的互动度提高了4倍-保留的退出率是选择退出的用户的2倍。 因此,选择加入非常重要。 从基准测试报告到案例研究,再到如何构建选择加入的“软询问”方法,这篇文章收集了我们关于获得更多选择加入的最佳想法。 >> 8)建立您的第一个移动营销策略 城市飞艇战略咨询主管Alyssa Meritt提出了建立有效的移动营销策略的三个基本原理-无论您从哪里开始。 Alyssa:“虽然不是每个企业都需要一个移动应用程序,但每个企业确实都需要一个移动营销策略。” >> 9)最佳移动通知共有的5件事 您的移动消息是否遵循最佳做法? 确保您发送的通知能够吸引用户的同时,达到并超过您的KPI的五个基本原则。 名单上的第一名:最好的通知使用户易于采取行动。 休息吧 >> […]