因此UIKit Framework Reference将UINavigationController描述为向用户展示数据和 View 的有效方法。但是,我对使用UINavigationController VS仅使用Segue之间的性能和可管理性差异感到好奇。
在某些情况下,一种情况比另一种情况更适合。我是编码的新手,但直觉上我想UINavigationController可以用来表示VC,每个VC都运行很多,用户平均在每个VC上花费很多时间,或者多个VC需要同时运行并保存数据。而且Segue更适合于单向VC进度或短期使用的低数据VC演示。这些假设是否正确?
实现UINavigationController的优点是什么?
最佳答案
这是Apple与Socket Spanner 的比较。导航 Controller 与Segue甚至都不是一个选择。他们没有扮演相同的角色。您可以在不使用segues的情况下使用导航 Controller 。您可以在有或没有导航 Controller 的情况下使用segues。UINavigationController是一种特定类型的 View Controller 。具体来说,它是为控制 View Controller 的导航堆栈而设计的。当用户向前浏览您的应用程序时,您可以将其他 View Controller 添加到此导航堆栈中(通过搜索或通过 View Controller 上可用的其他方法来呈现其他 View Controller )。同时,导航 Controller 允许您从堆栈中“弹出” Controller ,然后我们返回到上一个 View Controller 。
当我们将UINavigationController与事物进行比较时,我们应该将其与UITabBarController,UISplitViewController或UIPageViewController之类的事物进行比较。这些是其他类型的 View Controller ,用于控制用户浏览我们的应用程序的方式。
Segues作为一种从一个 View Controller 到达另一个 View Controller 的方法而存在。但是,我刚刚列出的各种 Controller 作为控制您 Controller 之间导航关系的一种方式而存在。
如果您使用 Storyboard 构建应用程序,我强烈建议您使用segues。是否使用导航 Controller 完全取决于您希望应用程序导航的工作方式。
也许有些图片可以使区分更加清楚?
展览A
在这里,我们有两个 View Controller 。没有导航 Controller ,什么也没有。只有两个普通 Controller 。 View Controller 之间带有箭头的线是segue。 segue定义了 View Controller 之间的关系,该关系使我们能够从左侧的 Controller 转到右侧的 Controller 。
展览B
在这里,我们有一个导航 Controller ,然后是两个 View Controller 。导航 Controller (最左边)和第一个 View Controller (中间)之间的线不是segue。但是,它确实定义了导航 Controller 和 View Controller 之间的关系。它将 View Controller 定义为导航 Controller 的根 View Controller 。每当我们显示此导航 Controller 时,它都会依次将这个 View Controller 显示为其导航堆栈中的第一个 Controller 。但是,第一 View Controller (中间)和第二 View Controller (最右边)之间的线是一条线。它与展览A的序号相同(但展览A可能是另一种类型的序号)。此设置定义了第一 View Controller 和第二 View Controller 之间的关系,并为我们提供了从第一 View Controller 转到第二 View Controller 的方法。
展览C
在这里,我们有一个标签栏 Controller (最左侧)和四个 View Controller 。我们还有更多的线路将这些东西连接起来。在导航 Controller 示例中,有很多行不是选项卡栏 Controller 和 View Controller 之间的线,而是它们确实定义了选项卡栏 Controller 和 View Controller 之间的关系。这些行将 View Controller 分配为选项卡栏 Controller 的viewControllers数组的一部分,该数组确定要显示的选项卡。但是,左 View Controller 和右 View Controller 之间的线是标记,与前两个示例完全相同。
segue只是在 Storyboard 上定义两个 View Controller 之间的导航关系的一种方式。如果您不使用 Storyboard ,那么您也根本不会使用segues,但是您仍然可以使应用程序以完全相同的方式导航(这可以在没有 Storyboard 和没有segue的情况下以编程方式实现。 (不要认为它会影响演出或其他演出)。
是否使用导航 Controller 是另一个问题,也是一个完全独立的问题。是否使用导航 Controller 与您是否正在使用segue不在同一范围内。使用导航 Controller 也不是性能的问题。使用导航 Controller 的开销非常小。它的大部分开销可能来自它添加的UI内容...但是,如果您想要该UI内容,则无论您是否具有导航 Controller ,都将产生该开销。
重要的是,是否使用segues并不是性能的问题-仅仅是您是否要使用 Storyboard 来设计应用程序的问题。同样重要的是,使用导航 Controller 不是性能问题,而是有关您希望应用程序的导航外观如何的问题。 “导航 Controller 对您的应用程序来说是正确的外观吗?”实际上,这是在决定是否使用导航 Controller 时必须回答的唯一问题。
关于ios - 功能差异,UINavigationController与仅Storyboard Segue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29359037/
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建
在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine
作为RubyonRails新手,我明白“@”和“:”引用有不同的含义。我看到了thispost在SO中,其中描述了一些差异。@表示实例变量(例如@my_selection):表示别名(例如:my_selection)我遇到了一个情况,我有一个标准的MVC页面,类似于我的网络应用程序中的所有其他表单/页面。html.erb片段route.rb片段resources:my_selections当我尝试访问此页面时,出现此错误:NoMethodErrorinselections#createShowingC:/somedir/myapp/app/views/my_selections/ind
require'pp'p*1..10这会打印出1-10。为什么这么简洁?您还可以用它做什么? 最佳答案 它是“splat”运算符。它可用于分解数组和范围并在赋值期间收集值。这里收集赋值中的值:a,*b=1,2,3,4=>a=1b=[2,3,4]在此示例中,内部数组([3,4])中的值被分解并收集到包含数组中:a=[1,2,*[3,4]]=>a=[1,2,3,4]您可以定义将参数收集到数组中的函数:deffoo(*args)pargsendfoo(1,2,"three",4)=>[1,2,"three",4]